给定一个Nullable<>
的类型参数,如何创建具有HasValue = false
的该类型的实例?
换句话说,填写此代码:
//type is guaranteed to implement Nullable<>
public static object Create(Type type)
{
//Instantiate a Nullable<T> with reflection whose HasValue = false, and return it
}
我的尝试,由于没有默认构造函数,因此无效(它会抛出NullReferenceException
):
static void Main(string[] args)
{
Console.WriteLine(Create(typeof(Nullable<int>)));
Console.ReadLine();
}
//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
//Instantatie a Nullable<T> with reflection whose HasValue = false, and return it
return type.GetConstructor(new Type[0]).Invoke(new object[0]);
}
答案 0 :(得分:4)
给定一个
Nullable<>
的类型参数,如何创建一个HasValue = false的该类型的实例?
如果您想要一个签名为object
的方法,只需返回null
:
//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
return null;
}
这将永远是HasValue
为空的任何可空类型值的盒装表示。换句话说,这种方法毫无意义......你也可以使用null
文字:
var i = (int?) null;
当然,如果type
不能保证为可以为空的值类型,您可能需要对代码进行条件化...但了解有没有重要信息非常重要诸如Nullable<T>
值的对象表示之类的东西。即使对于非空值,盒装表示也是非可空类型的盒装表示:
int? x = 5;
object y = x; // Boxing
Console.WriteLine(y.GetType()); // System.Int32; nullability has vanished
答案 1 :(得分:0)
非常危险(不建议用于非测试目的)是使用SharpUtils&#39;方法UnsafeTools.Box<T>(T? nullable)
。它绕过了可以为空的类型的正常装箱,它可以装入它们的值或返回null,而是创建一个Nullable<T>
的实际实例。请注意,使用这样的实例可能非常错误。
public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
return UnsafeTools.Box(default(T?));
}