动态与三元运算符

时间:2014-01-08 12:25:38

标签: c# c#-4.0 dynamic

为什么以及如何在以下代码中使用

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 个答案:

答案 0 :(得分: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的类型必须是   相同,或者必须存在从一种类型到另一种类型的隐式转换。