在浏览ASP.NET MVC文档时,我看到这个习惯用法很多:
new { foo = "bar", baz = "foo" }
Run Code Online (Sandbox Code Playgroud)
这是字典文字语法吗?它是一个新的类/结构,其类型由被调用的函数定义推断出来?如果它是怎样的变量不需要类型定义,甚至不是var?
Tim*_*ora 11
这是一种匿名类型.
匿名类型提供了一种将一组只读属性封装到单个对象中的便捷方法,而无需先显式定义类型.类型名称由编译器生成,在源代码级别不可用.每个属性的类型由编译器推断.
http://msdn.microsoft.com/en-us/library/bb397696.aspx
匿名类型是强类型的.从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别.
如果同一程序集中的两个或多个匿名类型具有相同的数量和类型的属性,则按相同的顺序,编译器将它们视为相同的类型.它们共享相同的编译器生成的类型信息.
匿名类型不应该在程序集之间传递,甚至不能作为方法的返回值传递(可能,但很少,很少可取).
匿名类型是一种便利机制,例如在使用LINQ时,例如以下投影:
LINQ示例
var result = myEnumerable.Select( o => new { foo = o.Foo, bar = o.Bar } );
// "result" is an enumerable of a new anonymous type containing two properties
Run Code Online (Sandbox Code Playgroud)
其他问题
这是字典文字语法吗?
不,虽然有很多相似之处.ASP .Net MVC使用RouteValueDictionary和匿名类型在许多方法重载中表示相同的信息.
为什么变量不需要类型定义,甚至不需要变量?
推断值类型,但推断并不总是可行的:http ://msdn.microsoft.com/en-us/library/bb531357.aspx (VB版,如果有人知道c#等效的URL请更新)