2014-11-24 45 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