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

时间:2018-10-04 06:23:45

标签: c# interface

实现接口时

public interface IMainViewModel
{
    ICommand DoStuffCommand { get; }
}

为什么

public class MainViewModel
{
    DelegateCommand DoStuffCommand { get; }
}

使用

public class DelegateCommand : ICommand { ... }

不允许?

  

属性DoStuffCommand无法通过接口IMainViewModel实现属性。类型应为ICommand


DelegateCommand实现ICommand时,界面合同保证我可以使用DelegateCommand 完全相同的方式我可以使用任何ICommand


我想知道为什么接口接口属性不能用具体的类型实现,因为从我的角度来看,我不会认为它是错误的(或行为改变或功能破坏)。

1 个答案:

答案 0 :(得分:5)

这只是规则。除通用协方差/反方差之外,签名(包括返回类型 1 )必须完全匹配。您当然可以随意添加第二个方法,该方法显式实现该接口并只包装当前的DoStuffCommand,以便显式使用MainViewModel对象的调用者可以轻松获得DelegateCommand而无需投射和通过IMainViewModel引用使用它的人都不是明智的选择:

public class MainViewModel : IMainViewModel
{
    DelegateCommand DoStuffCommand { get; }
    ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}

1 我的一个小错误是当人们指出“返回类型不是C#签名的一部分”时。它们的实际含义是“出于超载的目的,不考虑返回类型”。在很多地方,例如这里,返回类型都是签名的一部分。