测试Type是否为Nullable的不同方法?

时间:2012-01-16 15:31:42

标签: c# nullable

以下是我用来检测我们是否正在处理Nullable类型的条件:

System.Nullable.GetUnderlyingType(itemType) != null

这里是队友的代码:

itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>)

我们实际上并没有找到一个案例,其中一个将返回true而另一个false(反之亦然),但这两个片段是否完全相同?

5 个答案:

答案 0 :(得分:4)

来自MSDN for Nullable.GetUnderlyingType Method

  

nullableType参数的type参数,如果nullableType参数是封闭的通用可空类型;否则,null。

所以,是的,使用以前的版本是安全的。

从GetUnderlyingType反编译:

public static Type GetUnderlyingType(Type nullableType)
{
  if (nullableType == null)
    throw new ArgumentNullException("nullableType");
  Type type = (Type) null;
  if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && nullableType.GetGenericTypeDefinition() == typeof (Nullable<>))
    type = nullableType.GetGenericArguments()[0];
  return type;
}

答案 1 :(得分:1)

这两个片段并不完全相同 以下是为每个片段返回不同值的测试用例:

Type t = typeof(Nullable<>);

bool c1 = Nullable.GetUnderlyingType(t) != null; //false
bool c2 = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>); //true

因此Nullable.GetUnderlyingType方法更安全,因为它的实现已包含此测试用例检查:

public static Type GetUnderlyingType(Type nullableType) {
    if (nullableType == null) 
        throw new ArgumentNullException("nullableType");
    Type type = null;
    if ((nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition)
        && (nullableType.GetGenericTypeDefinition() == typeof(Nullable<>))) {
        type = nullableType.GetGenericArguments()[0];
    }
    return type;
}

答案 2 :(得分:1)

您的队友的代码非常好,如MSDN文档(摘录)中所示: 使用以下代码确定Type对象是否表示Nullable类型。请记住,如果从调用GetType返回Type对象,则此代码始终返回false。

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}

在下面的MSDN链接中解释:

http://msdn.microsoft.com/en-us/library/ms366789.aspx

此外,在此SO QA上也有类似的讨论:

How to check if an object is nullable?

答案 3 :(得分:0)

每当测试一个类型是否可以为空时,我总是使用你发布的第二种方法:

itemType.IsGenericType && itemType.GetGenericTypeDefinition() == typeof(Nullable<>) 

我没有遇到过这个问题!

问候,

答案 4 :(得分:0)

dotPeek显示了这一点:

public static Type GetUnderlyingType(Type nullableType)
{
  if (nullableType == null)
    throw new ArgumentNullException("nullableType");
  Type type = (Type) null;
  if (nullableType.IsGenericType && !nullableType.IsGenericTypeDefinition && object.ReferenceEquals((object) nullableType.GetGenericTypeDefinition(), (object) typeof (Nullable<>)))
    type = nullableType.GetGenericArguments()[0];
  return type;
}

我看到的唯一区别是itemType本身是通用的,即。 typeof (List<>),他的意志会失败。而你的速度稍慢,因为它必须实际找到基础类型。