typeof为未构造的嵌套泛型类型提供异常'Type expected`

时间:2011-11-04 19:25:18

标签: c# generics reflection typeof

通常使用typeof

获取未构造的泛型类型非常简单
Type genericType = typeof( Func<> );

我希望以下内容也能正常工作,但它会产生编译错误Type expected

Type genericNestedType = typeof( Func<Func<>> );

使用Func<Func<object>>来解决此问题相对容易。但是,在您“消费”该类型的情况下,您必须记住调用GetGenericTypeDefinition()

您无法“填满”所有未分配的泛型类型参数的情况。同样,创建一个虚拟类型代替表示这些参数会相对容易。 (例如Func<Func<ToReplace, object, int>>

是否有任何理由说明typeof无法对嵌套的通用非构造类型起作用?

2 个答案:

答案 0 :(得分:6)

我不相信这是一个编译器错误--C#4规范的第7.6.11节(typeof运算符)似乎没有给出任何会导致它有效的语法; Func<Func<>>既不是有效的类型结构,也不是有效的 unbound-type-name 结构。

至于为什么虽然情况如此:我的猜测是它很少需要(我以前从未想过以前使用它,也没有听到有人要求它因此,语言设计,编译器实现和测试的额外复杂性被认为超过了收益。这通常就是“为什么C#不具备X特征”的问题,因为Eric Lippert喜欢指出:)

我很高兴看到 可以在执行时间做到:

Type unbound = typeof(Func<>);
Type partiallyBound = unbound.MakeGenericType(new[] { unbound });
Console.WriteLine(partiallyBound);        

我有一半期望它在.NET类型系统中无效,尽管我预计这可能会导致其他问题。

答案 1 :(得分:0)

我怀疑的主要原因只是typeof( Func<Func<>> )不会非常有用。它不是一个完全构造的类型,所以你不能使用任何东西 - 它也不是泛型类型定义,所以你不能调用MakeGenericType(...)来添加T到外部类型 - 内部类型需要T,因此您需要执行以下操作:

var closedType = type.GetGenericTypeDefinition().MakeGenericType(
    type.GetGenericTypeArguments().MakeGenericType(finalT)
);

如此简单......在typeof(Func<Func<>>)中没有真正的用处 - 从头开始​​更容易