2016-07-14 4 views
0

При использовании пользовательского класса есть переключатель, который принимает int. Затем коммутатор заполняет класс, в котором некоторые случаи имеют число, а некоторые нет. Int может варьироваться практически в любом месте приложения, но в некоторых случаях его нет. Когда просматривается newClass, пользователь должен видеть, у кого нет номера. Этот код ниже работает отлично, за исключением того, что есть предупреждение, которое необходимо удалить для: «Результат сравнения значения типа newClass.num с нулевым значением - true« и «Недопустимый код обнаружен» для ложной части инструкции.Объявление класса с помощью переключателя дает предупреждение о том, что код является int, если оператор всегда возвращает true, но также работает ложный код кода

Есть ли способ или наилучшая практика, которая может быть использована для проверки нулевых частей класса? Что называется типом такого типа (т. Е. Не-nullable refencing, nullReference testing) (... потому что я не знаю, что искать)?

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"); 
     } 
    } 
} 
+0

'num' является' int', который является значением типа, поэтому она не может быть «null». –

+0

'.num' не может быть недействительным. –

ответ

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"); 
} 
+0

Спасибо. Int? определенно что-то посмотреть. Этот вопросительный знак был, безусловно, залогом. –

0

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

так : 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(); 
} 
}