如果我有这段代码(我在Linqpad中运行):
decimal? x = null;
(x < 1).Dump();
在可空小数和小数之间定义的LessThan运算符在哪里?
它不是小数?它不在十进制类中。
我基本上想要创建调用运算符的linq表达式。
或者这个代码是由编译器在运行时创建的,即它使用默认的十进制运算符然后添加一些额外的语句来检查可空值是否实际具有值?
答案 0 :(得分:5)
这是一个所谓的提升运算符,即在非可空类型上定义的运算符,编译器应用于相同类型的可空形式。
对于关系运算符
< > <= >=
如果操作数类型都是非可空值类型且结果类型为
bool
,则存在提升形式的运算符。通过向每个操作数类型添加单个?
修饰符来构造提升形式。如果一个或两个操作数都是false
,则提升的运算符将生成值null
。否则,提升的运算符会解包操作数并应用基础运算符来生成bool
结果。
实施细节见C#语言规范的N.3.7节。