Nullable.GetNullableType 方法的行为
Behavior of Nullable.GetNullableType method
我有一些 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
...
我见过类似的代码片段似乎可以工作,所以我不确定为什么我的代码片段不起作用。我注意到的一件事是类型名称末尾有一个 & - 这可能很重要吗?
感谢您的帮助!
重现您的问题的方法如下:
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
我有一些 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
...
我见过类似的代码片段似乎可以工作,所以我不确定为什么我的代码片段不起作用。我注意到的一件事是类型名称末尾有一个 & - 这可能很重要吗?
感谢您的帮助!
重现您的问题的方法如下:
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