2010-03-08 59 views

回答

6

可以從方法返回一個匿名類型的實例 - 但是因爲你不能命名它,所以你不能聲明該方法將返回什麼,所以你必須聲明它返回只是object。這意味着調用者不會對屬性等具有靜態類型的訪問權限 - 雖然他們仍然可以傳遞實例,通過反射(或在C#4中動態輸入)訪問它。

我個人很喜歡的C#未來版本允許你寫一個非常簡短的類聲明產生相同的代碼(不可變的性質,構造,的Equals/GetHashCode的/的ToString)與名稱...

一個 grotty hack去繞它,叫casting by example。我不會推薦它。

+0

...你今天可以用CodeRush,非常方便。是否有任何理由希望將它包含在語言中而不是VS中? –

+1

@Johannes:是的,可維護性。我希望能夠保持*簡單*形式。 *能力*將類型擴展爲完整的代碼,所以我可以添加額外的功能當然非常方便,但除此之外還有更多。再舉一個例子,想象一下,如果我們沒有'using'語句,但是VS宏會產生相應的try/finally塊 - 就像在語言中使用'statement'一樣好,在你的視圖? –

+0

聽起來很合理。所以你基本上提出一個「僅數據類」構造? –

1

因爲匿名類型沒有名字。因此你不能爲方法聲明返回類型。

+0

所以你會使用'var' –

1

因爲C#是靜態類型語言和靜態類型語言需要在編譯時已知的方法的返回類型和匿名類型沒有名字。

1

你怎麼能使用你的類型的方法中,如果定義僅在方法的調用?

這不是javascript。

+1

我沒有看到你從問題中得到這個答案... –

0

至少高達3.5,匿名類型實際上是在編譯時解析,而這是不可能的(或相當硬)與匿名方法簽名做。

1

很多答案heere似乎indicatie,這是因爲目前的語法和規則不可能的。但問題是要改變它們。我認爲這是可能的,但有點複雜,並導致一個尷尬的(容易出錯的)語法。像

var f() { return new { A = "*", B = 1 }; } 

var x = f(); 

問題是這是否增加了足夠的價值,以使其值得。

+1

首先,「var」的意思是「變量」,所以我會覺得做一個返回類型不好,不是一個變量,比如說「var」。其次,這會使編譯器的設計複雜化。可行,但比天真地想象的要多得多。請參閱http://blogs.msdn。com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx對此有些想法。 –

相關問題