3

以下のコードは、警告 CS3006 を生成します。

この警告は有効ですか、つまり、これは本当に CLS に準拠していないのでしょうか? 明示的なインターフェイスの実装はオーバーロードとしてカウントされないと思っていました。

[assembly: CLSCompliant(true)]
namespace MyNamespace
{

    public class Sample : ISample
    {
        public void MyMethod(int[] array)
        {
            return;
        }

        void ISample.MyMethod(ref int[] array)
        {
            this.MyMethod(array);
        }
    }

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

1 に答える 1

2

CLS 準拠は、クラスの表示部分にのみ適用されます。したがって、 はそうではなく、関連性ref int[]がないと考えるでしょう。publicしかし、それはインターフェースを通して見ることができます。

コードのユーザーは、それが提供することを知っていSampleますvoid MyMethod(int[])。彼らはまた、それが提供するものを実装していることも知ってISampleいますvoid MyMethod(ref int[])。したがって、実際にはCLSに準拠していないと思います。


編集: Eric Lippertは、元の質問に対して、これは実際にはコンパイラのバグであり、元のコードは CLS 準拠であると考えているとコメントしています。


ただし、これは有効です。

[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);
    }
}

これは、CLS が、2 つのインターフェイスが同じ名前またはシグネチャを持つ競合するメソッドを定義する可能性があり、コンパイラがその違いを見分ける方法を認識している必要があると定義しているためです。

于 2009-05-22T13:35:11.123 に答える