質問

以下のコードは、「オーバーロード方法MyNamespace.Sample.MyMethod([] intは)」のみREFまたはアウト、または配列順位が異なる、CLSに準拠していません」警告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);
    }
}
役に立ちましたか?

解決

CLS準拠は、あなたのクラスの可視部分に適用されます。そのため、あなたはref int[]publicないので、関連はないと思われるだろう。しかし、それは、インターフェイスを介して、表示されます。

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

<時間>

EDIT: の彼は、これがあると考えていることを、元の質問にコメントしています実際にはコンパイラのバグと、元のコードは、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);
    }
}
衝突は、2つのインターフェース間にある場合にのみ、再びが、

-

CLSは、2つのインターフェイスが同じ名前または署名とコンパイラと競合する方法を定義することができることを規定するためである違いを見分ける方法を知っていなければなりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top