有人能告诉我为什么注释的代码行(前一个)不能编译?跟它之后的线不一样吗?
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节.
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |