警告CS3006在这种情况下有效吗?

时间:2009-05-22 10:31:26

标签: c# .net cls-compliant

下面的代码生成警告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);
    }
}

1 个答案:

答案 0 :(得分: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定义了两个接口可以定义具有相同名称或签名的冲突方法,并且编译器必须知道如何区分 - 但同样,只有当冲突在两个接口之间时才会发生。