为什么在编译时:
using System;
public class Test
{
public static void Main()
{
Lol l = new Lol();
Console.WriteLine(((IParent)l).Family);
Console.WriteLine(((IChild)l).Family);
Console.WriteLine(l.Name);
}
}
public interface IParent
{
string Family { get; }
}
public interface IChild : IParent
{
string Name { get; }
}
public class Lol : IChild
{
string IParent.Family { get { return "suck"; } }
string IChild.Family { get { return "duck"; } }
public string Name { get { return "ross"; } }
}
IdeOne 给出了这个:
prog.cs(27,26):错误 CS0550:Lol.IChild.Family.get是在接口成员编译失败中找不到的访问器IChild.Family
:1 个错误,0 个警告
关键是一个类只能有一个接口方法/属性的实现。接口只是实现某些方法/属性的“承诺”,而继承的接口只是一个更强的承诺。您的声明
class Lol : IChild承诺实现接口的所有方法/属性IChild(即,在您的情况下Name)以及父接口的所有方法/属性IParent。Family一个接口属性是IChild从一个接口继承而来的IParent,所以一个接口IChild包含的不是两个,而是一个属性Family。允许同时实现IParent.Family和IChild.Family将导致同一属性的两种不同实现。在这种情况下,编译器将不知道使用哪一个。因此线
没有被编译器跳过。
形式上,可以在语言规范(位于目录
<тут каталог Visual Studio>\VC#\Specifications\1033\CSharp Language Specification.docx中)的第 13.4.1 节显式接口成员实现中找到该禁令。这是你的情况: