我有以下代码片段,当Employee对象为NULL时,使TaskA运行(预计只有当Employee ID不等于1时才运行TaskA)。
if (Employee?.Id != 1) <PerformTaskA>;
这里,为什么C#编译器比较NULL和1?不应该抛出异常吗?另外,避免这类案件的更好做法是什么?
答案 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。
答案 2 :(得分:0)
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上的文档,该文档解释了这种行为。