gpt4 book ai didi

c# - 为什么不能推断出嵌套的泛型类型?

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:46 27 4
gpt4 key购买 nike

给定以下类(class)...

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

最佳答案

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

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

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


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

关于c# - 为什么不能推断出嵌套的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37736049/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com