C# 为什么持有接口类型的接口属性不能与持有实现接口的具体类型的属性一起实现?
在实现接口时C# 为什么持有接口类型的接口属性不能与持有实现接口的具体类型的属性一起实现?,c#,interface,C#,Interface,在实现接口时 public interface IMainViewModel { ICommand DoStuffCommand { get; } } 为什么 public class MainViewModel { DelegateCommand DoStuffCommand { get; } } 与 不允许 属性dostuff命令无法从接口IMainViewModel实现属性。类型应为ICommand 由于DelegateCommand实现ICommand,接口契约保证我
public interface IMainViewModel
{
ICommand DoStuffCommand { get; }
}
为什么
public class MainViewModel
{
DelegateCommand DoStuffCommand { get; }
}
与
不允许
属性dostuff命令无法从接口IMainViewModel实现属性。类型应为ICommand
由于DelegateCommand实现ICommand,接口契约保证我能够以与使用任何ICommand完全相同的方式使用DelegateCommand
我想知道为什么接口接口属性不能用具体的类型来实现,因为我不认为它是错误的或行为改变的,或者从我的观点来看,功能是违反的。
< P>它们只是规则。除了一般的协方差/反方差外,包括返回类型1在内的签名必须完全匹配。当然,您可以自由添加第二个方法来显式实现接口,只需包装当前的dostuff命令,以便显式使用MainViewModel对象的调用方可以轻松获得DelegateCommand,而无需强制转换,而那些通过IMainViewModel引用使用它的调用方则不那么明智:public class MainViewModel : IMainViewModel
{
DelegateCommand DoStuffCommand { get; }
ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}
1我个人的一个问题是当人们声明返回类型不是C中签名的一部分时。他们的实际意思是为了重载,返回类型不被考虑。有很多地方,比如这里,返回类型是签名的一部分。我确实意识到这个问题的措辞,特别是标题非常糟糕,可能很难理解。。。英语不是我的第一语言。如果你知道我的问题是什么意思,请帮我一个大忙,请随意编辑这个问题,让它更容易理解。我冒昧地改写了标题,除此之外,我认为你不应该对英语感到不好,这个问题很容易理解。@LasseVågsætherKarlsen谢谢你。。这听起来确实更好:
public class MainViewModel : IMainViewModel
{
DelegateCommand DoStuffCommand { get; }
ICommand IMainViewModel.DoStuffCommand => DoStuffCommand;
}