Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 警告CS3006在这种情况下有效吗?_C#_.net_Cls Compliant - Fatal编程技术网

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

C# 警告CS3006在这种情况下有效吗?,c#,.net,cls-compliant,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[]

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

CLS合规性仅适用于类的可见部分。因此,您可能认为
refint[]
不是
public
,因此不相关。但它是可见的,通过界面

代码的用户知道,
Sample
提供了
voidmymethod(int[])
。他们还知道它实现了
ISample
,它提供了
voidmymethod(refint[])
。因此,我相信这其实是不符合CLS的


编辑:对原始问题发表了评论,他认为这实际上是一个编译器错误,并且原始代码符合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定义了两个接口可能定义具有相同名称或签名的冲突方法,编译器必须知道如何区分它们之间的差异——但同样,只有当冲突发生在两个接口之间时才知道。

这很有趣。我没有答案,但我会努力找出。。。在我看来,这不应该是一个错误。顺便说一句,我在.NET4.0中尝试过它,它的行为是一样的。“我会努力找出答案”-非常感谢。这种情况的用例是有一个ComVisible接口(其中数组参数必须是ref),而没有.NET客户端的ref参数。这看起来像是一个编译器错误。我将由bug分类团队来运行它,但我不希望C#4.0能够解决这个问题。谢谢你让我注意到这一点。“这看起来像是一个编译器错误。”我希望能以这种或那种方式确认这一点。修复并不重要,但我想知道是否应该通过使用#pragma抑制编译器警告或将类标记为CLSCompliant(false)来处理此问题。“因此,我认为它实际上不符合CLS。”-我不明白为什么这是你三段论的逻辑结论。你能给我指出一个CLS合规性的定义来区分这些情况吗?好的,我在。我的推理是基于这两种类型对调用程序集是可见的,并且它表示“CLS规则适用于在定义程序集之外的类型的那些部分。”但是如果您认为显式实现的公共接口是“在定义程序集之外暴露的类型的一部分”,然后,同样的推理将应用于两个显式实现的公共接口——因此,两个示例或两个示例都不符合CLS。但是,请参阅Eric Lippert对原始问题的评论-这似乎是符合CLS的,警告是一个编译器错误。@Joe,规范中明确定义了两个显式实现的公共接口的情况,因此无论所讨论的情况是否符合CLS,都是符合CLS的。然而,埃里克·利珀特可能比我更了解情况,我相信他是正确的。