2014-11-24 43 views
1

我最近在嘗試我的C#技能測試,在Smarterer使用{...}與新實例化C#中的匿名類型

我遇到了一個問題,它說這下面的,可以用來創建在C#中的匿名類型(類似的東西)。

我選擇「的這些無」(我不記得其他的選擇,因爲它是基於時間的測試只有10秒)。

一旦我給出的答案是說,{...}是正確的答案。

所以我想是這樣的:

var someVariableName = new {...};創建一個匿名類型。

我很驚喜地看到這一點,猛吃了一下,但沒能找到類似這樣的東西。

問題:有沒有什麼辦法可以在使用{...}關鍵字或運算符實例化時創建匿名類型而不聲明其類型?或問題的正確答案不是「正確的」?

這可以通過使用關鍵字dynamic如果我沒看錯的完成。

+2

你的問題到底是什麼?例如,在Web上搜索「C#new dynamic」給出了[如何動態創建新的匿名類?](http://stackoverflow.com/questions/3740021/how-to-dynamic-new-anonymous-class) ,'var foo = new {bar =「baz」}'似乎在做你想做的事情。 – CodeCaster 2014-11-24 12:15:49

+0

查看http://stackoverflow.com/a/392163/1453076 – Vladimirs 2014-11-24 12:16:41

+1

所以你猜對了'new {...}',但他們說這只是'{...}'? – 2014-11-24 12:17:33

回答

5

http://msdn.microsoft.com/en-GB/library/bb397696.aspx是MS documenation,引用:

您可以通過使用new運算符與 對象初始化共創匿名類型。有關對象初始值設定項的更多信息,請參閱 ,參見對象和集合初始值設定項(C#編程指南)。 以下示例顯示了一個匿名類型,該名稱使用兩個名爲「金額」和「消息」的 屬性進行初始化。

C# 
var v = new { Amount = 108, Message = "Hello" }; 

這是不是動態類型,這是一個特定的靜態類型,它是「匿名」,即你沒有給它一個名字。然而,編譯器具有/將和所以v仍然強類型,你會得到intellisense和v.FieldIDontHave會給編譯器錯誤。

+0

編譯器甚至會按照相同的順序匹配具有相同屬性(相同類型)的類型,以便它可以重用現有的類型。我不確定,但我想我記得在Roslyn發佈時試圖改變它,以便在匹配「like for like」匿名類型時,屬性順序無關緊要,只是名稱和類型。 – 2014-11-24 13:50:14

1

使用關鍵字var

var x = new {value = 3, name = "lol"}; 
Console.WriteLine(x.value); //prints 3 
Console.WriteLine(x.name); //prints lol 
1

花費在得到這個問題的底部的評論時間後,我可以確認一些細節。

的Smarterer「答案」指出,剛剛{ MyProperty = 2 }是有效的語法匿名類型只對了一半。該語法是必需的,但需要聯合new關鍵字。

var anon = new { Name = "Adam", Age = 29 }; 

嘗試了在VS 2012以下不會編譯:

// Try and make an anonymous type without new. 
var anon = { Name = "Adam", Age = 29 }; 

// Try and declare an anonymous type prior to "newing" one up. 
{ Name = "Adam", Age = 29 }; 

而且不準確的問題,並從其他網站上提供的答案,這是很難提供的問題,並隨後回答上下文這個網站。希望這足以將其關閉。

+0

謝謝,我打算繼續進行技能測試,如果我再次看到這個問題,我將採取截圖並在此處發佈。但至少基於目前的討論,我可以肯定的是,我無法從字面上將匿名類型初始化爲「new {...}」。謝謝!而且我也可以向他們報告,這個問題沒有得到正確的答案。 – Jsinh 2014-11-24 14:45:16

+0

我會迂迴地辯解說,'新'使得(像往常一樣)一個_instance_類型,因此{Name =「Adam」,Age = 29}是可以被認爲包含的語法的全部'類型定義',因此智慧答案是正確的,雖然缺乏細節。儘管所有的語義。 – tolanj 2014-11-24 15:37:21

+0

@tolanj好吧,如果沒有前者,那麼後者就不會編譯,所以一個試圖教你一些沒有編譯和聲稱它的東西是正確的問題是IMO的錯誤,但是沒有確切的問題措辭, {}'是標識匿名類型的部分。 – 2014-11-24 15:38:59