設計決定傾向於不從方法返回匿名類型?爲什麼匿名類型不能在方法中傳遞?
回答
你可以從方法返回一個匿名類型的實例 - 但是因爲你不能命名它,所以你不能聲明該方法將返回什麼,所以你必須聲明它返回只是object
。這意味着調用者不會對屬性等具有靜態類型的訪問權限 - 雖然他們仍然可以傳遞實例,通過反射(或在C#4中動態輸入)訪問它。
我個人很喜歡的C#未來版本允許你寫一個非常簡短的類聲明產生相同的代碼(不可變的性質,構造,的Equals/GetHashCode的/的ToString)與名稱...
有一個 grotty hack去繞它,叫casting by example。我不會推薦它。
...你今天可以用CodeRush,非常方便。是否有任何理由希望將它包含在語言中而不是VS中? –
@Johannes:是的,可維護性。我希望能夠保持*簡單*形式。 *能力*將類型擴展爲完整的代碼,所以我可以添加額外的功能當然非常方便,但除此之外還有更多。再舉一個例子,想象一下,如果我們沒有'using'語句,但是VS宏會產生相應的try/finally塊 - 就像在語言中使用'statement'一樣好,在你的視圖? –
聽起來很合理。所以你基本上提出一個「僅數據類」構造? –
因爲匿名類型沒有名字。因此你不能爲方法聲明返回類型。
所以你會使用'var' –
因爲C#是靜態類型語言和靜態類型語言需要在編譯時已知的方法的返回類型和匿名類型沒有名字。
你怎麼能使用你的類型的方法中,如果定義僅在方法的調用?
這不是javascript。
我沒有看到你從問題中得到這個答案... –
至少高達3.5,匿名類型實際上是在編譯時解析,而這是不可能的(或相當硬)與匿名方法簽名做。
很多答案heere似乎indicatie,這是因爲目前的語法和規則不可能的。但問題是要改變它們。我認爲這是可能的,但有點複雜,並導致一個尷尬的(容易出錯的)語法。像
var f() { return new { A = "*", B = 1 }; }
var x = f();
問題是這是否增加了足夠的價值,以使其值得。
首先,「var」的意思是「變量」,所以我會覺得做一個返回類型不好,不是一個變量,比如說「var」。其次,這會使編譯器的設計複雜化。可行,但比天真地想象的要多得多。請參閱http://blogs.msdn。com/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx對此有些想法。 –
- 1. 傳遞匿名類型VB.NET
- 2. LINQ中,VB - 匿名類型不能轉換爲匿名類型
- 3. 在ASP.NET MVC中傳遞匿名類型
- 4. 如何將匿名類型作爲參數傳遞給方法?
- 5. 將匿名類型作爲方法參數傳遞
- 6. 爲什麼我無法將匿名類型作爲參數傳遞給函數?
- 7. 爲什麼我不能在Java中調用添加到匿名類的方法?
- 8. 爲什麼匿名類方法調用方法時不能執行aop?
- 9. 傳遞匿名類
- 10. 傳遞匿名類
- 11. 爲什麼我不能在Scala中爲匿名函數指定結果類型?
- 12. 不能匿名類型傳遞給通用構造
- 13. 爲什麼我不能使用那樣的匿名方法?
- 14. 爲什麼在匿名方法中不允許out參數?
- 15. 什麼是C#中的匿名類型?
- 16. 爲什麼EF4中的匿名類型與LINQ to SQL不同?
- 17. 爲什麼使用匿名類型而不是創建類
- 18. 傳遞一個匿名方法到ProgressBar.Invoke()
- 19. 爲什麼泛型類型不能傳播到所有的類方法?
- 20. 我對匿名方法類型使用什麼通用約束?
- 21. 在C#中,爲什麼匿名方法不能包含yield語句?
- 22. 爲什麼我的匿名方法不能在循環中工作?
- 23. 匿名類型(類功能)
- 24. 爲什麼在聲明常量時不能使用C#匿名類型?
- 25. 什麼是C#中的匿名方法?
- 26. 爲什麼.Net 1.1中不支持匿名方法?
- 27. 在匿名內部類中調用方法是什麼?
- 28. 爲什麼方法返回類型不包含在方法簽名中?
- 29. 在參數中傳遞類名/方法名,可能嗎?
- 30. 爲什麼匿名類型不像ExpandoObject那樣動態?
因爲我們會回來與VB的變種類型! ;) –
也許是因爲人們在編寫代碼時不會聲明任何名爲「數據類型」的東西,代碼審查人員可能會禿頂! – asyncwait