Le code est un peu bizarre, si patient avec moi (gardez à l'esprit ce scénario ne viennent dans le code de production).
Dire que j'ai eu cette structure d'interface:
public interface IBase { }
public interface IChild : IBase { }
public interface IFoo<out T> where T : IBase { }
Avec cette méthode d'extension de classe construit autour des interfaces:
public static class FooExt
{
public static void DoSomething<TFoo>(this TFoo foo)
where TFoo : IFoo<IChild>
{
IFoo<IChild> bar = foo;
//foo.DoSomethingElse(); // Doesn't compile -- why not?
bar.DoSomethingElse(); // OK
DoSomethingElse(foo); // Also OK!
}
public static void DoSomethingElse(this IFoo<IBase> foo)
{
}
}
Pourquoi ne pas l'commenté de ligne en DoSomething
de la compilation? Le compilateur est parfaitement heureux de me laisser affecter foo
de bar
, qui est du même type que la contrainte générique, et d'appeler la méthode d'extension sur place. Il est également aucun problème à appeler la méthode d'extension sans la méthode d'extension de la syntaxe.
Quelqu'un peut confirmer si c'est un bug ou à un comportement attendu?
Merci!
Juste pour référence, voici le message d'erreur de compilation (types abrégée pour la lisibilité):
'TFoo' ne contient pas une définition pour 'DoSomethingElse" et la meilleure extension de surcharge de la méthode 'DoSomethingElse(IFoo)' a certains arguments invalides