使用"isnot"运算符的 C# 类型检查不起作用



我正在做这个布尔检查,但它不起作用,我真的不知道为什么。

我有一个变量:dynamic value;假设这个变量的类型是BuiltInClass。现在我正在做这个检查:

if (value is not BuiltInClass || value is not ClassValue)
{
// Execute code
}

但是这个代码仍然执行。谁能解释一下吗?

您误解了布尔表达式。

假设value是类型BuiltInClass:

然后

  • value is not BuiltInClass将为false
  • value is not ClassValue将为真

因此

value is not BuiltInClass || value is not ClassValue

解析为

false || true => true

你"固定的";这是通过使用if (!(value is BuiltInClass || value is ClassValue))来实现的,但这与您的原始代码不等价!

它相当于:

if (value is not BuiltInClass && value is not ClassValue) 

请注意使用&&而不是||

有关布尔变换的更多信息,请参阅德摩根定律。

特别要注意的是转换:

not (A or B) = (not A) and (not B)

您的修复是not (A or B),但根据德摩根定律,您可以通过将其更改为(not A) and (not B)来修复它。

由于注释部分,我找到了解决方案。所以我换了if (value is not BuiltInClass || value is not ClassValue)到CCD_ 13,现在它工作了。

相关内容

最新更新