2017-05-10 53 views
1

这段代码不容易阅读,对不起,但为了我的兴趣,为什么编译器必须知道lambda的类型。让我们看看代码,不用担心,它不是真正的代码。为什么编译器必须知道一个lambda的类型?

bool b1 = true, b2, b3; 
Action action =() => Console.WriteLine("Hello"); 
(b1 ?() => 
    { 
    b2 = true; 
    b3 = false; 
    } : action)(); 

这很有效。但是...

为什么我不能这样做?

bool b1 = true, b2, b3; 
(b1 ?() => 
    { 
    b2 = true; 
    b3 = false; 
    } :() => Console.WriteLine("Hello"))(); 

能否请你解释一下,在这种情况下,编译器必须知道明确的类型的函数(在这种情况下Action)?

VS2017告诉我....不能确定

条件表达式CS0173类型,因为 有 'lambda表达式' 和 'lambda表达式'

+1

作为结果得到什么?如果这是一个编译器错误,你应该提及它 –

+0

我错了吗?或者'()=> {}'也可以是'Func <>'? (我认为可能是什么原因) –

回答

4

之间的隐式转换因为在.NET中没有委托等价关系:可以有两个具有相同签名的代表,如

delegate void MyDelegate1() 

delegate void MyDelegate2() 

,但你不能在一个委托分配给其他的...你不能:

MyDelegate1 del1 = null; 
MyDelegate2 del2 = del1; 

它们是不同的和不兼容的委托类型。它们只从“人”的角度来看是“相似的”,而不是从.NET编译器的角度来看。

很明显,如果委托的确切“类型”(而不仅仅是它的签名)在.NET中很重要,那么.NET不能“解析”它。在第一个示例中,编译器可以看到委托类型为Action,因此可以推断出() => { ... }Action。在第二个例子中,编译器没有这个“提示”。

相关问题