2010-09-15 38 views
3

可能重複:
Type result with Ternary operator in C#下的財產#返回值可以爲空

我碰到了這種情況,並且似乎沒有要回一個自然的方式可空的int。下面的代碼給出了編譯錯誤,因爲三元運算符不喜歡null。

public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? rv : null; 
    } 
} 

所以,你(或只是我)真的得走一路拼了這一切:

public int? userId 
{ 
    get 
    { 
     int id; 
     if(int.TryParse(userIdString, out id)){ 
      return id; 
     } 
     return null; 
    } 
} 

編輯:是否有實例可爲空的更自然的方式,使三元操作員工作?

+0

我這樣做,當我覺得答案引腳指出我的問題。雖然我經常問不好但含糊不清的答案。 – Haoest 2010-09-15 19:37:34

回答

10
public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? (int?)rv : null; 
    } 
} 
+0

+1輸入速度比我快! :P – 2010-09-15 19:20:14

+0

但顯然,有人不喜歡這個答案---我得到了投票(但看起來他也打了你) – 2010-09-15 19:24:09

+0

是的......我剛剛學會了忽略倒票巨魔.. – 2010-09-15 19:27:37

1

您在同一個表達式中返回(不可爲空)int或null。你需要在你的三元表達式中明確地返回一個int?以便工作。

4
public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? (int?)rv : null; 
    } 
} 
3

編輯:我沒有仔細讀過這個問題;問題不在於條件運算符不喜歡空值 - 而是它需要知道表達式的整體類型應該是什麼......並且該類型必須是的類型左側,右側。 null本身是一個可以轉換爲多種類型的無類型表達式; int是一個完全有效的類型,但它是其中null不能將轉換成的類型之一。您可以將右側明確地指定爲int?,並從左側獲得intint?的隱式轉換,您可以在左側執行轉換,並獲得隱式轉換,您可以從左側執行nullint?

我的回答是喜歡詹姆斯的,但鑄造空來代替:

public int? userId 
{ 
    get 
    { 
     int rv; 
     return int.TryParse(userIdString, out rv) ? rv : (int?) null; 
    } 
} 

這是爲了強調它的不是空引用;它是一個空值int?。在那一點上,int rv的轉換是顯而易見的。

有沿着相同的路線其他兩種選擇,雖然考慮:

return int.TryParse(userIdString, out rv) ? rv : new int?(); 

return int.TryParse(userIdString, out rv) ? rv : default(int?); 

我個人認爲,「鑄造空」是最好的形式,但可以彌補自己的心態。

另一種方法是有一個通用的靜態方法:

public static class Null 
{ 
    public static T? For<T>() where T : struct 
    { 
     return default(T?); 
    } 
} 

寫:

return int.TryParse(userIdString, out rv) ? rv : Null.For<int>(); 

我不認爲我真的很喜歡,但我提供它爲你的檢查: )

+0

我喜歡這裏的深入方法......問題是:編譯器或開發人員是否將null轉換爲'int?'? – 2010-09-15 19:58:06

+0

@ md5sum:兩者...沒有它,編譯器將不知道整體條件表達式使用哪種類型。 – 2010-09-15 20:01:39

+0

@ md5sum,當給出'布爾? int:null',編譯器不會跳躍說* *都可以轉換爲'int?'。它會讓其中一個跳躍,並說'int'可以是'int?'或'null'可以是'int?',但是你需要在編譯器的大腦中放置'int?'建議,這樣說。 – 2010-09-15 20:14:09