Почему этот CLS не совместим? - PullRequest
4 голосов
/ 14 апреля 2010

У меня есть следующие интерфейсы:

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
}

Хорошо,

Я мог бы просто игнорировать эти предупреждения или отключить их, добавив атрибут CLSCompliant (false) в мой класс. Но мне любопытно, почему это происходит. Тем более, что компилятор не жалуется на сам интерфейс.

Происходит ли это для классов, которые предоставляют интерфейсы вообще, или я просто использовал запрещенное ключевое слово?

1 Ответ

6 голосов
/ 14 апреля 2010

Это случайно не в разных сборках? ITemplateItem в сборке, которая не претендует на соответствие CLSC? Я думаю , что бы это объяснить - в таком случае, просто сделать эту сборку CLSC-совместимой - или, возможно, даже просто ITemplateItem.

...