Почему при реализации нескольких интерфейсов с одним и тем же свойством отображается предупреждение «двусмысленность»?

Связанное сообщение: Неоднозначность метода интерфейса C#

Код из того же источника:

    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. 
    } 

(Но не отвечает на мой вопрос — «ПОЧЕМУ контракты становятся неоднозначными ? " )

Дано:

Интерфейс — это контракт, который ДОЛЖЕН соблюдать реализующий класс.

Если два (или более) интерфейса запрашивают один и тот же контракт, и интерфейс передает их «вперед», а затем класс реализует их оба и ПРИНИМАЕТ, что общие контракты должны служить только одним контрактом для реализующих классов (не предоставляя явная реализация). Затем,

  1. Почему компилятор показывает предупреждение о «двусмысленности» для обычных контрактов?

  2. Почему компилятору не удается выполнить компиляцию при попытке доступа к неоднозначному контракту через интерфейс (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 в записи моей объединенной таблицы?

5
задан Community 23 May 2017 в 12:06
поделиться