首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能推断嵌套泛型类型?

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

Stack Overflow用户
提问于 2011-07-09 05:26:50
回答 1查看 3.1K关注 0票数 16

给定以下类...

代码语言:javascript
复制
public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}

...and下面的方法...

代码语言:javascript
复制
public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
    where TFoo : FooBase<TBar>
    where TBar : BarBase
{
    return default(TBar);
}

为什么下面这行代码不能隐含返回类型?

代码语言:javascript
复制
Bar1 myBar = DoSomething(new Foo1());

相反,我必须像这样指定泛型类型...

代码语言:javascript
复制
Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-09 05:33:59

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

许多人认为这个设计决定是错误的,错误的,错误的。虽然我同意他们的观点,但这个决定确实带来了我认为的一些很好的属性。关于这个问题的长期辩论,请参阅这篇博客文章上的大量评论,告诉我我错了,错了,错了:

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

(*)请注意,我说过忽略对方法类型参数的约束,而不是一般的约束。如果推导出的形参类型被构造为泛型类型,使得构造违反了它们的类型参数约束,则这一事实会导致类型推断失败,并且该方法不是重载解析的候选方法。但在任何情况下,我们都不会从约束中推断出“嗯,显然这是行不通的”。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6630690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档