2014-12-13 6 views
2

Почему следующий код должен иметь «CalcUsable», определяемый синтаксисом реализации явного интерфейса? (см. последнюю строку кода) Если я использую неявный синтаксис (т. е. public decimal CalcUsable), я получаю ошибку «непоследовательной доступности», в частности:Требуется реализация явного интерфейса, но используется только один интерфейс?

«Тип параметра ... Список (IVoucher) менее доступен чем метод CalcUsable (...)»

interface IVoucher 
{ 
    string Serial { get; } 
    decimal FaceValue { get; } 
    string DiscountType { get; } 
    string ApplyMsg { get; } 
    string RejectMsg { get; } 
    decimal CalcUsable(List<Product> products, List<IVoucher> vouchers); 
} 

// 'GiftVoucher' models the simple voucher which has no use restrictions. 
// 
public class GiftVoucher : IVoucher 
{ 
    public string Serial { get; private set; } 
    public decimal FaceValue { get; private set; } 
    public string DiscountType { get; private set; } 
    public string ApplyMsg { get; private set; } 
    public string RejectMsg { get; private set; } 

    public GiftVoucher(string serial, decimal faceValue) 
    { 
     Serial = serial; 
     FaceValue = faceValue; 
     ApplyMsg = string.Empty; 
     RejectMsg = string.Empty; 
     DiscountType = "Gift"; 
    } 

    // 'CalcUsable' provides the voucher applicability logic. 
    // 
    decimal IVoucher.CalcUsable(List<Product> products, List<IVoucher> vouchers) 
    { 
     blar, blar, blar... 
+3

Попробуйте сделать свой интерфейс общедоступным – JRLambert

+0

Спасибо, что работает! Но почему??? – CodeCabbie

ответ

3

класс GiftVoucher является общедоступным, тогда как интерфейс IVoucher нет. Таким образом, CalcUsable не может быть вызван нигде, где IVoucher недоступен, поскольку метод принимает List типа, который недоступен.

Как предложил JRLambert, чтобы сделать этот интерфейс общедоступным, необходимо решить эту проблему.

+0

Я думал, что доступность по умолчанию для интерфейса была общедоступной? Если нет, то что это? – CodeCabbie

+2

Модификатор доступа по умолчанию для типа в C# является «внутренним» (я не уверен в вложенных типах). – Dennis

+0

Возможно, было бы лучше удалить модификатор 'public' из класса (чтобы сделать его« внутренним »так же, как интерфейс). –