J'ai remarqué qu'avec l'option paramètres en C# 4 si vous spécifiez un paramètre facultatif sur une interface vous N'avez PAS à prendre ce paramètre en option sur toute la mise en œuvre de la classe:
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
Personne ne sait pourquoi les paramètres facultatifs sont conçus pour fonctionner de cette façon?
D'une part, je suppose que la capacité de remplacer les valeurs par défaut spécifiées sur les interfaces est utile, mais pour être honnête, je ne suis pas sûr si vous devez même être en mesure de spécifier les valeurs par défaut de l'interface comme cela devrait être une décision de mise en œuvre.
D'autre part, ce décalage signifie que vous ne pouvez pas toujours utiliser le béton de la classe et de l'interface de façon interchangeable. Ce qui bien sûr, ne serait pas un problème si la valeur par défaut est spécifiée sur la mise en œuvre, mais si vous êtes exposant votre classe concrète de l'interface (à l'aide de certains CIO cadre d'injecter du béton de classe par exemple), alors il n'y a aucun point d'avoir la valeur par défaut que l'appelant devra toujours fournir de toute façon.