Decompilation of MarkupExtension class looks like this:
[TypeForwardedFrom("WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
public abstract class MarkupExtension
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
protected MarkupExtension()
{
}
public abstract object ProvideValue(IServiceProvider serviceProvider);
}
As you can see, it could have been implemented as an interface, but instead it's a class. Why did the WPF team designed it this way? Moreover, in Silverlight it is an interface.