2011-07-01 69 views
2
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class User 
    { 
     public int? Age { get; set; } 
     public int? ID { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      User user = new User(); 
      user.Age = null;  // no warning or error 
      user.ID = (int?)null; // no warning or error 

      string result = string.Empty; 
      User user2 = new User 
          { 
       Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result), 
       // Error 1 Type of conditional expression cannot be determined 
       // because there is no implicit conversion between '<null>' and 'int' 
       // ConsoleApplication1\ConsoleApplication1\Program.cs 23 71 ConsoleApplication1 

       ID = string.IsNullOrEmpty(result) ? (int?)null : Int32.Parse(result) // // no warning or error 
          }; 
     } 
    } 
} 

問:爲什麼在採用對象初始值設定項時使用(int?)null?

爲什麼下面的行不行?

Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result) 

//糾正一個是

Age = string.IsNullOrEmpty(result) ? (int?) null : Int32.Parse(result) 

爲什麼下面這行工作?

user.Age = null;  // no warning or error 
+0

查看http://stackoverflow.com/questions/1171717 –

回答

3
Age = string.IsNullOrEmpty(result) ? null : Int32.Parse(result) 

不工作,因爲string.IsNullOrEmpty(result) ? null : Int32.Parse(result)Age =部分分別進行評估。

編譯器無法弄清楚string.IsNullOrEmpty(result) ? null : Int32.Parse(result)應該是什麼類型。

它首先看到null這表明它是一個引用類型,它看到一個int這是一個似乎不兼容的值類型。編譯器不會推斷存在帶有從intint?的隱式投式運算符的類型。

它理論上可以有足夠的信息來解決它,但編譯器需要更復雜。

2

因爲C#強制每個表達式必須有一個類型。編譯器無法確定非工作行中的三元表達式的類型。

6

它是因爲三元運算符需要返回類型是相同的類型。

在第一種情況下,「null」可能是任何引用類型的null(不僅僅是int?),所以爲了明確它需要編譯的編譯器。

否則你可以有

string x = null; 
Age = string.IsNullOrEmpty(result) ? x: Int32.Parse(result) 

這顯然是有點cuckooo。

2

? :如果由於兩個參數是nullint而導致運算符不知道要返回哪種類型,則會內聯。由於int不能爲空,因此編譯器無法解析由?:返回的類型。

相關問題