2014-01-08 97 views
1

爲什麼以及是如何工作的下面的代碼動態與三元運營商

dynamic x = (c== 'a') ? new D1() :x= new D2(); 

但不是這個

dynamic x = (c== 'a') ? new D1() : new D2(); 

代碼

class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = Console.ReadKey().KeyChar; 
      dynamic x = (c== 'a') ? new D1() :x= new D2(); 
      x.Print(); 
      Console.ReadKey(); 
     } 
    }  
    class D1 
    { 
     public void Print() 
     { 
      Console.WriteLine("D1"); 
     } 
    } 
    class D2 
    { 
     public void Print() 
     { 
      Console.WriteLine("D2"); 
     } 
    } 
+1

你得到了什麼錯誤?至少我會嘗試添加一些括號,以使代碼更具可讀性。 – PMF

回答

3

這無關動態。這是因爲在你的情況下,返回類型與Else不同。

如果您改爲寫此語句,您仍然會得到相同的錯誤。

var x = (c == 'a') ? new D1() : new D2(); 

但是,如果您編寫以下代碼,您將成功。

var c = 'd'; 
int a = 5; 
decimal d = 6m; 
decimal x = (c == 'a') ? a : d; 

如果你看看你得到的錯誤,它會告訴你同樣的事情。

條件表達式類型不能確定,因爲沒有 'D1' 之間的隱式轉換 'D2'

Ternary Operator

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