Je suis confus par un problème que nous avons dans notre projet. J'ai essayé de le simplifier pour reproduire l'effet :
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
}
}
Pour moi, cela semble bien, mais le compilateur se plaint sur le dernier appel, car il essaie de DoTheFoo<T>(T bar)
au lieu de DoTheFoo<T>(IFoo<T> foo)
et se plaint que le type d'argument ne correspond pas.
- Lorsque je supprime la méthode
DoTheFoo<T>(T bar)
le dernier appel fonctionne ! - Quand je le change en
DoTheFoo<T>(Foo<T> foo)
ça marche, mais je ne peux pas utiliser ça.
Il n'est pas trop difficile de contourner ce problème dans notre code actuel. Mais il est a) étrange et b) dommage que nous ne puissions pas avoir ces deux méthodes surchargées.
Existe-t-il une règle commune qui explique ce comportement ? Est-il possible de le faire fonctionner (sauf en donnant des noms différents aux méthodes) ?