16

鉴于以下课程...

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());
4

1 回答 1

23

方法类型推断忽略方法类型参数 (*) 上的通用约束。方法类型推断仅对可以通过将实参与形式参数类型进行比较而得出的推论进行推理。由于在您的形式参数类型中出现的唯一泛型类型参数是 TFoo,因此无法推导出 TBar。

许多人认为这个设计决定是错误的、错误的、错误的。尽管我同意他们的观点,但这个决定确实导致了我认为一些不错的属性。有关此问题的扩展辩论,请参阅此博客文章上的大量评论,告诉我我错了,错了,错了:

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


(*) 请注意,我说的是忽略方法类型参数的约束,而不是一般的约束。如果推导的形式参数类型是构造的泛型类型,因此构造违反了它们的类型参数约束,那么这个事实会导致类型推断失败,并且该方法不是重载决议的候选者。但在任何情况下,我们都不会从“嗯,显然这行不通”之外的约束中进行扣除。

于 2011-07-08T21:33:58.580 回答