2016-07-20 5 views
2

Возможно ли получить значение по умолчанию из переменной?Найти значение по умолчанию() из переменной

public static int CountNonDefault<T>(this T[] v) 
{ 
    int count = 0; 

    foreach (var item in v) 
    { 
     if (item.GetType != default(typeof(item))) 
     { 
      count++; 
     } 
    } 

    return count; 
} 

Я попытался следующим без толка:

item.GetType != default(item.GetType().GetProperty("Value").PropertyType) 
item.GetType != default(typeof(item)); 
item.GetType != default(item.GetType()); 
+0

Что item.GetType вернется? –

+0

Появляется, чтобы возвращать правильный тип, но когда он вложен в качестве значения по умолчанию (item.GetType()), компилятор выдает ошибку «item» является переменной, но используется как тип « –

+0

@JamesDudley Нет необходимости в этом, проверьте мой ответ ниже , Просто используйте 'default (T)' – user3185569

ответ

3

Поскольку item переменных родового типа T то как насчет default(T):

T defaultValue = default(T); 
foreach (T item in v) 
{ 
    if (item != defaultValue) 
    { 

    } 
} 

Чтобы использовать != для сравнения два объекты типа T вы должны изменить свой метод следующим образом:

public static int CountNonDefault<T>(this T[] v) : where T : EqualityComparer<T> 

Если это не является для вас варианты, то вы можете следовать этой альтернативе:

T defaultValue = default(T); 
foreach (T item in v) 
{ 
    if(item == null && defaultValue == null || (item.Equals(defaultValue))) 
    { 

    } 
} 

Это должно предотвратить .Equals() от бросать NullReferenceException

+0

Он работает! Покажите свой второй пример, поскольку я не знаком с ограничениями по параметрам типа; похоже, у меня есть чтение! –

Смежные вопросы