C# 警告CS3006在这种情况下有效吗?
下面的代码生成一个警告CS3006“重载方法MyNamespace.Sample.MyMethod(int[]),仅在ref或out或数组秩中不同,不符合CLS” 该警告是否有效,即是否确实不符合CLS?我原以为显式接口实现不会算作重载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[]
[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的。然而,埃里克·利珀特可能比我更了解情况,我相信他是正确的。