为什么我得到“CS0472:表达式的结果总是为真,因为int类型的值永远不等于int类型的null?”

string[] arrTopics = {"Health", "Science", "Politics"}; 

我有一个if语句,如:

  if (arrTopics.Count() != null) 

当我将鼠标hover在上述语句上时,它说:

警告CS0472:表达式的结果始终为true,因为int类型的值永远不等于int类型的null?

我无法弄清楚为什么这么说。 有谁能够帮我?

int永远不能等于null。 int? 是可以为空的版本,可以等于null。

您应该检查if(arrTopics.Count() != 0)

null表示没有任何值,而不是数字0 。 并且正如消息所说,int永远不能为null因为它既不是引用类型也不是可空值类型,因此总是有一些值。

它意味着它所说的。

“Count”方法返回值类型。 这是一个整数。 它始终具有默认值为零的值。

你的检查应该是:

 if (arrTopics.Count() != 0) 

就像错误说的那样, int永远不会为null。 我将代码更改为

 if (arrTopics != null && arrTopics.Any()) 

或者甚至更高效,如果你知道arrTopics是一个数组,永远不会是null

 arrTopics.Length != 0 

你在这里问什么?

  Array.Count() returns an int which will never be null. 

如果您想知道Array是否已初始化,那么:

  if(arrTopics !=null) ... 

如果你想知道它是否已初始化但没有成员那么:

  if(arrTopics.Count() > 0) ... 

Null是一个特殊的指针值,而不是整数。 有可空类型,它们是null或基类型的可能值之一,但int本身不可为空。

因为Count方法总是返回整数,如果数组中没有元素,它将返回0,否则它将返回元素数。 所以你需要做的只是改为!= null make it != 0> 0

要想出来,请查看Count()扩展方法的geclaration。

两件拼图:

  1. 您正在尝试将非可空类型(int类型的值)与null进行比较,因此永远不会引用非可空类型,因为所有非可空类型都是C#中的值类型,无法引用。

  2. 通过对象类中的等式oerator定义的不等式,它在base中定义。 所以你上面提到的代码完全有效。 不幸的是,为了区分情况,当基类中不需要(未覆盖)的等式运算符出现时,会有一些编译器对它进行警告,因为对于不兼容的类型(或者获得始终为真的条件),您将真正得到一个始终为假的条件在不平等运算符中)

值类型(不可为空)和可空类型(引用类型)是C#中不兼容的类型。 有关更多信息,请查看ECMA论文,了解C#语言中使用的类型系统的定义。