gpt4 book ai didi

c# - 为什么匿名委托(delegate)/lambda 不推断 out/ref 参数的类型?

转载 作者:可可西里 更新时间:2023-11-01 03:09:00 25 4
gpt4 key购买 nike

StackOverflow 上的几个 C# 问题询问如何使用 outref 参数制作匿名委托(delegate)/lambda。参见,例如:

为此,您只需指定参数的类型,如:

public void delegate D(out T p);
// ...
D a = (out T t) => { ... }; // Lambda syntax.
D b = delegate(out T t) { ... }; // Anonymous delegate syntax.

我很好奇的是为什么明确需要该类型。出现这种情况是否有特殊原因?也就是说,从编译器/语言的角度来看,为什么不允许以下内容?

D a = (out t) => { ... };      // Lambda syntax -- implicit typing.
D b = delegate(out t) { ... }; // Anonymous delegate syntax -- implicit typing.

或者更好的是:

D a = (t) => { ... };      // Lambda syntax -- implicit typing and ref|out-ness.
D b = delegate(t) { ... }; // Anonymous delegate syntax -- implicit typing and ref|out-ness.

最佳答案

有趣的问题。

首先,考虑匿名方法和 lambda 之间的区别。从编译器编写者的角度来看,最重要的区别是 lambda 可以要求编译器从 lambda 分配给的目标推断参数的类型; C# 2 匿名方法没有这个特性。此功能看似很小的差异,但实际上它对编译器的实现有重大影响。请参阅我关于此主题的博客系列,了解为什么会这样:

http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx

那么现在让我们来谈谈您的实际问题:为什么我们不能从目标类型推断出 lambda 参数的一致性/引用性。也就是说,如果我们有委托(delegate) void D(out int x) 那么肯定 D d = x=> { x = 10; } 可以推断 x 是“out int”。

我知道我们不能这样做的原因不是技术原因。在编译器内部,out/ref 类型被表示为与任何其他类型一样的类型。

但是,功能不会因为可以完成而完成;他们之所以完成,是因为有令人信服的理由。对于 lambda,进行类型推断的首要原因是 LINQ;我们希望能够对查询理解进行简单的句法转换,将其转换为使用 lambda 的方法调用,并让方法类型推理引擎计算出所有 lambda 参数的类型。 生成的所有 LINQ 方法都没有带 out 或 ref 参数的委托(delegate)。

因此,我们没有令人信服的理由来执行此功能。具有 out/ref 参数的委托(delegate)相对较少。将 lambda 赋值给这些委托(delegate)的情况更加罕见。所以这是我们不需要的功能,几乎没有人受益。

C# 3 是 Visual Studio 计划中的“长杆”;在 VS 中交付组件的任何团队中,我们安排的工作天数最多。这意味着我们每推迟一天的日程安排,整个部门都会推迟。这是对将时间花在对任何人都没有好处的不必要功能上的强烈抑制。所以工作从未完成。

我同意在这里更加一致会很好,但这不太可能发生。我们有许多更高的优先级。

关于c# - 为什么匿名委托(delegate)/lambda 不推断 out/ref 参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990592/

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