The default values in .Net are compiler-based syntactic sugar. At the place of the call, the compiler adds default values for you. It cannot know the runtime type of your object at compile time, so it must insert the value defined in the interface.
Therefore, they cannot be “redefined” in implementations because there is nothing to redefine.
Eric Lippert wrote a very interesting series of blog posts about optional arguments, the first of which can be found here .
Update
From your comments, what you are suggesting is either some form of “virtual” parameter (in which the runtime type is declared) that the CLR should have “known” about. I assume that this implementation was excluded due to the fact that the costs (design, documentation, implementation, testing, etc.) were too high compared to the advantages that it gave (although this is only an assumption!). In addition, there is a default delegation option, for example:
void M(bool y = false) { ... whatever ... }
Gets rewritten by the compiler as:
void M() { M(false); } void M(bool y) { ... whatever ... }
But descending this route leads to a potentially unacceptable level of congestion when several optional arguments and named arguments are accepted into the arguments.
source share