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

标签 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有什么原因吗?不适用于嵌套的泛型未构造类型?

最佳答案

我不认为这是一个编译器错误——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/

相关文章:

c# - 记录类名和方法名的最有效方法是什么?

c# - 如何自动添加当前程序集中的所有 EntityTypeConfiguration<>?

c# - Where 子句的调用频率高于项目计数

java - 枚举作为类中的泛型类型,但使用方法需要显式强制转换

java - 如何从泛型类调用静态方法?

"Object"类的 java 泛型函数参数类型不匹配

java - 如何在没有 Java 9+ 非法访问警告的情况下从进程获取 pid?

c# - 实现 IDataGridViewEditingCell 但也有编辑控件的自定义 DataGridView 列?

c# - 我如何使用 C# 写入 Windows 事件日志(我遇到了某种错误)?

c# - 如何检索 Yahoo 的联系人 API 的 GUID