Dho*_*LEM -2 .net c# boolean operators
我如何向 Elvis Operator 申请以下内容:
Exp: b= a?.attr> 0
Run Code Online (Sandbox Code Playgroud)
结果应该是:如果a是null,b应该是null,否则,b应该是结果attr > 0。
正如其他人在现已删除的答案中指出的那样,您遇到的问题是由于设计决策存在问题。“提升”运算符是普通运算符的一个版本,它接受可空值,如果操作数为空则生成空值,否则生成常规运算符的可空版本。例如,加法是一个提升操作符:
int? a = 111;
int? b = null;
int? c = a + a; // 222, but nullable
int? d = a + b; // null
Run Code Online (Sandbox Code Playgroud)
您遇到的问题是C#中的比较运算符不遵循其他提升运算符的模式。在 C# 中,比较运算符是:
== 如果两个操作数都为空,则为真,如果正好有一个操作数为空,则为假,否则为非提升等式
!= 做相反的事情 ==
<,>,<=并>=产生假如果一个操作数为空,否则定期做比较。请注意,这意味着x == y可以为真,x >= y也可以为假,这意味着>=与“大于或等于”的含义不同。
这是一团糟,您对此感到困惑是正确的。
您可能要做的只是编写一个具有您想要的语义的方法:
static bool? LiftedLessThan(int? x, int? y) =>
(x == null | y == null) ? (bool?)null : x.Value < y.Value;
Run Code Online (Sandbox Code Playgroud)
(请注意,为了使 C# 类型系统满意,需要强制转换,这要求条件的结果和替代项都具有一致的类型。)
现在你的程序片段是:
bool? b = LiftedLessThan(a?.attr, 0);
Run Code Online (Sandbox Code Playgroud)
看起来不太好,但它有效。