2010-04-14 2 views
4

У меня есть следующие интерфейсы:Почему этот CLS не совместим?

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 в моем классе. Но мне любопытно, почему это происходит. Тем более, что компилятор не жалуется на сам вывод.

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

ответ

6

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

+0

Это трюк. Я думал, что моя сборка будет неявно CLSCompliant, если я не буду использовать странные имена членов или не буду отмечать сборку/класс/свойство/etc. как не CLSCompliant. –