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 Sample
void 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.
Das ist interessant. Ich habe keine Antwort, aber ich werde versuchen, es herauszufinden ... IMO, es sollte kein Fehler sein. –
BTW, ich habe es in .NET 4.0 versucht, und es verhält sich genauso. –
"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