2014-01-08 100 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的类型必须是 相同,否则必须存在从一种类型到另一种类型的隐式转换。