2014-01-09 60 views
3

我嘗試創建這樣一個電話,這在javascript效果很好:匿名匿名方法未授權?

service.DoAction(new { param1="sometext", onOk=() => { Console.WriteLine("ok"); }}); 

,但它並沒有錯誤編譯:

Can not assign 'anonymous method' to anonymous type property

Can not assign 'lambda expression' to anonymous type property

知道爲什麼這是不是授權?語言限制?

+4

看來,正確的類型不能在這裏推斷。當你做'OnOk =新的行動(()=> {})',它的作品。 –

回答

0

你可以這樣做:

var test = new { hi = "Hi!", doSomething = (Action)(() => { Console.WriteLine("Done!"); }) }; 
test.doSomething(); 

.NET本身絕對不關心 - 匿名類型和方法彙編成「真正」的類型和方法,無論如何,所以沒有區別。請注意,本示例中的doSomething本身不是一種方法,它只是對方法的引用(駐留在它自己的匿名類型中)。所以你不能使用this

所以; C#不允許你創建完整的匿名類型(比如Java) - 你不能創建一個實現一個接口的類型,並且具有方法(在屬性之外,爲內部方法+)。這是一種解決方法,它將對匿名方法的引用分配給匿名類型的自動屬性,並且必須具體化類型,因爲() => {}可以表示一堆不同類型,並且編譯器必須知道一種特定類型。

6

lambda的想法是,它無法知道代表匿名方法的代表的類型,而不使用上下文。它需要分配給具有已知委託類型的事物,以便可以推斷委託的類型。

匿名類型屬性還需要從您分配給它的內容中推斷出它的類型。他們每個人都試圖從彼此中推斷出這種類型,並且從未在任何地方指定過。

你需要明確指出的委託類型來使用它來編譯:

var foo = new 
{ 
    hi = "Hi!", 
    doSomething = new Action(() => Console.WriteLine("Done!")) 
};