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

Ste*_*ris 6 c# generics reflection typeof

通常使用typeof获取未构造的泛型类型非常简单:

Type genericType = typeof( Func<> );
Run Code Online (Sandbox Code Playgroud)

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

Type genericNestedType = typeof( Func<Func<>> );
Run Code Online (Sandbox Code Playgroud)

通过Func<Func<object>>改为使用它来解决这个问题相对容易.但是,在你"消费"这种类型的地方,你必须记住打电话GetGenericTypeDefinition().

您可能希望"填满"所有未分配的泛型类型参数的方案是不可能的.同样,创建一个虚拟类型代替表示这些参数会相对容易.(例如Func<Func<ToReplace, object, int>>)

是否有任何理由typeof不适用于嵌套的通用未构造类型?

Jon*_*eet 6

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

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

我惊喜地看到,它有可能在执行时要做到:

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

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