2009-06-02 6 views
5

Ich habe ein .NET 3.5 C# -Projekt, das einen Namespace von hat.Referenz Name Fall ist nicht CLS-kompatibel

Wenn ich eine Assembly namens "Samplenamespace.Utils.Example" zu meinem Projekt, das ich die folgende Warnung erhalten hinzufügen:

Identifier 'Samplenamespace' unterscheiden sich nur in dem Fall ist nicht CLS-kompatibel

Beachten Sie das Kleinbuchstabe 'n' in Samplenamespace.

Ich verwende im Moment nicht einmal die Referenzbaugruppe in meinem Projekt. Wenn Sie es einfach als Referenz hinzufügen, wird die Warnung ausgegeben.

Warum beschwert sich der Compiler darüber, dass ich in meinen öffentlichen Klassen überhaupt keine Referenzen auf die Assembly veröffentliche?

Problemumgehung?

Antwort

7

Nicht alle .NET-Sprachen sind Groß-/Kleinschreibung (VB zum Beispiel), wenn Sie Namespaces gemischt haben, diffident nur für den Fall (um den Wortlaut der Warnung zu verwenden) ist Ihr Code möglicherweise nicht für andere Entwickler zugänglich.

Das ist nicht Ihr Fall sein kann, weshalb es eine Warnung ist (was in meinem Geschäft wir als Fehler behandeln)

+0

Dank Ralph, ich verstehe immer noch nicht, warum das wichtig sein sollte, da mein Projekt nichts von der referenzierten Assembly potenziellen VB-Clients aussetzt. Ich abstrahiere den VB-Client effektiv von der zugrunde liegenden Assembly? – user115909

+0

Da VB nicht zwischen Groß- und Kleinschreibung unterscheidet, ist es nicht möglich, zwischen SampleNamespace.A und Samplenamespace.A zu unterscheiden. Daher kann nicht ermittelt werden, welcher Typ aufgerufen werden soll. Um solche Zweideutigkeiten zu vermeiden, kennzeichnet der C# -Compiler dies, so dass Sie nur Typen und Member erstellen können, die von allen ohne Mehrdeutigkeit aufgerufen werden können. – Gishu

+0

Ich denke, es ist ein Blind-Check-and-Flag, es berücksichtigt nicht, wie Sie die Typen tatsächlich verwenden oder freilegen. – Gishu

2

Es ist einfach Sie da nicht alle Sprachen warnt, die die Typen innerhalb Ihrer Lösung verbrauchen wird beachten Sie den Unterschied (und möglicherweise nicht in der Lage, die Typen zu verwenden).

Ich denke, dass Sie diese Warnung durch Markieren Sie Ihre Montage als nicht CLS-kompatibel (in der AssemblyInfo.cs-Datei) vermeiden kann (read more here):

[assembly:CLSCompliant(false)] 

nicht sicher, dass ich denke, es ist zwar eine gute Idee, ...

Update: Ich denke, dass der Grund, dass die Warnung ausgegeben wird, obwohl nichts öffentlich ist, ist, dass Namespaces keine Zugriffsmodifizierer haben. Sie könnten vielleicht sagen, dass Namespaces immer öffentlich sind, so dass sie potenziellen Clients ausgesetzt sind, obwohl sie keine öffentlichen Typen enthalten können.

+0

Fredrik, ich könnte den Code keine CLS-konform machen, aber ich würde lieber nicht in Erwägung ziehen, dass der Client-Code meiner App dieser Baugruppe nicht zugänglich ist. Es scheint einfach keine gültige Situation zu sein, um CLS-Compliance zu brechen. – user115909

+0

Ich bin auch neugierig geworden und habe ein paar Tests gemacht; Siehe mein Update in der Antwort. –

+0

Das macht seit Fredrik. Ich nehme an, dass ich nur den Namespace ändern oder die CLS-Compliance auf false setzen kann. Danke für deine Hilfe – user115909