代码之家  ›  专栏  ›  技术社区  ›  to StackOverflow

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

  •  3
  • to StackOverflow  · 技术社区  · 15 年前

    下面的代码生成一个警告CS3006“重载方法MyNamespace.Sample.MyMethod(int[]),仅在ref或out或数组秩中不同,不符合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 回复  |  直到 15 年前
        1
  •  2
  •   configurator    15 年前

    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定义了两个接口可能定义具有相同名称或签名的冲突方法,并且编译器必须知道如何区分它们之间的差异——但同样,只有当冲突发生在两个接口之间时。