通常使用typeof
获取未构造的泛型类型非常简单Type genericType = typeof( Func<> );
我希望以下内容也能正常工作,但它会产生编译错误Type expected
。
Type genericNestedType = typeof( Func<Func<>> );
使用Func<Func<object>>
来解决此问题相对容易。但是,在您“消费”该类型的情况下,您必须记住调用GetGenericTypeDefinition()
。
您无法“填满”所有未分配的泛型类型参数的情况。同样,创建一个虚拟类型代替表示这些参数会相对容易。 (例如Func<Func<ToReplace, object, int>>
)
是否有任何理由说明typeof
无法对嵌套的通用非构造类型起作用?
答案 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<>>)
中没有真正的用处 - 从头开始更容易。