如果struct不可为空,则在C#中检查struct的null

时间:2011-10-25 19:27:11

标签: c# .net c#-4.0

我有一些通用的方法

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

如果T是班级,那就很好。但是如果T是struct,我该怎么办?如果result == default(T)T,我如何检查struct是否有效?

P.S。我不想使用约束where T: classNullable类型。

3 个答案:

答案 0 :(得分:2)

如果将T编译为struct,那么与null的比较将始终评估为false。这将在C#语言规范的第7.9.6节中介绍

  

如果将类型参数类型T的操作数与null进行比较,并且T的运行时类型是值类型,则比较结果为false。

答案 1 :(得分:2)

更为惯用的做法是遵循int.TryParse之类的内容。

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

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

    if(func(out value))
    {

    }
}

答案 2 :(得分:0)

考虑使用默认值(T):

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