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