匿名类型C#

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().描述如何操作.


Xia*_*312 6

匿名类型是直接从对象派生的类类型,不能转换为除object之外的任何类型.尽管您的应用程序无法访问它,但编译器为每个匿名类型提供了一个名称.从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有区别.

资料来源:https://msdn.microsoft.com/en-us/library/bb397696.aspx