10
([MyCustomAttribute(...)] param1, param2) =>
{
    ...

其中 param1 是 Type1 而 param2 是 Type2

在我看来,这与

private void method blah([MyCustomAttribute(...)] Type1 param1, Type2 param2)
{
    ...

但是 C# 编译器不允许第一个版本。为什么?这是另一个时间与精力/回报的事情吗?这不是很矛盾吗?

4

1 回答 1

8

为什么?

正如我喜欢指出的那样,语言设计团队不必为不做某项功能提供理由。相反,想要功能的人必须证明它们的合理性。

如果您要问一个更有针对性的问题,而不是一个模糊的“为什么?” 你可能会问:

如果我要向 C# 设计团队推销这个特性,他们会发现什么问题?

C# 语言中完全没有要求将 lambda 实现为类的方法。

首先,它们可能是表达式树,在这种情况下,在那里有一个属性有什么意义?其次,不需要lambda 实现为编译器生成的闭包类的方法,这意味着甚至不需要参数列表是您可以明智地放置元数据的东西。属性是程序元数据的一部分,人们通常不会认为浏览编译器生成的类型以使用它们的元数据是一件明智的事情。

例如,表达式 lambda 的一个奇怪但完全可行的实现是始终生成表达式树,然后如果结果不是表达式树 lambda,则生成Compile对另一端的调用。没有元数据,所以没有地方放置属性。

这会很奇怪,但是 C# 语言经过精心设计,因此 lambda 等某些功能不会将编译器编写者限制为特定的实现。

这是另一个时间与精力/回报的事情吗?

是的。

有没有人这么想,然后说,不!?

据我所知不是。

正如我经常指出的那样,为了实现一项功能,必须考虑. 据我所知,您是第一个认为 lambda 参数上的属性是个好主意的人。没有想到的想法不会被设计、实施、测试、记录或交付。

这不是很矛盾吗?

我想是这样。

于 2013-05-16T03:24:29.153 回答