我对我们项目中的一个问题感到困惑。我试图简化它以重现效果:
interface IBar { }
class Bar : IBar {}
interface IFoo<T> where T : IBar { }
class Foo<T> : IFoo<T> where T : IBar { }
class Class1
{
public void DoTheFoo<T>(T bar) where T : IBar
{}
public void DoTheFoo<T>(IFoo<T> foo) where T : IBar
{}
public void Test()
{
var bar = new Bar();
var foo = new Foo<Bar>();
DoTheFoo(bar); // works
DoTheFoo<Bar>(foo); // works
DoTheFoo((IFoo<Bar>)foo); // works
DoTheFoo(foo); // complains
}
}
对我来说,这看起来不错,但编译器在最后一次调用时抱怨,因为它试图DoTheFoo<T>(T bar)
,而不是DoTheFoo<T>(IFoo<T> foo)
抱怨参数类型不合适。
- 当我删除方法
DoTheFoo<T>(T bar)
时,最后一次调用有效! - 当我将其更改为 时
DoTheFoo<T>(Foo<T> foo)
,它可以工作,但我不能使用它
在我们当前的代码中解决这个问题并不难。但是 a) 奇怪 b) 太糟糕了,我们不能拥有这两个重载方法。
是否有解释这种行为的通用规则?是否有可能使它工作(除了给方法不同的名称)?