2010-04-14 58 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

相關問題