有没有办法知道这个问题的答案?
我在一个帖子中找到了一个非常类似的问题,位于如何检查对象是否可为空 。答案解释了如何确定对象是否可为空,如果有访问通用类型参数,则可以使用
换句话说,除了逐个检查每个可能的可空值类型之外,是否有更好的方法来确定装箱结构是否为值类型?
我在一个帖子中找到了一个非常类似的问题,位于如何检查对象是否可为空 。答案解释了如何确定对象是否可为空,如果有访问通用类型参数,则可以使用
Nullabe.GetUnderlyingType(typeof(T))
。但是,如果您只有一个不为null的对象,您能否确定它实际上是可空值类型?换句话说,除了逐个检查每个可能的可空值类型之外,是否有更好的方法来确定装箱结构是否为值类型?
void Main(){
Console.WriteLine(Code.IsNullableStruct(Code.BoxedNullable));
}
public static class Code{
private static readonly int? _nullableInteger = 43;
public static bool IsNullableStruct(object obj){
if(obj == null) throw new ArgumentNullException("obj");
if(!obj.GetType().IsValueType) return false;
return IsNullablePrimitive(obj);
}
public static bool IsNullablePrimitive(object obj){
return obj is byte? || obj is sbyte? || obj is short? || obj is ushort? || obj is int? || obj is uint? || obj is long? || obj is ulong? || obj is float? || obj is double? || obj is char? || obj is decimal? || obj is bool? || obj is DateTime? || obj is TimeSpan?;
}
public static object BoxedNullable{
get{ return _nullableInteger; }
}
}
更新
我在MSDN的这篇文章中发现,无法通过调用GetType()
方法来确定一个类型是否为可空结构。
更新 #2
显然,我建议的方法也不起作用,因为int x = 4; Console.WriteLine(x is int?);
的结果是True。(请参阅评论)
obj is int? == true
。 - porges