Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可为null的create via reflection,HasValue=false,仅给定'type'类型的参数_C#_Reflection_Nullable - Fatal编程技术网

C# 可为null的create via reflection,HasValue=false,仅给定'type'类型的参数

C# 可为null的create via reflection,HasValue=false,仅给定'type'类型的参数,c#,reflection,nullable,C#,Reflection,Nullable,给定一个可为null的类型参数,如何创建具有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 } 给定一个类

给定一个可为
null的类型参数
,如何创建具有
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
}
给定一个类型参数,它是可为空的,如何创建HasValue=false的该类型的实例

如果您想要一个签名为
object
的方法,只需返回
null

//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
    return null;
}
当然,如果
type
不能保证是可为空的值类型,则可能需要对代码进行条件化。。。但重要的是要理解,不存在可为
null的
值的对象表示。即使对于非null值,装箱表示也是不可为null类型的装箱表示:

给定一个类型参数,它是可为空的,如何创建HasValue=false的该类型的实例

如果您想要一个签名为
object
的方法,只需返回
null

//type is guaranteed to be implement from Nullable<>
public static object Create(Type type)
{
    return null;
}
当然,如果
type
不能保证是可为空的值类型,则可能需要对代码进行条件化。。。但重要的是要理解,不存在可为
null的
值的对象表示。即使对于非null值,装箱表示也是不可为null类型的装箱表示:


高度危险的(不建议用于非测试目的)是使用“方法
UnsafeTools.Box(T?null)
”。它绕过了可空类型的常规装箱(装箱或返回null),而是创建了可空的实际实例。请注意,使用这样的实例可能会有很大的问题

public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
    return UnsafeTools.Box(default(T?));
}
publicstaticobjectcreate(),其中T:struct//T必须是普通结构,不能为null
{
返回UnsafeTools.Box(默认值(T?);
}

高度危险(不建议用于非测试目的)是使用“方法
UnsafeTools.Box(T?null)
”。它绕过了可空类型的常规装箱(装箱或返回null),而是创建了可空的实际实例。请注意,使用这样的实例可能会有很大的问题

public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
    return UnsafeTools.Box(default(T?));
}
publicstaticobjectcreate(),其中T:struct//T必须是普通结构,不能为null
{
返回UnsafeTools.Box(默认值(T?);
}

我需要这样做的原因是,当实例为null时,我需要支持对Nullable上的方法的调用。当检索HasValue=false的可空属性的值时,反射返回
null
,这当然不同于“普通”编译代码中的行为。@IanNewson:您在这里没有给出任何上下文,但您需要了解可空值类型的装箱规则。上下文是我负责一个LINQ提供程序,该提供程序出于性能原因对表达式本身中的大量代码进行求值,而不是将表达式编译为
Func
或类似的。在null
Nullable
s上调用方法似乎是反射API无法处理的边缘情况,即调用
getValueOrDefault.Invoke(aNullNullable)
throws。我正在努力解决这个问题。@IanNewson:如果没有看到任何实际的反射代码,很难判断您看到了什么。听起来你应该问一个新问题,基于这样一个理解,即装箱的可空值是“装箱的基础值”或“空引用”。我需要这样做的原因是,当实例为空时,我需要支持对可空方法的调用。当检索HasValue=false的可空属性的值时,反射返回
null
,这当然不同于“普通”编译代码中的行为。@IanNewson:您在这里没有给出任何上下文,但您需要了解可空值类型的装箱规则。上下文是我负责一个LINQ提供程序,该提供程序出于性能原因对表达式本身中的大量代码进行求值,而不是将表达式编译为
Func
或类似的。在null
Nullable
s上调用方法似乎是反射API无法处理的边缘情况,即调用
getValueOrDefault.Invoke(aNullNullable)
throws。我正在努力解决这个问题。@IanNewson:如果没有看到任何实际的反射代码,很难判断您看到了什么。听起来你应该问一个新的问题,基于这样的理解,一个装箱的可空值要么是“装箱的基础值”要么是“空引用”。所以如果你调用
Create().GetType()
,它会有效地返回
typeof(int?
?真有趣…@乔恩,没错。甚至可以将其强制转换回
(int?
。因此,如果调用
Create().GetType()
,是否会有效地返回
typeof(int?
?真有趣…@乔恩,没错。甚至可以将其转换回
(int?
)。
public static object Create<T>() where T : struct //T must be a normal struct, not nullable
{
    return UnsafeTools.Box(default(T?));
}