gpt4 book ai didi

c# - 为什么编译器必须知道一个 lambda 的类型?

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:35 26 4
gpt4 key购买 nike

这段代码不容易阅读,很抱歉,但出于我的兴趣,为什么编译器必须知道 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 Type of conditional expression cannot be determined because there is no implicit conversion between 'lambda expression' and 'lambda expression'

最佳答案

因为 .NET 中没有委托(delegate)等价:您可以有两个具有相同签名的委托(delegate),例如

delegate void MyDelegate1()

delegate void MyDelegate2()

但是您不能将一个代表分配给另一个……您不能:

MyDelegate1 del1 = null;
MyDelegate2 del2 = del1;

它们是截然不同且不兼容的委托(delegate)类型。它们仅从“人类”的角度来看是“相似的”,而不是从 .NET 的编译器的角度来看。

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

关于c# - 为什么编译器必须知道一个 lambda 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43893249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com