为什么持有接口类型的接口属性不能用包含实现接口的具体类型的属性实现?

Tho*_*kow -1 c# interface

实现界面时

public interface IMainViewModel
{
    ICommand DoStuffCommand { get; }
}
Run Code Online (Sandbox Code Playgroud)

为什么是

public class MainViewModel
{
    DelegateCommand DoStuffCommand { get; }
}
Run Code Online (Sandbox Code Playgroud)

public class DelegateCommand : ICommand { ... }
Run Code Online (Sandbox Code Playgroud)

不允许?

属性DoStuffCommand无法从接口实现属性IMainViewModel.类型应该是ICommand.


作为DelegateCommand实现ICommand,接口契约保证我能够使用DelegateCommand 完全相同的方式使用any ICommand.


我想知道为什么接口interface-property不能用具体类型实现,因为从我的观点来看,我不认为它是错误的(或改变行为或破坏功能).

Dam*_*ver 5

他们只是规则.在通用的共同/反向差异之外,签名(包括返回类型1)必须完全匹配.你当然可以自由地添加第二个显式实现接口的方法,只是包装你的当前信息,DoStuffCommand以便明确使用MainViewModel对象的调用者可以很容易地获得DelegateCommand没有强制转换,而那些通过IMainViewModel引用使用它的人更聪明:

public class MainViewModel : IMainViewModel
{
    DelegateCommand DoStuffCommand { get; }
    ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}
Run Code Online (Sandbox Code Playgroud)

1我个人的一个问题是人们说"返回类型不是C#中签名的一部分".它们实际上意味着"为了超载的目的,不考虑返回类型".有很多地方,例如这里,返回类型是签名的一部分.