我在我的类中定义了Nullable属性,它们参与计算和xml编写。众所周知,当任何空值参与计算时,结果始终为null。我将通过examle ::
解释属性和计算代码:
public decimal? Amount { get; set; }
public decimal? VatAmount { get; set; }
public decimal? InvoiceAmount { get; set; }
.
.
public decimal Add()
{
//HERE I NEED 0 TO PERFORM THE CALCULATION
this.InvoiceAmount = this.Amount + this.VatAmount;
return this.InvoiceAmount
}
.
.
public string Insert()
{
XDocument doc1 = XDocument.Load(@"Transactions.xml");
var record = from r in doc1.Descendants("Transaction")
where (int)r.Element("Serial") == Serial
select r;
foreach (XElement r in record)
{
//HERE I WANT NULL VALUES RETAINED
r.Element("DebitNote").Add(new XElement("InvoiceAmount", this.InvoiceAmount), new XElement("VatAmount", this.VatAmount), new XElement("Amount", this.Amount));
}
doc2.Save(@"Transactions.xml");
return "Invoice Created Successfully";
正如您所看到的,直到金额或 VatAmount 的值为空, InvoiceAmount 将始终为null。我该如何解决这个问题?一种可能的解决方案是将金额和 VatAmount 的私有变量的默认值设置为 0 。但是当我将记录添加到xml时,使用此设置,金额和 InvoiceAmount 的值将输入0;如果在这种情况下没有输入,我想保留null。
让我知道如何满足这两个条件。 不一定需要编写代码,一般可以告诉我
提前致谢!!
答案 0 :(得分:6)
你可以写Amount ?? 0
此代码使用null-coalescing operator,它计算其第一个非空操作数。
因此,如果Amount ?? 0
为空,则Amount
将评估为0
,如果为空,则{{1}}将评估为{{1}}。
答案 1 :(得分:6)
如何在计算中使用GetValueOrDefault
Nullable<T>
方法?这样,您将获得计算的零,但保留xml的空值。
this.InvoiceAmount = this.Amount.GetValueOrDefault()
+ this.VatAmount.GetValueOrDefault();
答案 2 :(得分:1)
if (this.Amount.HasValue)
this.InvoiceAmount += this.Amount;
if (this.VatAmount.HasValue)
this.InvoiceAmount += this.VatAmount;
答案 3 :(得分:1)
我认为你必须在add方法中检查null并将其视为零。
例如:
//HERE I NEED 0 TO PERFORM THE CALCULATION
this.InvoiceAmount = this.Amount ?? decimal.Zero + this.VatAmount ?? decimal.Zero;
return this.InvoiceAmount