2009-05-22 21 views
3

Der folgende Code erzeugt eine Warnung CS3006 "Überladene Methode MyNamespace.Sample.MyMethod (int [])" unterscheidet sich nur in ref oder out oder in Array-Rang, ist nicht CLS-konform ".Warnt CS3006 in diesem Fall?

Ist diese Warnung gültig, d. H. Ist sie wirklich nicht CLS-konform? Ich hätte gedacht, dass eine explizite Schnittstellenimplementierung nicht als Überlastung gelten würde.

+0

Das ist interessant. Ich habe keine Antwort, aber ich werde versuchen, es herauszufinden ... IMO, es sollte kein Fehler sein. –

+0

BTW, ich habe es in .NET 4.0 versucht, und es verhält sich genauso. –

+0

"Ich werde versuchen, es herauszufinden" - vielen Dank. Der Anwendungsfall dafür ist, eine ComVisible-Schnittstelle zu haben (wobei Array-Parameter ref sein müssen), ohne ref-Parameter für .NET-Clients zu haben. – Joe

Antwort

2

Die CLS-Konformität gilt nur für den sichtbaren Teil Ihrer Klasse. Daher würden Sie denken, dass die ref int[] nicht public und daher nicht relevant ist. Aber es ist sichtbar, durch die Schnittstelle.

Die Benutzer Ihres Codes wissen, dass Samplevoid MyMethod(int[]) bereitstellt. Sie wissen auch, dass es ISample implementiert, die void MyMethod(ref int[]) bereitstellt. Daher glaube ich, dass es in der Tat nicht CLS-konform ist.


EDIT: Eric Lippert hat sich auf die ursprüngliche Frage kommentierte, dass er glaubt, dass dies in der Tat ist ein Compiler-Fehler und dass der ursprüngliche Code ist CLS-konform.


Dies aber gilt:

[assembly: CLSCompliant(true)] 
namespace MyNamespace 
{ 
    public class Sample : ISample, ISample2 
    { 
     void ISample.MyMethod(ref int[] array) 
     { 
     } 

     void ISample2.MyMethod(int[] array) 
     { 
     } 
    } 

    public interface ISample 
    { 
     void MyMethod(ref int[] array); 
    } 

    public interface ISample2 
    { 
     void MyMethod(int[] array); 
    } 
} 

Das liegt daran, dass CLS definiert, dass zwei Schnittstelle widersprüchliche Methoden mit dem gleichen Namen oder Unterschrift und dem Compiler muss wissen, definieren kann, wie man den Unterschied zu erkennen - aber wieder nur, wenn der Konflikt zwischen zwei Schnittstellen besteht.

+0

Danke. "Daher glaube ich, dass es in der Tat nicht CLS-konform ist." - Ich verstehe nicht, warum das eine logische Schlussfolgerung für Ihren Syllogismus ist. Können Sie mich auf eine Definition der CLS-Compliance hinweisen, die zwischen diesen Fällen unterscheidet? – Joe

+0

Nun, ich lese die Spezifikation unter http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx. Meine Argumentation basiert auf der Tatsache, dass beide Typen für die aufrufende Assembly sichtbar sind und dass "CLS-Regeln für die Teile eines Typs gelten, die außerhalb der definierenden Assembly verfügbar sind". – configurator

+0

Wenn Sie jedoch eine explizit implementierte öffentliche Schnittstelle als "Teil eines Typs ansehen, der außerhalb der definierenden Assembly verfügbar gemacht wird", gelten dieselben Überlegungen für zwei explizit implementierte öffentliche Schnittstellen - also sollten beide oder keines Ihrer Beispiele verwendet werden CLS-konform. Allerdings sehen Sie den Kommentar von Eric Lippert auf die ursprüngliche Frage - es scheint, dass dies CLS-konform ist und die Warnung ist ein Compiler-Fehler. – Joe

Verwandte Themen