J'ai remarqué qu'avec les paramètres facultatifs en C # 4 si vous spécifiez un paramètre facultatif sur une interface que vous n'avez pas, ne devez pas rendre ce paramètre facultatif sur n'importe quelle classe d'implémentation:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
et donc:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Est-ce que quelqu'un sait pourquoi les paramètres facultatifs sont conçus pour fonctionner de cette façon?
D'une part, je suppose que la possibilité de remplacer toutes les valeurs par défaut spécifiées sur les interfaces est utile, mais pour être honnête, je ne sais pas si vous devriez même être en mesure de spécifier des valeurs par défaut sur l'interface car cela devrait être une décision d'implémentation.
D'un autre côté, cette déconnexion signifie que vous ne pouvez pas toujours utiliser la classe concrète et l'interface de manière interchangeable. Bien sûr, cela ne serait pas un problème si la valeur par défaut est spécifiée sur l'implémentation, mais si vous exposez votre classe concrète comme interface (en utilisant un cadre IOC pour injecter la classe concrète par exemple), alors vraiment il n'y a pas point ayant la valeur par défaut car l'appelant devra toujours la fournir de toute façon.
MyInterface
et l' appeler avec le paramètre optionnel: ((MyInterface)obj).TestMethod();
.