我知道这听起来很愚蠢.但我必须在这里做错事.
说,
struct lala
{
private bool state1;
public lala(bool state1)
{
this.state1 = state1;
}
public void SetState1ToTrue()
{
this.state1 = true;
}
public bool GetState1()
{
return this.state1;
}
}
Run Code Online (Sandbox Code Playgroud)
然后某个地方......
List<lala> lalas = new List<lala>();
lalas.Add(new lala(false));
lalas.Add(new lala(false));
lalas[0].SetState1ToTrue();
// Why is it False???
Console.WriteLine(lalas[0].GetState1());
Run Code Online (Sandbox Code Playgroud)
是否有任何变通方法,除了将其更改为:
List<lala> lalas = new List<lala>();
lalas.Add(new lala(false));
lalas.Add(new lala(false));
lala newLala = lalas[0];
newLala.SetState1ToTrue();
lalas[0] = newLala;
// It's True, finally.
Console.WriteLine(lalas[0].GetState1());
Run Code Online (Sandbox Code Playgroud)
看起来很糟糕,不优雅,浪费了2行代码.如果说1行代码中有任何Linq-ish或函数式编程方法,那将是非常棒的.
问题出在这一行:
lalas[0].SetState1ToTrue();
Run Code Online (Sandbox Code Playgroud)
第一部分lalas [0]从列表中检索第一个lala,并在隐式变量中作为它的新副本执行.因此,您的SetState1ToTrue在lala上运行,然后立即丢弃,并且列表中的那个保持不变.这与做到这一点是一样的:
lala newLala = lalas[0];
newLala.SetState1ToTrue();
Run Code Online (Sandbox Code Playgroud)
如果你使lala成为一个类而不是一个struct,那么它就变成了一个引用类型,那么临时变量(显式或隐式)就是对列表中lala的引用.