4 Stimmen

Warum ist das nicht CLS-kompatibel?

Ich habe die folgenden Schnittstellen:

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 TemplateItems { get; set; }
    void Add(ITemplateItem item);
    void Remove(ITemplateItem item);
    ITemplateItem CreateTemplateItem();
}

Meine Implementierung des ITemplateItem sieht so aus:

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
}

Aber bei der Implementierung des ITemplateCategory sagt mir der Compiler, dass meine Klasse nicht CLS-konform ist.

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

    // Warnung: Typ von TemplateItems nicht CLS-konform
    public List TemplateItems { get; set; } 

    // Warnung: Argument nicht CLS-konform
    public void Add(ITemplateItem item)
    {
        throw new NotImplementedException();
    }

    // Warnung: Argument nicht CLS-konform
    public void Remove(ITemplateItem item)
    {
        throw new NotImplementedException();
    }

    // Warnung: Rückgabetyp nicht CLS-konform
    public ITemplateItem CreateTemplateItem() 
    {
        throw new NotImplementedException();
    }
    #endregion
}

Ok,

Ich könnte einfach diese Warnungen ignorieren oder sie ausschalten, indem ich das Attribut CLSCompliant(false) zu meiner Klasse hinzufüge. Aber ich frage mich, warum das passiert. Besonders weil der Compiler sich nicht über die Schnittstelle selbst beschwert.

Geschieht dies generell für Klassen, die Schnittstellen freigeben, oder habe ich einfach ein verbotenes Schlüsselwort verwendet?

6voto

Jon Skeet Punkte 1325502

Sind diese zufälligerweise in verschiedenen Assemblys? Ist ITemplateItem in einer Assembly, die nicht CLSCompliant beansprucht? Ich denke, das würde es erklären - in diesem Fall machen Sie einfach diese Assembly CLSCompliant - oder möglicherweise sogar nur ITemplateItem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X