2013-05-15 307 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