C# 匿名lambda的参数上的自定义属性

C# 匿名lambda的参数上的自定义属性,c#,C#,其中,param1是Type1,param2是Type2 在我看来,这与 ([MyCustomAttribute(...)] param1, param2) => { ... 但是C#编译器不允许使用第一个版本。为什么?这是另一个吗?这不是很矛盾吗 为什么? 正如我喜欢指出的,语言设计团队不必为不做特性提供理由。相反,想要特性的人必须证明它们的合理性 如果你要问一个更有针对性的问题,而不是含糊不清的“为什么?”你可能会问: 如果我向C#设计团队介绍这个特性,他们会发现它有什么问题

其中,param1是Type1,param2是Type2

在我看来,这与

([MyCustomAttribute(...)] param1, param2) =>
{
    ...
但是C#编译器不允许使用第一个版本。为什么?这是另一个吗?这不是很矛盾吗

为什么?

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

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

如果我向C#设计团队介绍这个特性,他们会发现它有什么问题

在C语言中根本不要求lambda作为类的方法来实现

首先,它们可能是表达式树,在这种情况下,有属性有什么意义?第二,不要求lambda实现为编译器生成的闭包类的方法,这意味着不要求参数列表是可以合理放置元数据的内容。属性是程序元数据的一部分,人们通常不会认为浏览编译器生成的类型来使用它们的元数据是明智的做法

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

这可能会很奇怪,但C语言经过精心设计,因此某些特性(如lambdas)不会将编译器编写器限制在特定的实现中

这是另一种时间与努力/回报的对比吗

有没有人这样想,然后说:啊

据我所知不是这样

正如我经常指出的,为了实现一个特性,必须考虑它。据我所知,您是第一个认为lambda参数上的属性是个好主意的人。未被考虑的想法不会被设计、实施、测试、记录或发布

这不是很矛盾吗


我想是这样。

出于好奇,为什么需要在匿名方法上赋予参数属性?我需要(键入)注释其中一个参数,它是一个非类型化的非托管内存块,但实际上可能是float[],float2[],float4[]等。在我的代码的其他地方,此类型注释用于单元测试和数据转储(以人类可读的格式).你最好只是制定一个具体的方法,而不是匿名的方法。是的,这是我的工作。但我很好奇,为什么表面上如此等价的东西会在C#编译器中被破坏。这是一个bug吗?有人这样想吗?谢谢你的回答。请注意我模糊的“为什么”基于这样一个假设,即有一个深刻、黑暗和神秘的原因,类似的东西被省略了。如果没有这个原因,“如果我向C#设计团队介绍这个功能,他们会认为它有什么问题?”可能更合适。我将在Microsoft Connect网站上以错误/功能请求的形式提交此请求。再次感谢!我最近遇到一种情况,如果能够使用方法级属性装饰lambda,将非常有帮助(在我的例子中,
DebuggerNonUserCode
属性-防止在lambda中引发和捕获预期的IOException,从而破坏调试器)。
private void method blah([MyCustomAttribute(...)] Type1 param1, Type2 param2)
{
    ...