2013-05-15 263 views
7
([MyCustomAttribute(...)] param1, param2) => 
{ 
    ... 

其中参数1是Type1和param2的是2型自定义属性

在我看来,这是完全一样的

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

但第一个版本不被C#编译器允许。为什么?这是另外一个time vs effort/payback things?这不是简单的不一致吗?

+4

只是出于好奇,为什么你需要在匿名方法上的参数属性? – Dan

+1

我需要(类型)注释其中一个参数是一个无类型,非托管的内存块,但实际上可能是float [],float2 [],float4 []等。在我的代码中的其他地方,此类型注释用于单元测试和数据转储(以可读格式)。 – Ani

+0

你可能会做一个更具体的方法而不是匿名方法。 – Dan

回答

6

为什么?

正如我喜欢指出的那样,语言设计团队不必提供不做功能的理由。相反,想要功能的人必须为他们辩护。

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

如果我要将这个特性提供给C#设计团队,他们会认为它有什么问题?

在C#语言中没有要求lambda作为一个类的方法来实现。

首先,它们可以是表达式树,在这种情况下,它具有属性的意义是什么?其次,没有要求将lambda实现为编译器生成的闭包类的方法,这意味着不要求参数列表甚至是您可以明智地放置元数据的东西。属性是程序元数据的一部分,通常不会想到浏览编译器生成的类型来消耗元数据,这是明智之举。

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

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

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

是的。

有人想到这个,虽然说,呐!

不是我所知。

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

这难道不是简单的不一致吗?

我想是的。

+0

谢谢你的回答。请注意,我含糊不清的“为什么”是基于这样一个假设,即有一个深沉的,黑暗的和神秘的原因,这样的事情被省略了。在缺席的情况下,*“如果我将这个特性提供给C#设计团队,他们会认为它有什么问题?”*可能更合适。我将在Microsoft Connect网站上将此作为错误/功能请求提交。再次感谢! – Ani

+2

我最近碰到了一种情况,它能够用方法级别属性(在我的情况下为'DebuggerNonUserCode'属性)来装饰lambda会非常有帮助,以防止在抛出lambda时抛出并捕获预期的IOExceptions调试器)。 – MgSam