Ho notato che con i parametri opzionali in C # 4 se si specifica un parametro facoltativo su un'interfaccia che non si desidera , è necessario rendere quel parametro facoltativo su qualsiasi classe di implementazione:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
e quindi:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Qualcuno sa perché i parametri opzionali sono progettati per funzionare in questo modo?
Da un lato suppongo che la capacità di sovrascrivere i valori predefiniti specificati sulle interfacce sia utile anche se ad essere onesti non sono sicuro che dovresti essere in grado di specificare i valori predefiniti sull'interfaccia in quanto dovrebbe essere una decisione di implementazione.
D'altra parte, questa disconnessione significa che non è sempre possibile utilizzare la classe concreta e l'interfaccia in modo intercambiabile. Questo, naturalmente, non sarebbe un problema se il valore predefinito è specificato sull'implementazione, ma quindi se stai esponendo la tua classe concreta come interfaccia (usando un framework IOC per iniettare la classe concreta per esempio) allora davvero non c'è punto avendo il valore predefinito come il chiamante dovrà sempre fornirlo comunque.
MyInterface
e chiamarlo con il parametro opzionale: ((MyInterface)obj).TestMethod();
.