2009-05-22 3 views
3

아래의 코드는 경고 CS3006 "ref 나 out 또는 배열 랭크가 다른 CLP와 호환되지 않는 메서드 오버로드 된 MyNamespace.Sample.MyMethod (int [])"를 생성합니다. "이 경우 CS3006 경고가 유효합니까?

이 경고는 유효합니까? 즉, 진정으로 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); 
    } 
} 
+0

재미 있습니다. 나는 대답이 없다. 그러나 나는 알아 내려고 노력할 것이다 ... IMO, 그것은 오류가되어서는 안된다. –

+0

BTW, .NET 4.0에서 시도해 보았습니다. 동일한 동작을합니다. –

+0

"알아 내겠습니다"- 대단히 감사합니다. 이를위한 유즈 케이스는 .NET 클라이언트에 대한 참조 매개 변수없이 ComVisible 인터페이스 (배열 매개 변수가 ref이어야 함)를 갖는 것입니다. – Joe

답변

2

CLS 규격은 클래스의 보이는 부분에만 적용됩니다. 따라서 ref int[]public이 아니므로 관련이 없습니다. 그러나 그것은 인터페이스를 통해 볼 수 있습니다.

코드 사용자는 Samplevoid MyMethod(int[])을 제공한다는 것을 알고 있습니다. 그들은 또한 void MyMethod(ref int[])을 제공하는 ISample을 구현한다는 것을 알고 있습니다. 따라서 실제로 CLS를 준수하지 않는다고 생각합니다.


편집 : 그는이 사실 컴파일러의 버그이며, 원래의 코드 것을 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); 
    } 
} 

- 그러나 충돌은 두 인터페이스 사이에서만 발생합니다.

+0

감사합니다. "따라서 CLS 준수하지 않는 것이 사실입니다." - 이것이 당신의 삼단 논법에 대한 논리적 결론 인 이유는 모르겠다. CLS 규정의 정의를 통해 이러한 사례를 구분할 수 있습니까? – Joe

+0

글쎄, 사양을 http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx에서 읽었습니다. 내 추론은 두 형식 모두 호출 어셈블리에서 볼 수 있으며 "CLS 규칙은 정의 어셈블리 외부에 노출 된 형식의 부분에 적용됩니다."라는 사실을 기반으로합니다. – configurator

+0

그러나 명시 적으로 구현 된 공용 인터페이스를 "정의 어셈블리 외부에 노출되는 유형의 일부"로 간주하는 경우 두 가지 명시 적으로 구현 된 공용 인터페이스에도 동일한 추론이 적용되므로 두 가지 또는 모두 예제가 있어야합니다. CLS 준수. 원래 질문에 대한 Eric Lippert의 의견을 참조하십시오 - CLS 호환이며 경고는 컴파일러 버그 인 것 같습니다. – Joe

관련 문제