Проверьте на ноль для структуры в C #, если структура не обнуляема - PullRequest
4 голосов
/ 25 октября 2011

У меня есть какой-то общий метод

T SomeMethod(Func<T> func){
   T result = func();
     if (result != null)
       { //.....}
}

Хорошо работает, если T класс. Но что мне делать, если T является struct? Как я могу проверить, если result == default(T), если T равно struct?

P.S. Я не хочу использовать ограничения типа where T: class или Nullable.

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Более идиотский способ сделать это - следовать примеру таких, как int.TryParse.

public delegate bool TryFunction<T>(out T result);

T SomeMethod(TryFunction<T> func)
{
    T value;

    if(func(out value))
    {

    }
}
2 голосов
/ 25 октября 2011

Если T скомпилировано как struct, тогда сравнение с null всегда будет иметь значение false.Это описано в разделе 7.9.6 спецификации языка C #

Если операнд типа параметра типа T сравнивается с нулевым, а тип времени выполнения T является типом значения, результатсравнение неверно.

0 голосов
/ 26 октября 2011

Рассмотрим использование по умолчанию (T):

private T SomeMethod<T>(Func<T> func)
{
  var result = func();
  if (result.Equals(default(T)))
  {
    // handling ...
    return default(T);
  }
  return result;
}
...