2013-08-28 28 views
4

?: Operator (C# Reference)條件運算符返回類型與文字數字

要麼first_expression和second_expression的類型必須是 相同,或隱式轉換必須存在從一種類型到另一個。

Integer literals

如果文字沒有後綴,它具有第一這些類型的,其中 其值可以表示的:整數,UINT,長,ULONG。

考慮:

var value = test ? (Int64)1 : 0; 

0,一個十進制數字面沒有後綴將被轉化爲intint可以隱式轉換爲Int64。由於此轉換隻發生在一個方向上,因此我們可以感覺到返回值將是Int64。

然而:

var value = test ? (UInt64)1 : 0; 

UInt64int不能隱式相互轉化,但還沒有這個代碼編譯和運行以及所產生的類型是UInt64

什麼時候確定了0的類型?

如果這兩種類型可以隱式地相互轉換,那麼您最終會選擇哪種類型? (我不認爲這通常發生,但用戶生成的類可以實現這樣的鑄造。)

以前的研究:
我發現有類似標題的幾個其他問題,但他們都與空或空類型。

相關性: 這在我的代碼中很重要,因爲我們立即將此結果傳遞給ByteWriter.Write,並希望以寫入正確字節數的正確過載結束。這些例子當然是非常簡單的。

替代語法,使得結果明確可能爲清晰起見,最好選擇無論什麼是真正發生的事情沒有明確的轉換:

var value = test ? (UInt64)1 : (UInt64)0; 

回答

3

請注意,當數字爲編譯時常量(文字)時,整數類型之間存在一組隱式轉換,而當它們不是常量時,會有另一組轉換。

你的有趣的例子是:

var value = test ? (UInt64)1 : 0; 

其也可以寫成:

var value = test ? 1ul : 0; 

其中ul後綴裝置ulong,即System.UInt64

當文字(常量)被用於確實存在的隱式轉換從intSystem.Int32)至ulong,但僅當int恆定是非負的。這真的是相同的:

const ulong a = 1ul; 
const int b = 0; 
var value = test ? a : b; // also works fine 

它的工作原理,正如我所說的,因爲從int隱含常數轉換(因爲編譯器知道b不爲負),以ulong

現在,帶走const獲得:

ulong a = 1ul; 
int b = 0; 
var value = test ? a : b; // compile-time error, no implicit conversion in either direction! 

我們看到,與非常量,在任一方向不存在隱式轉換,所以沒有最好的常見類型ab和失敗。

1

誠然,一個通用int不能被隱式轉換爲UInt任何長度。但在這裏我們不是在談論一個通用的,未知的int。我們正在談論0,它可以被轉換(即使在編譯時,這是我懷疑編譯器正在做的)到UInt

我建議你使用int參數(或編譯器無法通過數據流分析推斷的另一個值)並查看會發生什麼。

+0

我遇到了一些問題之前,如果一個值是一個常量,我懷疑這是相關的,但嚴格通過引用的文檔,這不應該工作。 –

+3

@DeniseSkidmore這是重要的,如果它是不變的。要引用的文檔是* [隱式常量表達式轉換](http://msdn.microsoft.com/zh-cn/library/aa691286.aspx)*。請注意,通過第一個項目符號'int' ***可以隱式地(使用常量)轉換爲'ulong'。 –

相關問題