【问题标题】:Why am I getting "CS0472: The result of the expression is always true since a value of type int is never equal to null of type int?"为什么我会收到“CS0472:表达式的结果始终为真,因为 int 类型的值永远不会等于 int 类型的 null?”
【发布时间】:2011-10-09 13:24:02
【问题描述】:
string[] arrTopics = {"Health", "Science", "Politics"};

我有一个 if 语句,例如:

 if (arrTopics.Count() != null)

当我将鼠标悬停在上述语句上时,它会说:

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

我无法弄清楚它为什么这么说。有人可以帮帮我吗?

【问题讨论】:

标签: c# arrays


【解决方案1】:

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

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

【讨论】:

  • 我自己回答得再好不过了。补充一下,int 不可能为 null,因为它是 value type 而不是 reference type
  • @m.edmondson:但是Nullable<int> 是一个值类型,that 可以有一个空值,所以你的推理是行不通的。
  • @Jon Skeet - 抱歉,如果那是错误的,我会偏离我在the docs 中读到的“可空类型是 System.Nullable 结构的实例。”
  • @m.edmondson:是的,Nullable struct。所以是引用类型。更准确的说法是:int 不可能为 null,因为它是不可为空的值类型,而不是引用类型或可空值类型。
  • @Jon:我猜你想写“是的,Nullable struct。所以是 value 类型”
【解决方案2】:

你想在这里问什么?

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

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

   if(arrTopics !=null) ...

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这就是它所说的意思。

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

      你的支票应该是:

      if (arrTopics.Count() != 0)
      

      【讨论】:

      • Count() 的数组不是属性 - 它是方法
      • 糟糕,是的,打错了……我的错。代码表示方法,注释表示属性。我已经纠正了错位。
      【解决方案5】:

      就像错误所说,int 永远不能为空。我将代码更改为

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

      如果您知道 arrTopics 是一个数组并且永远不会为 null,则效率更高

      arrTopics.Length != 0
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            要弄清楚,请查看 Count() 扩展方法的声明。

            两块拼图:

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

            2. 通过对象类中的相等运算符定义的不等式,它在基类中定义。所以你上面提到的代码可以是完全有效的。不幸的是,为了区分基类中不需要(未覆盖)这种相等运算符出现的情况,有一些编译器警告,因为对于不兼容的类型,您确实会得到一个永远为假的条件(或获得一个永远为真的条件)在不等式运算符中)

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

            【讨论】:

              【解决方案9】:

              您的if 语句看起来不正确。我假设。你要么打算

              if(arrTopics?.Count() != null)
              

              if (arrTopics.Any())
              

              if (arrTopics != null)
              

              说明: sequence.Count() 返回int,它永远不会为空。添加问号? 返回Nullable<int> 而不是int。同样Count() 期望序列被实例化。在null 序列上使用Count() 方法会导致ArgumentNullException;因此,在使用 Count()Any() 扩展方法或使用问号之前,您始终需要检查 null 参考。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-07-23
                • 2013-08-19
                • 2011-09-05
                • 2021-12-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多