我知道Struct是一个值类型而Class是引用类型,但是我似乎无法解决这个问题。
我有一个包含结构列表的类:
public class Basket
{
string ID{get; set;}
List<Fruit> fruits{get;set;}
public struct Fruit
{
string Name{get;set;}
bool IsFresh;
}
}
将类实例传递给另一个类时,我想更新其中一个Structs&#39; IsFresh属性,但代码只是跳过它:
public class Customer
{
public string Name{get;set;}
public Basket Basket{get;set;}
public Customer(string name, Basket basket)
{
this.Name = name;
this.Basket = basket;
}
public ChangeBasket()
{
//CODE THAT IS NOT WORKING
Basket.Fruits[0].IsFresh = false;
}
}
正在修改相同的引用类,并且应该更新有价值的结构。
为什么不起作用?
答案 0 :(得分:3)
通常不应该写可变结构。相反,分配一个全新的结构。见here。基本上发生的是你正在修改结构的副本,因为它是一个值类型。
答案 1 :(得分:2)
首先,访问修饰符存在一些问题(当您想要访问类\ structs之外的代码时使用public。)
您的问题是由于结构是值类型的原因,因此当您访问列表元素时,您将访问索引器的“getter”列表而不是列表本身返回的元素的副本。 这意味着如果您尝试更新实例,更新将不会真正影响“真实”实体的更改,而是影响复制的实体,这就是您收到编译错误的原因。
答案 2 :(得分:0)
这basket.Fruits[0].IsFresh = false;
应该是:
Basket.fruits[0].IsFresh = false;
这样可以解决吗?
答案 3 :(得分:-1)
当列表是结构列表时,似乎您无法使用索引器。 以下代码有效:
var x = Basket.Fruits [0];
x.IsFresh = false;