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

时间:2018-05-18 07:05:55

标签: c#

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

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

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

4 个答案:

答案 0 :(得分:2)

  

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

因为Nullable<T>能够与T进行比较(或在这种情况下实际int变为int?)。在你的情况下,它以null != 1结束,这总是正确的。

对您而言最简单的方法是明确说明:

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

答案 1 :(得分:1)

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

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&gt; = num2返回false(但num1&lt; num2也为false)

  •   
  • num1&lt; num2返回false(但num1&gt; = num2也为false)

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

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

  •   
     

* /

检查此Microsoft doc

检查Live Fiddle here

答案 2 :(得分:0)

如果Employee为null,

Employee?.Id将评估为null ?. and ?[] null-conditional Operators

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

Debug.WriteLine(null != 1);

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

它不会抛出异常。你为什么不测试这个?

使用

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

答案 3 :(得分:-1)

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

为此,你需要:

var pixelateMatrix = gpu.createKernel(function(inputBuffer, width, height, scale) {
  var y = Math.floor(this.thread.x / (width[0] / scale[0]) * 4);
  var x = this.thread.x % ((width[0] / scale[0]) * 4);
  var remainder = this.thread.x % 4;
  return inputBuffer[x * (width[0] * 4) + y * 4 + remainder];
}).setOutput([width * height * 4]);

(注意:我假设if (employee == null) { PerformTaskA(); } 引用了一个对象而不是它的类/与naming standards一致,我认为employee而不是Employee )。

您是否只是与1进行比较,因为ID 1表示员工不为空?如果员工不是null但有任何ID不是一个,那么这也会导致你的任务运行;虽然我怀疑你意识到了吗?

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