修改c#中的嵌套结构

jon*_*iba 5 c# struct

有人能告诉我为什么注释的代码行(前一个)不能编译?跟它之后的线不一样吗?

public struct OtherStruct
{
    public int PublicProperty { get; set; }
    public int PublicField;

    public OtherStruct(int propertyValue, int fieldValue)
        : this()
    {
        PublicProperty = propertyValue;
        PublicField = fieldValue;
    }

    public int GetProperty()
    {
        return PublicProperty;
    }
    public void SetProperty(int value)
    {
        PublicProperty = value;
    }
}

public struct SomeStruct
{
    public OtherStruct OtherStruct { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        SomeStruct a = new SomeStruct();
        //a.OtherStruct.PublicProperty++;
        a.OtherStruct.SetProperty(a.OtherStruct.GetProperty() + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

SomeStruct.OtherStruct是一个属性,返回一个值 - 它不是一个变量.这一行:

a.OtherStruct.PublicProperty++;
Run Code Online (Sandbox Code Playgroud)

就像打电话:

a.get_OtherStruct().PublicProperty++;
Run Code Online (Sandbox Code Playgroud)

因为表达式a.get_OtherStruct()而不是变量,所以它有点像这样做:

OtherStruct tmp = a.get_OtherStruct();
tmp.PublicProperty++;
Run Code Online (Sandbox Code Playgroud)

更改属性返回PublicProperty副本中的值OtherStruct根本不会更改原始值.这几乎肯定不是你的意图.C#设计师预见到了这种问题,并在许多情况下设法禁止它.

请注意,如果OtherStruct是引用类型(类),那么它将是复制的引用,而不是其中的值...因此更改tmp.PublicProperty 产生影响.有关详细信息,请参阅有关参考和值类型的文章.

顺便说一句,像这样的可变结构通常是一个非常糟糕的主意.它们会导致各种问题,并且难以预测代码.

编辑:响应您的"答案",两行相同:a.OtherStruct属性表达式不是赋值运算符或复合赋值运算符的目标.

你可以说,你想在某种程度上,这将允许这个(尽管我仍然不同意)来定义C#但是编译器正确执行规范.有关更多详细信息,请参阅C#3.0规范的第10.7.2节.