C#中,运算符“??”不能用于类型为“decimal”和“decimal”的操作数。

12
public decimal v1 {
  get {
    return this._v1; 
  }
  set {
    this._v1 = value ?? 0M;  // also I tried, default(decimal)
  }
}

错误信息如下:

运算符“??”不能应用于类型为“decimal”的操作数和类型为“decimal”的操作数

为什么不起作用,我该怎么做才能让它起作用呢?


7
这些是值类型,不能为 null - Nasreddine
6个回答

18

decimal类型不能为null,因此空值合并运算符在这里没有意义。只需将_v1设置为value


3
如果您有一个可空的十进制数怎么办?例如:public decimal? TotalAmount。 - user412045
1
如果十进制数可为空,则合并函数将起作用。 - Rawling

5

这些是值类型,不能为 null,您可以使用 Nullable<decimal>

private decimal? _v1;
public decimal? V1
{
    get
    {
        return this._v1;
    }
    set
    {
        this._v1 = value ?? 0M;
    }

}

3

1

这就是空值合并运算符。由于十进制数不能为null,因此它在十进制数中没有用处。

如果需要此功能,您可以使用decimal?,它可以设置为null:

public decimal? v1 
{
    get 
    {
        return this._v1; 
    }
    set 
    {
        this._v1 = value ?? 0M;
    }
}

0

如果您正在尝试针对类的属性执行此操作,例如:

public class TestCase {
     public decimal TestProp {get;set;}
}

您可以像这样执行空值合并:
var testCase = new TestCase();
return testCase?.TestProp ?? 0M

0
如果您认为默认的十进制值0被视为“null,empty或not set”,并且只有在它不是零时才想要使用“value”,那么您可以像这样做:
decimal nextBest = 10M;

public decimal v1 {
  get {
    return this._v1; 
  }
  set {
    // Use value by default (only if it's not 0), Otherwise use a different number.
    this._v1 = (value != 0)? value : nextBest;  
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接