C# 是否修改匿名类型中的字段?

C# 是否修改匿名类型中的字段?,c#,.net,C#,.net,在本例中: var p1 = new {Name = "A", Price = 3}; 这就转化为IL: class __Anonymous1 { private string name ; private int price; public string Name{ get { return name; } set { name = value ; } } public int Price{ get { return price; } set { price= val

在本例中:

var p1 = new {Name = "A", Price = 3};
这就转化为IL:

class __Anonymous1
{
   private string name ;
   private int price;
   public string Name{ get { return name; } set { name = value ; } }
   public int Price{ get { return price; } set { price= value ; } }
}
__Anonymous1 p1 = new __Anonymous1();
p1.Name = "A";
pt.Price =3
根据IL,它是允许的,为什么会这样?背后的决定是什么?不应该是只读的吗

谢谢


这是我的第一个问题,温柔一点。

让我把问题转到你身上:为什么要限制它?

我不确定我是否理解你的问题。。。为什么不允许呢?。。。或者你认为什么是不被允许的

var p = new {Name = "A", Price = 3};
//Some Code Here
p.Name = "B";
//Some more code 
p.Price = 5;
类似地,如果我要创建第二个匿名变量,C#编译器足够聪明,知道它们具有相同的结构,因此它将在后台生成一个匿名类

var p = new {Name = "A", Price = 3};

//Some Time Later

var q = new {Name = "B", Price = 4};

//Only one anonymous class is generated in the IL

如果我列出了一个匿名类型的列表,例如使用LINQ时,那么您可能希望在获得其余信息后更改属性的值


例如,如果匿名类型中有一个百分比字段,则在知道最大值或总数(取决于定义百分比的方式)之前,您可能无法计算该字段。

编译器在编译源代码时生成类并命名它们。这些类具有读/写属性的原因是(如IL所示),编译器没有创建具有所有必需属性的构造函数,因此必须使属性为读/写,以允许设置值。这还允许多个匿名类型使用相同的类,只要它们的属性相同。

这是编译器的一个实现细节,不应该依赖它。未来的编译器完全可以让匿名类型获取构造函数参数,并让所有属性都只获取。出于所有意图和目的,匿名类型对象在实例化后应视为不可变的。(虽然属性本身可能引用可变对象。)

我认为匿名类型不可变的原因是函数式语言对LINQ和C#3.0的影响,以及它们是一个非常特定问题的解决方案


如果要修改字段(属性),只需创建自己的类,而不是使用匿名类。是否存在这样一种情况,即您必须使用匿名类,并且能够修改属性?

要么您错了,要么Jon Skeet先生错了,请看您不能修改@BorisB.提到的匿名类型var中的值。。你自己试试,你会得到
属性或索引器'AnonymousType#1.[FIELD]'无法分配到--它是只读的
这个答案与你发布的不是IL的答案相矛盾。只是IL的C#表示。