私たちのプロジェクトで抱えている問題に混乱しています。効果を再現するために単純化しようとしました。
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)これらの2つのオーバーロードされたメソッドを使用できないのは残念です。
この動作を説明する一般的なルールはありますか?それを機能させることは可能ですか(メソッドに異なる名前を付けることを除いて)?