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<>>既不是有效的类型构造,也不是有效的 unbind -type-name构造。

至于为什么是这种情况:我的猜测是很少需要它(我甚至从来没有想过使用它,也没有听到任何人要求它),因此语言设计,编译器实现和测试方面的额外复杂性被认为超过了好处。正如Eric Lippert喜欢指出的那样,"为什么c#没有X特性"的问题经常出现:)

我惊喜地发现在执行时是可能的:

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

我有一半的希望它在。net类型系统中是无效的,尽管我认为这可能会导致其他问题。

我怀疑的主要原因是typeof( Func<Func<>> )不是很有用。它不是一个完全构造的类型,所以你不能使用它做任何事情——它也不是一个泛型类型定义,所以你不能调用MakeGenericType(...)来将T添加到外部类型——它是内部类型,需要T,所以你需要做这样的事情:

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

那么简单…在typeof(Func<Func<>>)中没有实际用途- 更容易从头开始

相关内容

  • 没有找到相关文章

最新更新