5

Type.GetProperty(string)如果类型是接口,为什么不从基接口获取属性?例如,以下代码打印:

System.String X
null
System.String X
System.String X

这似乎不一致:

void Main()
{
    Console.WriteLine(typeof(I1).GetProperty("X"));
    Console.WriteLine(typeof(I2).GetProperty("X"));
    Console.WriteLine(typeof(C1).GetProperty("X"));
    Console.WriteLine(typeof(C2).GetProperty("X"));;
}

public interface I1 { string X { get; } }

public interface I2 : I1 { }

public class C1 { public string X { get { return "x"; } } }

public class C2 : C1 { }

编辑:支持科尔答案的运行时的另一个方面如下:

public class C : I2 {
    // not allowed: the error is
    // 'I2.X' in explicit interface declaration is not a member of interface
    string I2.X { get; set; }

    // allowed
    string I1.X { get; set; }
}
4

1 回答 1

6

请记住,类继承与接口实现不同。

派生类和它的基类具有is-a关系。如果D : BthenD 是一个 B. 如果B有一个属性,那么D根据定义也将具有相同的属性,因为这就是这种关系的含义;的“实质”D在某种意义上被它与 的关系所改变B

接口不提供实现,所以当你说 时ID : IB,你并不是真的说ID is a IB就像你对类所做的那样。这甚至意味着什么? 不是东西ID_ 他们是协议。没有什么可以改变的。相反,您是在说“实现的类也必须提供 . 的实现” 。IBIDIB

ID派生自的事实IB不会改变ID,因为它没有要改变的实质。这只是意味着任何承诺履行由 指定的合同的类ID也必须准备好遵守一组额外的要求。

记住这一点,如果IB提供了一个属性X,那么正确的答案是“ID有一个属性X吗?” 是没有ID需要你也实现IB,它确实有一个属性X,但它本身没有一个属性X

于 2013-03-14T21:04:03.447 回答