C# Can';t修改存储在另一个属性中的结构的属性
我有一个小问题,我无法修改存储在另一个属性中的结构属性,我不知道为什么: 代码: 错误:C# Can';t修改存储在另一个属性中的结构的属性,c#,.net,C#,.net,我有一个小问题,我无法修改存储在另一个属性中的结构属性,我不知道为什么: 代码: 错误: Error: Error 3 Cannot modify the return value of '...ViewModel.TilesModel.BNDTileInfo' because it is not a variable 我不明白,因为如果我把它改成: bndTileInfo.NavigovatNa = NavigovatNa.MainPage; 它起作用了。有人能给我解释一下吗?Astruc
Error: Error 3 Cannot modify the return value of '...ViewModel.TilesModel.BNDTileInfo' because it is not a variable
我不明白,因为如果我把它改成:
bndTileInfo.NavigovatNa = NavigovatNa.MainPage;
它起作用了。有人能给我解释一下吗?A
struct
是一种值类型,因此当您从属性访问它时,您将返回struct
的副本,而不是底层字段direclty。因此,C#不允许修改该结构的副本,因为它只是一个将被丢弃的临时对象
所以,当你打电话时:
BNDTitleInfo.NavigovatNa = ...;
bndTitleInfo.NavigovatNa = ...;
它首先调用属性上的get
,并返回bndTitleInfo
的副本,然后尝试设置NavigovatNa
属性和副本。C#在这里给了你错误,因为这不是你真正想做的事情,因此保护你不受自己的伤害
但是,当你打电话时:
BNDTitleInfo.NavigovatNa = ...;
bndTitleInfo.NavigovatNa = ...;
您直接引用该字段,因此不会复制,也不会出现编译器问题
其长短不一之处在于可变值类型不能构成好的属性(通常,您应该完全避免可变值类型)
要更正,您可以将其设置为引用类型(class
),也可以将您的struct
设置为不可变,这意味着您必须分配一个全新的struct实例来更改其值
如果您查看MSDN的建议,一般来说,
struct
最适合于小型、逻辑单值、不可变的构造:因为BNDTileInfo
是一个属性,所以您可以得到数据的克隆。当克隆被丢弃时,对克隆的更改将丢失,即您的代码为:
var tmp = BNDTileInfo; // tmp is a completely separate clone
tmp.NavigovatNa = NavigovatNa.MainPage; // change the local clone
// discard the clone - our change was wasted
编译器已阻止您遇到大问题。这是因为struct
意味着什么,即值类型语义,又称复制语义
这里真正的答案是:不要把它变成结构体。即使不知道这些单词中的任何一个是什么,我99%确定它们不应该是struct
。当然,即使您刚才说“我有一个名为InfoProfile
”的struct
,我仍然98.5%确定它不应该是struct
将BNDTileInfo
aclass
,除非你能非常清楚地解释为什么它是struct
,和可以证明它为什么是可变的struct你职业生涯的下一步是理解值类型和引用类型之间的区别:)