C# 需要显式接口实现,但只使用一个接口?

C# 需要显式接口实现,但只使用一个接口?,c#,interface,explicit-interface,C#,Interface,Explicit Interface,为什么以下代码必须使用显式接口实现语法定义“可计算的”?(参见代码的最后一行)如果我使用非显式语法(即公共十进制可计算),我会得到一个“不一致的可访问性”错误,具体是: “参数类型…列表(IVoucher)的可访问性不如方法可计算(…)” interface-IVoucher { 字符串序列{get;} 十进制面值{get;} 字符串折扣类型{get;} 字符串ApplyMsg{get;} 字符串拒绝消息{get;} 十进制可计算(列出产品、列出凭证); } //“GiftVoucher”为没有

为什么以下代码必须使用显式接口实现语法定义“可计算的”?(参见代码的最后一行)如果我使用非显式语法(即公共十进制可计算),我会得到一个“不一致的可访问性”错误,具体是:

“参数类型…列表(IVoucher)的可访问性不如方法可计算(…)”

interface-IVoucher
{
字符串序列{get;}
十进制面值{get;}
字符串折扣类型{get;}
字符串ApplyMsg{get;}
字符串拒绝消息{get;}
十进制可计算(列出产品、列出凭证);
}
//“GiftVoucher”为没有使用限制的简单凭证建模。
//
公共类礼品赠送者:IVoucher
{
公共字符串序列{get;private set;}
公共十进制面值{get;private set;}
公共字符串折扣类型{get;private set;}
公共字符串ApplyMsg{get;private set;}
公共字符串{get;private set;}
公共GiftVoucher(字符串序列,十进制面值)
{
串行=串行;
FaceValue=FaceValue;
ApplyMsg=string.Empty;
RejectMsg=string.Empty;
折扣类型=“礼物”;
}
//“可计算”提供凭证适用性逻辑。
//
十进制IVoucher.可计算(列出产品、列出凭证)
{
呜呜,呜呜,呜呜。。。

GiftVoucher
是公共的,而接口
IVoucher
不是公共的。因此,
可计算的
不能从
IVoucher
不可用的任何地方调用,因为该方法采用了不可访问的类型的
列表


正如JRLambert所建议的,将接口公开应该可以解决这个问题。

尝试将接口公开谢谢,这是可行的!但是为什么呢?我认为接口的默认可访问性是公开的?如果不是,那是什么?C中类型的默认访问修饰符是
内部的
(我不确定嵌套类型)。最好从类中删除
public
修饰符(以便使其
internal
与接口一样)。@codecabie成员的默认可访问性(例如方法)接口的属性为
public
。它是唯一允许的访问级别,因此您甚至不允许指定它。例如:您的声明
十进制可计算(列出产品、列出凭证)
接口内部是
公共的
接口
本身的默认访问级别取决于接口的直接成员。如果它是
名称空间
的直接成员,则应用名称空间的默认可访问性,即
内部
。但是如果接口是clas的成员s或结构,
private
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...