c# – 为什么实现具有相同属性的多个接口会显示“模糊”警告?

相关文章:C# interface method ambiguity

来自同一来源的代码:

    private interface IBase1
    {
        int Percentage { get; set; }
    }

    private interface IBase2
    {
        int Percentage { get; set; }
    }

    private interface IAllYourBase : IBase1, IBase2
    {
    }

    private class AllYourBase : IAllYourBase
    {
        private int _percentage;

        public int Percentage
        {
            get { return _percentage; }
            set { _percentage = value; }
        }
    }

    private void Foo()
    {
        IAllYourBase iayb = new AllYourBase();
        int percentage = iayb.Percentage; // Fails to compile. Ambiguity between 'Percentage' property. 
    } 

(但不回答我的问题 – “为什么合同变得含糊不清?”)

鉴于:

Interface is a contract that the implementing class MUST abide with.

如果两个(或更多)接口请求相同的合同,并且接口将它们传递给“forward”,然后类实现它们和ACCEPTS,那么普通合同应该只用作实现类的一个合同(通过不提供显式实现) ).然后,

>为什么编译器会对共同合同显示“歧义”警告?
>为什么编译器在尝试通过接口(iayb.Percentage)访问不明确的合同时无法编译?

我想知道编译器使用此限制有什么好处?

编辑:提供一个真实世界的用例,我希望跨接口使用合同作为一个合同.

public interface IIndexPriceTable{
      int TradeId{get;}
      int IndexId{get;}
      double Price{get;}
}

public interface ILegPositionTable{
      int TradeId {get;}
      int LegId {get;}
      int Position {get;}
}

public interface ITradeTable {
      int TradeId{get;}
      int IndexId{get;}
      int LegId{get;}
      //others
}

public interface IJoinedTableRecord : IIndexPriceTable, ILegPositionTable, ITradeTable {
     //Just to put all contracts under one interface and use it as one concrete record, having all information across different tables.
}

>为什么我想在我的联合表记录中使用3-TradeId,2-LegId,2-IndexId?

最佳答案
因为IAllYourBase接口没有声明Percentage属性本身.

当您将AllYourBase的实例分配给IAllYourBase的变量时,编译器需要输出对IBase1.Percentage或IBase2.Percentage的调用:

callvirt   instance int32 IBase1::get_Percentage()

要么

callvirt   instance int32 IBase2::get_Percentage()

这些是不同类型的不同成员,仅仅因为它们具有相同的签名并不意味着它们是可互换的.

在您的实际情况中,您可能需要更精细的粒度接口来定义公共属性.

转载注明原文:c# – 为什么实现具有相同属性的多个接口会显示“模糊”警告? - 代码日志