2012-04-23 38 views
3

我只是想知道爲什麼下面的代碼無法正常工作(請記住,我設置age爲可以爲空):C#.NET不能分配空給一個變量中內嵌if語句

myEmployee.age = conditionMet ? someNumber : null; 

然而,以下工作正常:

if(conditionMet) 
{ 
    myEmployee.age = someNumber; 
} 
else 
{ 
    myEmployee.age = null; 
} 

我爲什麼不能設置爲null在條件操作的價值?我的代碼中的所有這些if語句都不好。

謝謝。

+3

請定義_code不工作_。 – jrummell 2012-04-23 15:15:42

+0

[有條件的運算符賦值可能爲類型?](http:// stackoverflow。com/questions/75746/conditional-operator-assignment-with-nullablevalue-types) – 2012-04-23 15:16:17

+1

請注意 - 這不是'內聯if';它是*條件運算符*。 「if」語句是語句(即沒有值);條件運算符'?:'是一個表達式(因此爲什麼你有這個問題,因爲這些類型必須是相同或隱式可轉換的)。 – 2012-04-23 15:16:34

回答

14

雙方的類型必須是相同的(或可隱式轉換):

myEmployee.age = conditionMet ? someNumber : (int?)null; 

docs

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

+0

+1,在這種情況下,* true-expr *和* false-expr *的三元運算符規則也在其中起作用。 – user7116 2012-04-23 15:16:15

+0

你之所以選擇'null'而不是'(int?)someNumber'?你覺得更可讀嗎?我只問,因爲你和RedFilter都選擇了同一面。 – Marc 2012-04-23 15:18:13

+0

兩種都是可能的 - 我個人覺得這種方式更容易閱讀,但這只是個人偏好。 – BrokenGlass 2012-04-23 15:19:45

8

可以,只是清楚的類型null應該被解釋爲:在什麼文件不得不說

myEmployee.age = conditionMet ? someNumber : (int?)null; 
2

看:

[MSDN]爲默認值可空類型變量將HasValue設置爲false。值是未定義的。

默認值是null。這意味着你可以簡單地做:

if (conditionMet) 
    myEmployee.age = someNumber; 

有沒有必要更晦澀的代碼語法。


如果需要,您可以事先與null初始化它,如果它在某種程度上是不是默認的,就像這樣:

myEmployee.age = null; 

if (conditionMet) 
    myEmployee.age = someNumber; 
0

類型三元語句的部分必須是隱式強制轉換一個共同的基礎。在intnull的情況下,它們不是。您可以通過製作age a Nullable<int>(或int?)並將someNumber轉換爲int?來解決此問題。

編輯澄清:您可以設置值爲null與正確的鑄造三元語句。這裏的問題不是你試圖用三元語句將值設置爲null。這就是說,三元語句中涉及的兩個表達式的編譯器推斷返回類型不能隱含地轉換爲公共基類型。

+0

你錯過了我想的問題的最後一行。 – 2012-04-23 15:18:05

+0

@TomWijsman:更新了答案以澄清我的意思。 – 2012-04-23 15:20:27