4

次のインターフェイスがあります。

public interface ITemplateItem
{
    int Id { get; set; }
    String Name { get; set; }
    String Text { get; set; }
    int  CategoryId { get; set; }
    int  Typ { get; set; }
}

public interface ITemplateCategory
{
    int Id { get; set; }
    String Name { get; set; }

    List<ITemplateItem> TemplateItems { get; set; }
    void Add(ITemplateItem item);
    void Remove(ITemplateItem item);
    ITemplateItem CreateTemplateItem();
}

ITemplateItem の私の実装は次のようになります。

public class MyTemplateItem : ITemplateItem
{
    #region ITemplateItem Member
    public int Id { get; set; }
    public String Name { get; set; }
    public String Text { get; set; }
    public int CategoryId { get; set; }
    public int Typ { get; set; }
    #endregion
}

しかし、ITemplateCategory 実装の場合、コンパイラはクラスが CLS に準拠していないと通知します。

public class MyTemplateCategory : ITemplateCategory
{
    #region ITemplateCategory Member
    public int Id { get; set; }
    public String Name { get; set; }

    // Warning: type of TemplateItems not CLS-Compliant
    public List<ITemplateItem> TemplateItems { get; set; } 

    // Warning: Argument not CLS-Compliant
    public void Add(ITemplateItem item)
    {
        throw new NotImplementedException();
    }

    // Warning: Argument not CLS-Compliant
    public void Remove(ITemplateItem item)
    {
        throw new NotImplementedException();
    }

    // Warning: Return type not CLS-Compliant
    public ITemplateItem CreateTemplateItem() 
    {
        throw new NotImplementedException();
    }
    #endregion
}

Ok、

これらの警告を無視するか、クラスに CLSCompliant(false) 属性を追加して無効にすることができます。しかし、私はなぜこれが起こるのか興味があります。特に、コンパイラはインターフェイス自体について文句を言わないためです。

これは、一般にインターフェイスを公開するクラスで発生しますか、それとも禁止されたキーワードを使用しただけですか?

4

1 に答える 1

6

ひょっとして、これらは別のアセンブリにあるのでしょうか? CLSCompliantITemplateItemであると主張していないアセンブリにありますか? それはそれを説明すると思います-その場合、そのアセンブリをCLSCompliantにするだけです-またはおそらくITemplateItem.

于 2010-04-14T13:56:34.973 に答える