如何从一个类型变量创建一个 Nullable<T>?

4

我正在处理表达式,需要一个方法,该方法接收一个某种类型(目前未知)的对象。类似于以下内容:

public static void Foobar(object Meh) { }

我需要做的是使这个方法返回一个Nullable<T>版本的Meh,但类型T来自于Meh.GetType()。因此返回值将是Nullable<MehType>,其中MehTypeMeh的类型。
有什么想法或建议吗?
谢谢
更新:我需要这样做的原因是因为出现了以下异常:The binary operator Equal is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'.
return Expression.Equal(leftExpr, rightExpr);

其中leftExpr是一个System.Nullable1[[System.Int32,而rightExpr则是一个System.Int32

2个回答

3
如果在编译时不知道类型,则唯一表达它的方式是使用object,并且一旦将可空值类型装箱,就会得到一个null引用或一个装箱的非可空值类型。因此,从结果上看,这些代码片段是完全等价的
int? nullable = 3;
object result = nullable;

int nonNullable = 3;
object result = nonNullable;

换句话说,我认为你无法真正表达你想做的事情。

在阅读了您、recursive和FishBasketGordo的评论后,我明白了这是不可能表达的。所以我找到了另一种方法:在表达式中将可空类型转换回原始类型。 - Ricardo

2

你是否必须使用 Meh.GetType() 而非泛型?那么这个呢?

public static Nullable<T> Foobar<T>(T Meh) where T : struct { }

我假设“某种类型”并不意味着“任何类型”,因为上面的解决方案只适用于值类型。

2
需要一个“where T : struct”的约束条件。 - Mark H
我已经尝试过了,但是没成功。Meh 的类型是 object(但它也可以是 stringInt32 或其他类型)。错误信息显示:“在泛型类型或方法中,'object' 类型必须是非可空值类型,以便将其用作参数 'T'。” - Ricardo
那么,您需要一个方法,仅在参数的运行时类型为值类型时返回可空类型? - FishBasketGordo
“value type” 是什么意思? - Ricardo
1
C#有引用类型和值类型。一般来说,引用类型存储在堆内存中,可以是它们自己的null,而值类型存储在栈内存中,必须有一个值,即不能自己为null。(当然还有更多细节,但那是一个更大的讨论。)这就是为什么我们有Nullable<T>结构体,使得值类型的行为有点像引用类型。 - FishBasketGordo
2
@ricardo:Nullable<string>是不存在的。你可以试一下!Nullable<T>只适用于非可空类型的T - recursive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接