C#学习教程:无法改变泛型集合中struct的成员值放;}publicstringLastName{get;放;}}以下代码:varlist=newList();list.Add(newPerson{FirstName="F1",LastName="L1"});list.Add(newPerson{FirstName="F2",LastName="L2"});list.Add(newPerson{FirstName="F3",LastName="L3"});//不能修改表达式,因为它不是变量list[1].FirstName="F22";当我想更改Property的值时,出现以下错误:Can'tmodifytheexpressionbecauseit'snotavariable但是,当我尝试在Person[]之类的数组中更改它时,它没有任何错误。使用泛型集合时我的代码有问题吗?通过List[]索引器返回一个结构,它返回条目的副本。因此,如果您在那里分配FirstName,它将被丢弃。因此编译错误。将您的Person重写为引用类型类,或执行完全重新分配:Personperson=list[1];person.FirstName="F22";列表[1]=人;一般来说,可变结构会带来像这样的问题,这会让人头疼。除非您有充分的理由使用它们,否则您应该强烈考虑更改您的Person类型。为什么可变结构是“邪恶的”?显然,部分问题仍未得到解答。List和Person[]有什么区别?在通过索引获取元素方面,List调用索引器(方法)返回值类型实例的副本,并在索引的相反数组中返回一个托管指针,该指针不是副本而是指向元素在索引处(使用特殊的IL指令ldelema)。当然,其他答案中提到的可变值类型是邪恶的。看看这个简单的例子。varen=new{Ints=newList{1,2,3}.GetEnumerator()};while(en.Ints.MoveNext()){Console.WriteLine(x.Ints.Current);}惊讶吗?像这样重做你的结构:structPerson{privatereadonlystringfirstName;私有只读字符串姓氏;publicPerson(stringfirstName,stringlastName){this.firstName=firstName;this.lastName=lastName;}publicstringFirstName{get{returnthis.firstName;}}publicstringLastName{get{returnthis.lastName;}}}并遵循以下代码:varlist=newList();list.Add(newPerson("F1","L1"));list.Add(newPerson("F2","L2"));list.Add(新人("F3","L3"));//可以修改表达式,因为它是一个新实例list[1]=newPerson("F22",list[1].LastName);这是由于结构的复制语义。让它不可变并在这些约束内工作,问题就会消失。以上是C#学习教程:不能改变泛型集合中struct的成员值。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
