2012-04-04 127 views
-1
int? _fileControlNo = null; 
    public int? FileControlNo 
    { 
     get { return _fileControlNo; } 
     set { _fileControlNo = value; } 
    } 

當我將空值賦給上述屬性時,出現語法錯誤。爲什麼如果我能夠使用可空類型的值類型的對象設置爲空值,則會出現錯誤給我什麼是C#中的可空類型?

objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? null : Convert.ToInt32(sArrElements.Value(3)); 

請,任何人都可以解釋。

+3

請告訴我確切的錯誤信息? – 2012-04-04 11:39:36

+2

什麼是錯誤,什麼是sArrElements? – Justin 2012-04-04 11:39:49

+0

錯誤消息,我猜是'條件表達式的類型不能確定,因爲''和'int'之間沒有隱式轉換'\t' – 2012-04-04 11:44:11

回答

8

條件運算符的結果需要是可以隱式轉換到對方的相同類型或類型。

在你的情況下,你有一個nullInt32 - 這些違反了這一要求。

如果不是一個Int32返回一個可空Int32,該null可以隱式轉換到這種類型的,你的代碼將工作(或者,鑄nullint?)。

2

投下你nullint?

objDPRUtils.FileControlNo =sArrElements.Value(3)==null ? (int?) null : Convert.ToInt32(sArrElements.Value(3)); 
0

嘗試直接分配是這樣的:

objDPRUtils.FileControlNo =sArrElements.Value(3); 
0

可空類型是他們說什麼,他們是:還可以存儲一個空值簡單的值類型。
我建議你根本不需要最後一行代碼。你應該能夠逃脫:

objDPRUtils.FileControlNo =sArrElements.Value(3); 

如果你真的想在無效的情況下,指定其他值,使用空合併運算符?

objDPRUtils.FileControlNo =sArrElements.Value(3)??0; 

在這種情況下,將在右手側是空的情況下,分配0值到FileControlNo

0

您的代碼混合類型null和Int32不能混合在這種情況下。他們需要是同一類型的。

如果使用int.TryParse只有嘗試設置成功,您將獲得相同的結果,並且可以使用HasValue場上,以確定是否值其空或不是這類型如何可空,通常使用

傻例如

class Program 
{ 
    private static int? _fileControlNo; 

    static void Main(string[] args) 
    { 
     string[] sArrElements = new string[] { "1", "2", "3", null }; 

     int result; 
     if (int.TryParse(sArrElements[3], out result)) 
     { 
      FileControlNo = result; 
     } 


     if (_fileControlNo.HasValue) 
     { 
      // do something here 
     } 
    } 

    public static int? FileControlNo 
    { 
     get { return _fileControlNo; } 
     set { _fileControlNo = value; } 
    } 

} 

你會注意到,你的測試代碼裏面的HasValue在這種情況下,將永遠不會執行,因爲_fileControlNo不能設置,因爲的TryParse總是失敗(更改索引,這將改變)。

1

有條件的運營商是否需要同樣類型的無法和你的情況爲null

返回結果這應該工作

sArrElements.Value(3)==null ? (int?)null : Convert.ToInt32(sArrElements.Value(3));