为什么不能推断嵌套generics类型?
鉴于以下课程……
public abstract class FooBase where TBar : BarBase{} public abstract class BarBase{} public class Bar1 : BarBase{} public class Foo1 : FooBase {}
……以及以下方法……
public TBar DoSomething(TFoo theFoo) where TFoo : FooBase where TBar : BarBase { return default(TBar); }
为什么下面的代码行不能表示返回类型?
Bar1 myBar = DoSomething(new Foo1());
相反,我必须指定像这样的generics类型……
Bar1 myBar = DoSomething(new Foo1());
方法类型推断忽略方法类型参数(*)的通用约束。 方法类型推断仅限于可以通过将参数与forms参数类型进行比较而进行的推断。 由于正式参数类型中出现的唯一generics类型参数是TFoo,因此无法推断出TBar。
很多人认为这个设计决定是错误的,错误的,错误的。 虽然我明白了这一点,但这个决定确实导致了一些不错的属性。 关于这个问题的扩展辩论,请参阅这篇博客文章中的大量评论,告诉我我错了,错了,错了:
(*)请注意,我说方法类型参数的约束被忽略,而不是一般的约束。 如果推导出的forms参数类型构造为generics类型,使得构造违反其类型参数约束,则此事实导致类型推断失败,并且该方法不是重载解析的候选者。 但在任何情况下,我们都不会从“嗯,显然这不起作用”之外的约束中做出推论 。