Visual C# 2005 - 讀者的問題與解答

摘要:Visual C# 2005 - 讀者的問題與解答

原本的問題 

學習中有段程式不明白,看看?
namespace Ch05Ex02
{
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}

class Program
{
static void Main(string[] args)
{
byte directionByte;
string directionString;
orientation myDirection = orientation.north;
Console.WriteLine("myDirection = {0}", myDirection);
Console.ReadKey();
}
}
}
認為應該輸出的是"1"什麼是"north"?
還是就是變數型別的轉換,是否有必要刻意去? 

 

 

親愛的讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下。

首先,根據Visual C#針對enum關鍵字,也就是使用列舉型別的規定,如果希望將enum 型別變數轉換成其他型別(例如您範例中的Byte型別)變數,則需要明確的型別轉換。因為Console.WriteLine函式所使用的myDirection變數是列舉型別而非Byte型別,自然就會產生您描述的程式執行結果。

為瞭解決這個問題,只要將原本的列舉型別變數強制轉換為Byte型別即可,程式碼如下所列:

byte NewmyDirection = (byte)orientation.north;

Console.WriteLine("myDirection = {0}", NewmyDirection);

接下來,關於轉換型別的部分要說明的是,C#語言的型別轉換分作隱含轉型跟明確轉型兩種,差別在於是否需要明確型別轉換(Cast)。隱含轉型簡單來說就是.Net Framework會自動處理轉型的動作,不需要額外撰寫程式處理。如下所示者為常用的隱含數值轉換,自動從數值範圍小的型別轉換為範圍較大的型別: 

q   sbyte 轉換成 shortintlongfloatdouble  decimal

q   byte 轉換成 shortushortintuintlongulongfloatdouble  decimal

q   short 轉換成 intlongfloatdouble  decimal

q   ushort 轉換成 intuintlongulongfloatdouble  decimal

q   int 轉換成 longfloatdouble  decimal

q   uint 轉換成 longulongfloatdouble  decimal

q   long 轉換成 floatdouble  decimal

q   ulong 轉換成 floatdouble  decimal

q   char 轉換成 ushortintuintlongulongfloatdouble  decimal

q   float 轉換成 double 

明確轉型跟隱含轉型最大的不同點就在於,明確轉型需要指定型別轉換運算子(自行定義或者是.Net Framework內建的),自行組成型別轉換運算式來進行人為介入的型別轉換,像是先前將列舉型別轉換為Byte型別所使用的程式碼byte NewmyDirection = (byte)orientation.north;即為一例。

基本上建議您至少先閱讀過C#語言規格對於型別轉換的規定,有了基本的概念之後,配合程式實作與Visual Studio 2005整合式開發環境的IntelliSense功能、除錯功能與自動完成功能,將能達到事半功倍的效果。

章立民研究室 2007/1/22