3

下面的代码生成警告 CS3006“重载的方法 MyNamespace.Sample.MyMethod(int[])' 仅在 ref 或 out 或数组等级中不同,不符合 CLS”。

这个警告是否有效,即这真的不符合 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 定义了两个接口可以定义具有相同名称或签名的冲突方法,并且编译器必须知道如何区分 - 但同样,只有当冲突发生在两个接口之间时。

于 2009-05-22T13:35:11.123 回答