null的行为.GetNullableType方法

本文关键字:GetNullableType 方法 null | 更新日期: 2023-09-27 18:17:56

我有一些c#代码来检测类型是否为空,并获得底层类型,如果是:

...
    Log.DebugFormat("type is {0}", type.FullName);
    Type underlyingType = Nullable.GetUnderlyingType(type);
    if (underlyingType != null)
    {
        Log.DebugFormat("underlying type is {0}", underlyingType);
    }
    else
    {
        Log.DebugFormat("underlying type is null");
    }
...

不幸的是,它似乎不起作用。如果类型为可空int,则输出如下:

...
    type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]&
    underlying type is null
...

我已经看到了类似的代码片段,似乎工作,所以我不知道为什么我的不工作。我注意到的一件事是类型名有一个&最后,这有意义吗?

谢谢你的帮助!

null的行为.GetNullableType方法

如何复制您的问题:

void Main()
{
    Type type;
    type = this.GetType().GetMethod("Method").GetParameters()[0].ParameterType;
    Console.WriteLine("type is {0}", type.FullName);
    Type underlyingType = Nullable.GetUnderlyingType(type);
    if (underlyingType != null)
    {
        Console.WriteLine("underlying type is {0}", underlyingType);
    }
    else
    {
        Console.WriteLine("underlying type is null");
    }
}
public void Method(out int? value)
{
    value = 42;
}

我得到这个:

type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]&
underlying type is null

给出的是名称末尾的&。这意味着它是一个out参数。所以,你的类型不只是int?,它是out int?

您需要在您的类型上调用.GetElementType()才能按预期工作。

如果我这样做:

type = this.GetType().GetMethod("Method").GetParameters()[0].ParameterType.GetElementType();

则输出为:

type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
underlying type is System.Int32