通常使用 typeof 获取未构造的泛型类型非常容易:
Type genericType = typeof( Func<> );
我希望下面的代码也能正常工作,但它给出了一个编译器错误 Type expected
.
Type genericNestedType = typeof( Func<Func<>> );
使用 Func<Func<object>>
解决这个问题相对容易反而。但是,在您“使用”类型的地方,您必须记住调用 GetGenericTypeDefinition()
.
您想要“填满”所有未分配的泛型类型参数的场景是不可能的。同样,创建一个虚拟类型来指示这些参数会相对容易。 (例如 Func<Func<ToReplace, object, int>>
)
typeof
有什么原因吗?不适用于嵌套的泛型未构造类型?
最佳答案
我不认为这是一个编译器错误——C# 4 规范的第 7.6.11 节(typeof
运算符)似乎没有给出任何使其有效的语法; Func<Func<>>
既不是有效的 type 结构,也不是有效的 unbound-type-name 结构。
至于为什么是这样:我的猜测是它很少被需要(我以前从未想过使用它,也没有听到有人要求它) 因此,语言设计、编译器实现和测试的额外复杂性被认为超过了好处。 “为什么 C# 没有功能 X”问题通常就是这种情况,正如 Eric Lippert 喜欢指出的那样:)
令我惊喜的是,它可以在执行时执行:
Type unbound = typeof(Func<>);
Type partiallyBound = unbound.MakeGenericType(new[] { unbound });
Console.WriteLine(partiallyBound);
我有一半希望它在 .NET 类型系统中无效,尽管我预计这可能会导致其他问题。
关于c# - typeof 为未构造的嵌套泛型提供异常 'Type expected`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8014704/