【发布时间】:2017-07-11 12:05:44
【问题描述】:
在以下代码中,两个变体之一无法编译:
class C
{
public decimal DecimalField;
}
static C GetC() { return new C(); } //Can return null in reality.
C c = GetC(); //Get a C value from somewhere, this might be null
string toString1 = c?.DecimalField?.ToString(); //Does not compile.
string toString2 = (c?.DecimalField)?.ToString(); //Compiles.
错误 CS0023:操作员“?”不能应用于“十进制”类型的操作数
为什么简单的表单无法编译?
表达式c?.DecimalField 不是decimal? 类型吗?该值可以为 null,因此应应用 ?. 运算符。我很确定这是因为在这段代码中:
var decimalValue = c?.DecimalField;
根据 IDE,var 确实解析为 decimal?。
【问题讨论】:
-
因为
decimal不能为空 -
我认为十进制类型不能为null,所以这里的null-coalesce操作符没有意义。
-
不是
the simple form,加括号会改变表达式 -
括号可以改变这样的表达式(使用两个相同的运算符)的明显原因是运算符是否是右结合的。不幸的是,没有包含
?.的官方规范,而且(在我看来)很难知道关联性在这里意味着什么。 -
@Damien_The_Unbeliever 这是一个很好的观点。我也一直不清楚与该运算符的关联性。显然,链必须从左到右执行,但类型似乎是从右到左?!
标签: c# .net c#-6.0 null-conditional-operator