数学运算为null

alt*_*tso 44 c#

请解释为什么这个测试通过?

[Test]
public void TestNullOps()
{
    Assert.That(10 / null, Is.Null);
    Assert.That(10 * null, Is.Null);
    Assert.That(10 + null, Is.Null);
    Assert.That(10 - null, Is.Null);
    Assert.That(10 % null, Is.Null);
    Assert.That(null / 10, Is.Null);
    Assert.That(null * 10, Is.Null);
    Assert.That(null + 10, Is.Null);
    Assert.That(null - 10, Is.Null);
    Assert.That(null % 10, Is.Null);

    int zero = 0;
    Assert.That(null / zero, Is.Null);
}
Run Code Online (Sandbox Code Playgroud)

我不明白这个代码是如何编译的.

看起来每个带有null返回的数学表达式Nullable<T>(例如10 / null是a Nullable<int>).但是我没有在Nullable<T>课堂上看到操作员方法.如果取消这些运算符int,为什么最后的断言不会失败?

And*_*rei 40

来自MSDN:

预定义的一元和二元运算符以及值类型存在的任何用户定义的运算符也可以由可空类型使用.如果操作数为null,则这些运算符产生空值; 否则,运算符使用包含的值来计算结果.

这就是所有测试都通过的原因,包括最后一个 - 无论操作数值是多少,如果是另一个操作数null,那么结果就是null.

  • 请注意,`==`这里的规则略有不同; if*both*为null,为'true` (6认同)
  • 是的,就我所知,`!=`也是如此 - 如果一个为空,而另一个不是,那么结果是'真'. (5认同)
  • 另外要注意的是,比较运算符(`&lt;`、`&gt;`、`&lt;=`、`&gt;=`)不返回可为 null 的值;如果其中一个或两个操作数都为空,则它们只是返回 false。 (3认同)

Mar*_*ell 16

运营商Nullable<T>是所谓的"提升"运营商]; c#编译器获取可用的运算符T并应用一组预定义的规则; 例如,与+,被提升的+null如果操作数是零,所述内值的其他的总和.最后一个; 再次,除法被定义为null两个操作数都是null- 它从不执行除法.