摘要: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 轉換成 short、int、long、float、double 或 decimal。
q 從 byte 轉換成 short、ushort、int、uint、long、ulong、float、double 或 decimal。
q 從 short 轉換成 int、long、float、double 或 decimal。
q 從 ushort 轉換成 int、uint、long、ulong、float、double 或 decimal。
q 從 int 轉換成 long、float、double 或 decimal。
q 從 uint 轉換成 long、ulong、float、double 或 decimal。
q 從 long 轉換成 float、double 或 decimal。
q 從 ulong 轉換成 float、double 或 decimal。
q 從 char 轉換成 ushort、int、uint、long、ulong、float、double 或 decimal。
q 從 float 轉換成 double。
明確轉型跟隱含轉型最大的不同點就在於,明確轉型需要指定型別轉換運算子(自行定義或者是.Net Framework內建的),自行組成型別轉換運算式來進行人為介入的型別轉換,像是先前將列舉型別轉換為Byte型別所使用的程式碼byte NewmyDirection = (byte)orientation.north;即為一例。
基本上建議您至少先閱讀過C#語言規格對於型別轉換的規定,有了基本的概念之後,配合程式實作與Visual Studio 2005整合式開發環境的IntelliSense功能、除錯功能與自動完成功能,將能達到事半功倍的效果。
章立民研究室