Почему я получаю "CS0472: результат выражения всегда истинен, так как значение типа int никогда не равно нулю типа int?"

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

У меня есть утверждение if, как:

 if (arrTopics.Count() != null)

Когда я наводю указатель мыши на приведенное выше утверждение, оно говорит:

Предупреждение CS0472: результат выражения всегда истинен, поскольку значение типа int никогда не равно нулю типа int?

Я не могу понять, почему он так говорит. Кто-нибудь может мне помочь?

Ответ 1

int никогда не может быть равно null. int? - это нулевая версия, которая может быть равна нулю.

Вместо этого нужно проверить if(arrTopics.Count() != 0).

Ответ 2

Это означает, что он говорит.

Метод "Count" возвращает тип значения. Это целое число. Он всегда будет иметь значение, где значение по умолчанию равно нулю.

Ваша проверка действительно должна быть:

if (arrTopics.Count() != 0)

Ответ 3

null означает отсутствие какого-либо значения, а не числа 0. И поскольку в сообщении говорится, что int никогда не может быть null, поскольку он не является ссылочным типом или типом значения NULL, и поэтому всегда имеет некоторое значение.

Ответ 4

Что вы пытаетесь задать здесь?

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

Если вы хотите узнать, был ли инициализирован массив, выполните следующие действия:

   if(arrTopics !=null) ...

если вы хотите узнать, была ли она инициализирована, но не имеет следующих элементов:

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

Ответ 5

Как и в случае ошибки, int никогда не может быть нулевым. Я бы изменил код на

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

Или даже более эффективный, если вы знаете, что arrTopics - это массив и никогда не имеет значения

arrTopics.Length != 0

Ответ 6

Null - это специальное значение указателя, а не целое число. Существуют типы с нулевым значением, которые являются либо нулевыми, либо одним из возможных значений для базового типа, но сам int не является нулевым.

Ответ 7

Поскольку метод Count всегда возвращает целое число, если никакие элементы в массиве не возвращают 0, то он возвращает число элементов. Итак, что вам нужно сделать, просто вместо этого != null сделать его != 0 или > 0

Ответ 8

Чтобы понять это, просмотрите описание метода расширения Count().

Головоломка из двух частей:

  • Вы пытаетесь сравнить тип с недействительным значением (значение типа int) с нулевым значением, поэтому к типам с нулевым значением никогда не ссылаются, поскольку все типы, которые не являются нулевыми, являются типами значений в С#, что не может ссылаться.

  • Неравенство, определенное посредством равенства oerator в классе объектов, которое определено в базе. поэтому ваш код, упомянутый выше, может быть абсолютно прав. К сожалению, чтобы отличить ситуацию, когда этот внешний вид оператора равенства не желателен (не переопределен) в базовых классах, есть некоторые вопиющие компиляторы об этом, потому что вы действительно получите всегда ложное условие для несовместимых типов (или получите всегда-истинное условие в операторе неравенства)

И типы значений (non-nullable) и типы с нулевым значением (ссылочные типы) являются несовместимыми типами на С#. Для получения дополнительной информации просмотрите документы ECMA для стандартного определения для системы типов, используемой на языке С#.

Ответ 9

Ваше утверждение if выглядит неправильно. Я предполагаю. Вы либо хотели

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

ИЛИ

if (arrTopics.Any())

ИЛИ

if (arrTopics != null)

Объяснение: sequence.Count() возвращает int, который никогда не бывает нулевым. Добавление знака вопроса ? возвращает Nullable<int> вместо int. Также Count() ожидает, что последовательность будет создана. использование метода Count() для последовательности null приводит к ArgumentNullException; поэтому вам всегда нужно сверяться со ссылкой null, прежде чем переходить к методам расширения Count(), Any() или использовать знак вопроса.