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
a
class
,除非你能非常清楚地解释为什么它是
struct
可以证明它为什么是可变的
struct

你职业生涯的下一步是理解值类型和引用类型之间的区别:)