Pro*_*mer 11 c# anonymous-types
我知道匿名类型没有自己的预定义类型.编译器以编译类型为其分配类型,并且在代码级别无法知道在编译时分配的类型的详细信息; 这些细节是CLR本身所知的.我听说CLR上的这些匿名类型被视为仅仅是引用类型.所以我的问题是,在编译时是否创建了类似于类或结构的新类型,对应于匿名类型中定义的只读属性?
Eri*_*ert 12
我知道匿名类型没有自己的预定义类型.
正确.除了匿名类型共有的对象之外,没有其他基本类型.
编译器以编译类型为其分配类型,并且在编译时分配的类型的详细信息无法在代码级别获知
那是对的.
这些细节是CLR本身所知的.
我不知道你在谈论什么"细节"或"CLR已知"的含义.
我听说CLR上的这些匿名类型被视为仅仅是引用类型.
你没听错.
所以我的问题是,在编译时是否创建了类似于类或结构的新类型,对应于匿名类型中定义的只读属性?
是.创建一个新类.
请注意,在程序集中,如果有两个具有相同属性名称,相同属性类型的匿名类型,则按相同顺序,则只创建一个类型.这是由语言规范保证的.
行使:
// Code in Assembly B:
public class B { protected class P {} }
// Code in Assembly D (references assembly B)
class D1 : B {
public static object M() { return new { X = new B.P() }; }
}
class D2 : B {
public static object M() { return new { X = new B.P() }; }
}
Run Code Online (Sandbox Code Playgroud)
您需要在程序集D中生成单个类声明,该声明具有类型为BP的属性X,D1.M().GetType()等于D2.M().GetType().描述如何操作.
匿名类型是直接从对象派生的类类型,不能转换为除object之外的任何类型.尽管您的应用程序无法访问它,但编译器为每个匿名类型提供了一个名称.从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别.
资料来源:https://msdn.microsoft.com/en-us/library/bb397696.aspx