当前位置:  开发笔记 > 编程语言 > 正文

表达式是一个值,因此不能成为赋值的目标

如何解决《表达式是一个值,因此不能成为赋值的目标》经验,为你挑选了1个好方法。

我今天遇到一个使用结构的问题让我措手不及,我希望有人可以为我揭开它.

我有一个像这样定义的结构:

public struct PaymentDetail
{
    public Decimal Amount{get;set;}
    public string CheckNumber{get;set;}
    public PaymentType PaymentType{get;set;}
}

我有一个包含此信息的类

public class Transaction
{
    public PaymentDetail Payment{get;}
}

我有一个演示模型,我想在其中设置这样的底层属性

public class ViewModel
{
    public Decimal Amount
    {
        get{return _Transaction.PaymentDetail.Amount;}
        set
        {
             //This is the offending line of code
             _Transaction.PaymentDetail.Amount = value;
             RaisePropertyChanged("Amount");
        }
    }
}

如果我将Payment属性更改为这样的公共字段,我可以做到这一点很奇怪:

public class Transaction
{
    public PaymentDetail Payment;
}

很明显我不了解导致这种结构的结构.这是一个坏主意吗?有没有更好的办法?我究竟做错了什么?



1> Marc Gravell..:

首先 - 没有可变结构(即可以在构造之后通过setter等更改值的结构).这是造成混淆的主要原因.

重点是; 当你调用一个属性(比如Payment)时,你得到一个值的副本(在你的本地堆栈区域).对于一个类,这是一个引用的副本(没问题).对于结构体,它是结构本身的副本.对该值的任何更改都将被丢弃,因此编译器已阻止您丢失数据.

当它是一个公共领域时,你正在直接改变原始值,这就是它不介意的原因.但改变结构确实不是一个好主意.

使PaymentDetail一类; 这是正确的解决方案......

在.NET中,结构体不是"没有行为的对象" - 它们是"价值类型".诸如"货币/价值对","时间范围"等等可能会产生有效的结构 - 但不是PaymentDetail.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有