为什么列表中的结构状态不能改变?

Hao*_*Lim 0 c#

我知道这听起来很愚蠢.但我必须在这里做错事.

说,

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或函数式编程方法,那将是非常棒的.

Dav*_*d M 6

问题出在这一行:

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的引用.