将nullable double转换为double类型数据类型

时间:2018-04-04 22:48:00

标签: asp.net-mvc

我在asp.net MVC 5项目中有很多可以为空的双重属性的模型类

  public class ValueAddedTax
  {
    public int Id { get; set; }
    public double? TaxableGoodsSalePrice { get; set; }
    public double? TaxableGoodsSupplementaryDuty { get; set; }
    public double? TaxableGoodsValueAddedTax { get; set; }
    public double? ZeroRatedSalePrice { get; set; }
    public double? ZeroRatedSupplementaryDuty { get; set; }
    public double? ZeroRatedValueAddedTax { get; set; }
    public double? ExemptSalePrice { get; set; }
    public double? ExemptSupplementaryDuty { get; set; }
    public double? ExemptValueAddedTax { get; set; }
    public double? TotalTaxPayable { get; set; }
  }

现在在控制器中我想创建局部变量并尝试将所有属性数据分配到其中

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddTaxInfo(ValueAddedTax valueAddedTax, int? id)
    {
        // Assagin Data
        double taxableGoodsSalePrice = valueAddedTax.TaxableGoodsSalePrice;

        if (!ModelState.IsValid)
        {
            if (valueAddedTax.CustomerInfoId != 0)
                return RedirectToAction("ValueAddedTax", "Customer", new {id = valueAddedTax.CustomerInfoId});

            return RedirectToAction("Index", "Customer");
        }
   }

如果任何属性值为null,那么我希望它们在局部变量中为0,以便我可以计算。 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

如果你自己编写逻辑,你需要的东西是:

// if this Nullable has an actual value...
if (valueAddedTax.TaxableGoodsSalePrice.HasValue)
{
    // ...return the Nullable's value      
    return valueAddedTax.TaxableGoodsSalePrice.Value;
}
else
{
    // return the default value of the double value type
    return default(double); // 0.0D
}

..这几乎是内置Nullable<T>.GetValueOrDefault()可以为您做的事情:

  

“返回:

     

如果HasValue属性为true,则Value属性的值;否则,当前Nullable对象的默认值。默认值的类型是当前Nullable对象的type参数,默认值的值仅由二进制零组成。“

答案 1 :(得分:1)

利用trashrOx 的答案,但采用更简洁的方法。

如果您运行的是 C# >= 7.2,您可以使用条件运算符:

double notNullVersion = ValueAddedTax.TaxableGoodsSalePrice.HasValue ? (double)ValueAddedTax.TaxableGoodsSalePrice : 0.0D;

文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator

或者,如果您运行的是 C# >= 8.0,您可以简单地使用空合并运算符:

double notNullVersion = ValueAddedTax.TaxableGoodsSalePrice ?? 0.0D;

文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator

我个人认为这些方法在代码中更容易阅读。希望这对某个地方的 S.O.er 有帮助!

答案 2 :(得分:0)

尽管问题的答案是正确的,但微软对此提出了不同的方法。我写在这里是为了将来的读者。
根据 Microsoft 的说法,default 关键字为 Nullable 值类型返回 null。例如 double? variable = default(double?); //sets variable to null reference here 出于这个原因,我们应该使用 GetValueOrDefault()
值得一提的是,如果可空值实际上设置为空值,则显式将可空值类型转换为不可空值类型会引发空异常。

来自同一个链接

int? n = null;
//int m1 = n;    // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null


所以建议的方法应该是 valueAddedTax.TaxableGoodsSalePrice.GetValueOrDefault(0) reference here