为什么不能推断嵌套泛型类型?

时间:2011-07-08 21:26:50

标签: c# .net generics nested-generics

鉴于以下课程......

public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}

......以及以下方法......

public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
    where TFoo : FooBase<TBar>
    where TBar : BarBase
{
    return default(TBar);
}

为什么以下代码行不能表示返回类型?

Bar1 myBar = DoSomething(new Foo1());

相反,我必须指定像这样的通用类型......

Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());

1 个答案:

答案 0 :(得分:21)

方法类型推断忽略方法类型参数(*)的泛型约束。方法类型推断仅限于通过将参数形式参数类型进行比较而进行的推算。由于您的形式参数类型中出现的唯一泛型类型参数是TFoo,因此无法推断出TBar。

许多人认为这个设计决定是错误的,错误的,错误的。虽然我明白了这一点,但这个决定确实导致我认为一些不错的属性。关于这个问题的扩展辩论,请参阅这篇博客文章中的大量评论,告诉我我错了,错了,错了:

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx


(*)请注意,我说方法类型参数的约束被忽略,而不是一般的约束。如果推导出的形式参数类型构造为泛型类型,使得构造违反它们的类型参数约束,那么这个事实导致类型推断失败并且该方法不是重载解析的候选者。但在任何情况下,我们从“Hmm以外的约束”中扣除,显然这不会起作用。