2010-04-14 59 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 
} 

好吧,

我可以忽略这些警告或通过添加CLSCompliant(假)属性上我的课将其关闭。 但我很好奇为什么会发生这种情况。特别是因为编译器不会抱怨接口本身。

这是否发生在暴露接口的类中,或者我只是使用了禁用的关键字?

回答

6

这些在不同的程序集中有任何机会吗? ITemplateItem在一个不声称符合CLSCompliant的组件中?我想认为,这将解释它 - 在这种情况下,只需使该组件CLSCompliant - 或可能甚至只是ITemplateItem

+0

这就是诀窍。我认为我的程序集会隐式地使用CLSCompliant,除非我使用奇怪的成员名称或标记程序集/类/属性/等。因为不符合CLS。 – 2010-04-14 14:07:10

相关问题