gpt4 book ai didi

.net - Expression 是一个值,因此不能作为赋值的目标

转载 作者:行者123 更新时间:2023-12-04 07:08:51 25 4
gpt4 key购买 nike

今天我在使用结构时遇到了一个让我措手不及的问题,我希望有人可以为我解释一下。

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

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

我有一个包含此信息的类(class)
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)字段,我可以完成这项工作:
public class Transaction
{
public PaymentDetail Payment;
}

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

最佳答案

首先 - 没有可变结构(即,您可以在构造后通过 setter 等更改值的结构)。这是造成困惑的主要原因。

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

当它是一个公共(public)字段时,您正在直接改变原始值,这就是它不介意的原因。但是变异结构确实不是一个好主意。

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

在 .NET 中,结构不是“没有行为的对象”——它们是“值类型”。 “货币/值(value)对”、“时间范围”等内容可能会构成有效的结构 - 但不是 PaymentDetail .

关于.net - Expression 是一个值,因此不能作为赋值的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/681464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com