2010-04-29 87 views
1

我明白,如果我把它轉換成命名類型,我可以隨心所欲地做任何事情,但是如果我可以在方法調用之間保持匿名,那麼它可以做出更多更整潔的代碼。爲什麼匿名類型不能在其創建的方法之外使用?

+0

副本([我的問題]一(http://stackoverflow.com/questions/2450536/simple-way-to-return-anonymous-types-to-make- mvc-using-linq-possible))。 @DaveDev:另見[這裏](https://connect.microsoft.com/VisualStudio/feedback/details/542278/ability-to-return-strongly-typed-anonymous-classes) – 2010-04-29 16:38:01

+1

它似乎不是一個根據標題重複 - 您的問題探索實現目標的方法。我的問題是問爲什麼。 – DaveDev 2010-04-29 16:40:40

+0

這個問題預設了一個虛假的,因此無法回答。匿名類型在程序集中統一。如果您在同一個程序集中以兩種不同的方法使用相同的匿名類型,那麼* *會得到相同的類型。 – 2010-04-29 16:53:53

回答

1

將您的方法簽名看作合同。你的方法說「我保證會給你返回包含以下字段的東西。」如果您從方法中返回匿名對象,則沒有合同。你只是說「這裏有一些數據,祝你好運!」

如果C#4完全是一個選項,那麼您可以使用tuples來返回更多的任意數據。

+0

我給了Ben同樣的答案:編譯器當然可以在後臺生成一個類,然後使用所有現有的類型驗證... – 2010-04-29 16:42:43

+0

@BlueRaja綠色獨角獸:編譯器可能會(例如)F#編譯器能夠從你的代碼中找出類型(或者你得到一個類型錯誤)。不改變C#編譯器(現在)沒有這樣做的事實。 – R0MANARMY 2010-04-29 18:31:52

1

雖然它應該避免,因爲它不是很乾淨,你可能會考慮從Jon Skeet的this黑客。但是,如果可能的話,應該避免。

+0

很好的老演員。 – R0MANARMY 2010-04-29 16:20:07

+0

這只是討厭的! – 2010-04-29 16:53:09

-2

這是一個猜測......但是我很「真棒」我「肯定」我就......

匿名類型真的不是「無名氏」。代表未知類型的類是在運行時堆棧上的方法調用本地運行時生成的(因此是方法專用範圍)。從函數調用返回(彈出堆棧),將丟失該作用域中的所有對象,包括使用該方法調用隱藏在堆棧中的匿名類。

猜測了......

+1

匿名類型在編譯時生成。區別在於它們對於它們的創建範圍是私有的。 – 2010-04-29 16:23:12

+0

匿名類在編譯時生成。 http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx這就是爲什麼約翰·拉希的「以身作則」的例子。 – R0MANARMY 2010-04-29 16:23:52

+2

對不起,您的猜測是錯誤的:匿名類型是在編譯時創建的。您可以使用反射器來驗證這一點。您也可以傳遞並返回匿名類型實例作爲'object'並使用反射與它們一起玩,但我不會在生產代碼中推薦它。 – LukeH 2010-04-29 16:25:15

相關問題