Объявление класса с переключателем выдает предупреждение о том, что код int, если инструкция всегда возвращает истину, но ложный регистр кода также работает

При использовании пользовательского класса есть ключ, который принимает int. Затем коммутатор заполняет класс, где в некоторых случаях задано число, а в некоторых нет. Тип int может находиться практически в любом месте приложения, но в некоторых случаях его нет. При просмотре newClass пользователю необходимо увидеть, какие из них не имеют номера. Этот код ниже работает нормально, за исключением того, что есть предупреждение, которое необходимо удалить для: "Результат сравнения типа значения newClass.num с нулевым есть true"и" Обнаружен недоступный код "для ложной части утверждения.

Есть ли метод или лучшие практики, которые можно использовать для проверки на наличие частей класса nullReferenced? Как называется ситуация такого типа (т. Е. Ненулевое рефинансирование, тестирование nullReference) (... потому что я не знаю, что искать)?

using system.generic;
using system.generic.collections;

public Class newClass{
    string name;
    int num;
    public newClass(int index){
        switch(index){
            case 1:
                num = 20;
                name = "returns true";
                break;
            case 2:
                // no num here
                name = "returns false";
            default :
                break;
        }
    }
}
public otherClass{
    newClass foo = new newClass(1);
    newClass bar = new newClass(2);

    List<newClass> newClassList = new List<newClass>();
    newClassList.add(foo);
    newClassList.add(bar);

    foreach(newClass nc in newClassList){
        if(nc.num != null){
            print("True");
        } else {
            print("False");
        }
    }
}

2 ответа

Решение

Значение определяется как int который является типом значения в C#, таким образом, не обнуляется. Вы можете удалить свои предупреждения, либо сделав его int?обнуляемое целое число Или, в случае 0 не является возможным значением для num в вашем сценарии измените ваше состояние на:

// default(int) will be 0, the default value for a C# int
if(nc.num != default(int)){
    print("True");
} else {
    print("False");
}

Вы не можете проверить переменную с нулевым значением, за исключением того, что она может быть обнуляемой (как строка)

итак: 1) изменить: int num; быть: int? Num;

2) удалить еще

foreach (newClass nc in newClassList)
    {
        if (nc.num != null) //warning will disappear because   num is nullable
        {
            print("True");
        }
        print("False");

    }

Я изменил ваш код, чтобы избежать ошибки компиляции

using System.Collections.Generic;
public class newClass
{
public string name;
public int? num;
public newClass(int index)
{
    switch (index)
    {
        case 1:
            num = 20;
            name = "returns true";
            break;
        case 2:
            // no num here
            name = "returns false";
            break;
        default:
            break;
    }
}
}
public class otherClass
{
newClass foo = new newClass(1);
newClass bar = new newClass(2);

List<newClass> newClassList = new List<newClass>();
public otherClass()
{
    newClassList.Add(foo);
    newClassList.Add(bar);

    foreach (newClass nc in newClassList)
    {
        if (nc.num != null)
        {
            print("True");
        }
        print("False");

    }
}

private void print(string msg)
{
    throw new System.NotImplementedException();
}
}
Другие вопросы по тегам