繁体   English   中英

为什么C#编译器会产生NULL和数字比较的结果?

[英]Why C# compiler yield result for NULL and number comparison?

我有以下代码片段,使Employee对象为NULL时运行TaskA(预期仅当Employee ID不等于1时运行TaskA)。

if (Employee?.Id != 1) <PerformTaskA>;

在这里,为什么C#编译器比较NULL和1? 它不应该抛出异常吗? 另外,避免此类情况的更好的做法是什么?

为什么C#编译器比较NULL和1?

因为Nullable<T>能够与比较T (或实际上int变得int?在这种情况下)。 在您的情况下,它以null != 1结尾,这始终是正确的。

对您来说,最简单的事情就是使它明确:

if (Employee != null && Employee.Id != 1) <PerformTaskA>;

当您对nullable类型执行比较时,如果其中一个可为空的类型的值是null而另一个不是,则所有比较的结果均为false除了!= (not equal) 重要的不要假设因为特定的比较返回false,相反的情况返回true。 在下面的示例中,10不大于,小于或等于null。 只有num1!= num2计算为true。

int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
    Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
    // This clause is selected, but num1 is not less than num2.
    Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");
}

if (num1 < num2)
{
    Console.WriteLine("num1 is less than num2");
}
else
{
    // The else clause is selected again, but num1 is not greater than
    // or equal to num2.
    Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");
}

if (num1 != num2)
{
    // This comparison is true, num1 and num2 are not equal.
    Console.WriteLine("Finally, num1 != num2 returns true!");
}

// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
    // The equality comparison returns true when both operands are null.
    Console.WriteLine("num1 == num2 returns true when the value of each is null");
}

/ *输出:

  • num1> = num2返回false(但是num1 <num2也为false)

  • num1 <num2返回假(但num1> = num2也为假)

  • 最后,num1!= num2返回true!

  • num1 == num2当每个值都为null时返回true

* /

检查此Microsoft 文档

这里查看Live Fiddle

您声明“我有以下代码段,当Employee对象为NULL时,TaskA可以运行”。

为此,您需要:

if (employee == null) {
    PerformTaskA();
}

(注:我以employee而不是Employee为前提,即employee是指对象而不是其类/以符合命名标准 )。

您是否只是在与1进行比较,因为ID 1表示员工不是null? 如果雇员不为空,但具有除一个以外的其他ID,这也将导致您的任务运行。 虽然我怀疑你意识到了吗?

关于与可空类型的比较,请参阅有关Nullable.Equals的文档,该文档解释了此行为。

Employee?.Id的计算结果为null ,如果员工为null。
和?[]空条件运算符

将鼠标悬停在Visual Studio中,您将获得答案

Debug.WriteLine(null != 1);

该表达式将始终为true,因为int类型的值永远不会等于int类型的null?

它不会引发异常。 你为什么不测试呢?

采用

Debug.WriteLine(sc != null && sc.ID != 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM