Laden...

This class is not CLS-compliant.

Erstellt von herbivore vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.703 Views
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren
This class is not CLS-compliant.

Hallo Community,

bei (fast) allen Klassen in System.Collections.Generic, steht in der Dokumentation zu lesen: "This class is not CLS-compliant"; gilt analog auch für deren Eingeschaften, Methode usw.

Welche konkrete Bedeutung hat das (was CLS heißt und was der Satz auf deutsch sagt, ist mir schon klar) und welche praktischen Auswirkungen hat das? Provokant gefragt: Sollte man System.Collections.Generic überhaupt benutzen?

Vielen Dank!

herbivore

S
127 Beiträge seit 2004
vor 18 Jahren

Ich verstehe das so das der Namespace "Generic" nicht Abwärtskompatible ist,
da MS ja einen anderen Weg gegangen ist als Sun mit Java.

Aber was ich mir noch Vorstellen kann, das der Namespace noch nicht
standardisiert ist. Und somit wollen sie nur sagen das sich da noch was tun kann.

P
939 Beiträge seit 2003
vor 18 Jahren

CLS-Compliant ist eine Untermenge von dem was mit IL möglich ist. Alle .Net-Sprachen müssen mindestens diesen Feature-Satz unterstützen. Dadurch ist sichergestellt, dass die Sprachen untereinander kompatibel sind, dass man z.B. VB.Net-Dlls in C# verwenden kann.

Werden als "Nicht CLS-Compliant" gekennzeichnete Typen, Sprachfeatures (Beispiel: Zeiger) usw. verwendet, können die Assemblies nicht mehr von allen Sprachen verwendet werden. Die unsigned Zahlentypen uint, ulong usw. sind z.B. nicht CLS-Compliant. Ich glaube J# kann mit diesen Typen nicht umgehen. In Java gibt es jedenfalls keine unsigned Typen. Genauso ist es mit Generics, die wenigsten Sprachen unterstützen sie (im Moment nur C#?).

Es geht aber immer nur um die öffentliche Schnittstelle. Es ist egal, ob man in der Implementierung Generics verwendet. Solange man sie nicht in der Schnittstelle veröffentlicht, kann jede andere .Net-Sprache mit dem Code was anfangen.

Gruss
Pulapex

T
81 Beiträge seit 2004
vor 18 Jahren

Genauso ist es mit Generics, die wenigsten Sprachen unterstützen sie (im Moment nur C#?).

Ich glaub eher in allen 5 .NET Sprachen vom Hause Microsoft. Zumindestens gibts für
jede Sprache eine Dokumentation zu den Generic-Klassen. Bin mir bei VB.NET und
C++/CLI sogar ziemlich sicher.

Ich sag mal so, du brauchst dir keine Sorgen machen über nicht CLS konforme Klassen, denn
zwar hat man in J#, und VB.NET imho auch, keine unsigned Datentypen zur Verfügung, aber es
bleibt ja immerhin noch System.UInt16 etc. über ..

Weiteres Beispiel für eine nicht CLS konforme Klasse wär zum Beispiel:


public class Person 
{
    public string name {
        get { / * ... */ }
    }

    public string Name {
        get { / * ... */ }
    }
}

grüße

P
939 Beiträge seit 2003
vor 18 Jahren

UInt16 ist genauso wenig CLS-konform, short ist ja nur ein Alias in C# für UInt16. Ansonsten ist es ein und der selbe Datentyp. Aber hast Recht damit, dass es schon mehrere Sprachen gibt, die Generics unterstützen.

T
81 Beiträge seit 2004
vor 18 Jahren

UInt16 ist genauso wenig CLS-konform, short ist ja nur ein Alias in C# für UInt16. Ansonsten ist es ein und der selbe Datentyp.

Naja, ausprobiert hab ichs jetzt nicht, aber wiederum gibts eine Doku für
UInt** Typen im .NET Framework für mehrere Sprachen.

grüße

S
8.746 Beiträge seit 2005
vor 18 Jahren

Wenn ich mich recht entsinne, sind auch C# jagged arrays nicht CLS konform. Das heisst nicht, dass man sie nicht benutzen darf, aber in Schnittstellen dürfen diese Typen nicht vorkommen um interoperabel zu sein.

P
939 Beiträge seit 2003
vor 18 Jahren

Ein Array ist ein Verweistyp, im Ursprung abgelitten von System.Object. Ein "Jagged Array" ist ein normales, eindimensionales Array, dessen Elemente Arrays sind (wie gesagt normale Objekte).

Ich wüsste nicht, warum es an der Stelle Beschränkungen in der "Common Language Specification" geben sollte. Aber vielleicht findest du ja den Link wo du das gelesen hast. Lasse mich gerne überzeugen.

Gruss
Pulpapex

// Edit: der (Geist-)Moderator, der diesen Thread geschlossen hat, sollte vielleicht noch einen Grund angeben. Kommt ansonsten gar nicht gut.

// Edit: Ok, nach knapp einer Stunde keine Reaktion. Thread ist wieder offen.

S
8.746 Beiträge seit 2005
vor 18 Jahren

http://msdn.microsoft.com/msdnmag/issues/02/02/NET/

"**Note that jagged arrays are not CLS-compliant **(because the CLS doesn't allow a System.Array object to be an element of an array) and cannot be passed between code written in different programming languages."

P
939 Beiträge seit 2003
vor 18 Jahren

In der Msdn-Doku zum .Net-Framework steht nichts genaues. Da steht in Sachen CLS-Konformität bei Arrays nur:

Arrays

Element types  

Array elements must be CLS-compliant types.

Dimensions  

Arrays must have a fixed number of dimensions, greater than zero.

Bounds  

All dimensions of an array must have a zero lower bound.

Da steht nichts gegen "jagged Arrays". Im Netz findet man aber häufiger die Bemerkung, dass sie nicht konform wären.

Ich hab dann nochmal in die Spezifikation geguckt. Da steht:

CLS Rule 16: Arrays shall have elements with a CLS-compliant type and all dimensions of the array shall have lower bounds of zero. Only the fact that an item is an array and the element type of the array shall be required to distinguish between overloads. When overloading is based on two or more array types the element types shall be named types.

Note: so-called “jagged arrays” are CLS-compliant, but when overloading multiple array types they are onedimensional, zero-based arrays of type System.Array.

"jagged Arrays" sollen also konform sein mit einer Einschränkung. Weiss jemand wie man die Einschränkung deuten soll?

... but when overloading multiple array types they are onedimensional,
zero-based arrays of type System.Array.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Tja, wie gesagt, mein Zitat WAR aus MSDN.

Hier weitere:

CodeProject-Artikel über Array-Typen:

" Keep in mind, that jagged arrays are not CLS-compliant and may not be worked cross-language."

http://codeproject.com/dotnet/arrays.asp

Doku FxCop:

" Keep in mind, that jagged arrays are not CLS-compliant and may not be worked cross-language."

http://www.gotdotnet.com/team/libraries/FxCopRules/PerformanceRules.aspx

Aus "Visual Basic Language Concepts" von Microsoft:

"Note Jagged arrays are not compliant with the common language specification (CLS). This means you should not expose jagged arrays from any class you want CLS-compliant code to consume."

http://msdn.microsoft.com/library/en-us/vbcn7/html/vaconarraysofarrays.asp

Ich habe dagegen nicht einen Link gefunden, wo das Gegenteil behauptet wurde....

Habs auch mal so in einer Schulung gelernt. Selbst hab ich die jagged Arrays noch nie verwendet....

S
8.746 Beiträge seit 2005
vor 18 Jahren

Noch ein Nachtrag: Angeblich sollen jagged Arrays in der .NET Beta mal CLS-compliant gewesen sein.