2011-03-12 3 views
3

이 질문은 프로젝트 요구 사항이나 문제보다 호기심이 부족합니다.다른 언어를 사용하는 프로젝트에서 비 CLS 호환 코드를 숨기는 방법?

하나의 언어 (예 : C#)의 비 CLS 규격 코드가 있으며 현재 언어 (프로젝트 전체에서 내부 선택을 할 수 없도록 선택)와 같은 방식으로 사용해야합니다. 다른 시간 (예를 들어 VB)에서 컴파일 타임 오류가 발생하지 않고 충돌하는 구현을 호출 할 수 있도록 허용하려고합니다. 예를 들어

,

//C# 
public class SecurityService 
{ 
.... 
    public void Print() 
    { 
     Console.WriteLine("print"); //This method prints Service Name in lower case 
    } 

    public void PRINT() 
    { 
     Console.WriteLine("PRINT");//This method prints service name in UPPER case. 
    } 
} 
'VB.Net 

Module ServiceReader 

    Sub Main() 
     Dim service As New SecurityService() 
     service.print() 'Compile time error: print is ambiguos 
    End Sub 

End Module 

문제 : 어떻게 든 C# 프로젝트가 원하는 호출 할 수 있도록 교차 언어 프로젝트에서 내 '인쇄'방법 (중 하나를 숨겨 여기에 컴파일 시간 오류를 방지 할 필요가 이행).

관심을 가져 주셔서 감사합니다.

+2

둘 다'public'이 필요하면'PRINT'의 이름을'PrintUpperCase'로 바꾸십시오. –

+0

'PRINT'가베이스의 일부이고'print'가 다른 것의 일부인 더미 상속 레이어를 추가하면 어떻게 될까요? C#은 코드와 정확히 일치하는 버전을 사용하지만 VB.NET은 행복하게 "Print"의 대문자/소문자 형식을 사용하여 파생 클래스 버전을 사용할 것으로 기대합니다. 그러나 시도하지 않았습니다. – supercat

답변

3

VB.NET과 같은 언어는 식별자가 대소 문자를 구분하지 않는다는 기본 구문 규칙을 벗어나지 않습니다. 해결하기가 어렵지 않습니다. C#과 같이 대소 문자를 구별하는 언어로 간단한 정적 어댑터 메소드를 작성할 수 있습니다.

public static class Interop { 
    public static void Print2(SecurityService obj) { 
     obj.PRINT(); 
    } 
} 

언어를 지원한다고 가정 할 때 확장 메서드로 바둑판 식으로 완전히 밀 수 있습니다. Jit Optimizer가 실행될 때 실제 런타임 오버 헤드는 없습니다.

1

나는 '당신이 비 CLS 준수 방법/속성 internal을 제안하지만, 그 물건을 호출 할 CLS 호환되지 않는 다른 클래스를 만들고 클래스

+0

"CLSCompliant (false)"-이 속성은 컴파일러 경고를 표시하는 것 이외의 다른 작업을 수행합니까? –

+0

특정 클래스를 비 CLS 규격으로 표시합니다. CLS와 호환되지 않는 특정 메소드를 표시 할 수도 있지만 교차 언어 프로젝트에서이를 숨기고 다른 클래스 (예 : MyClassExtensions)를 가리키는 것이 더 나은 방법 인 것 같습니다. –

1

[CLSCompliant(false)]로에게 내가 돈 것을 표시 할 것 이 일을하려는 지점을 보지 마라. 제 조언은 처음에는 문제를 피하고 규격을 준수하지 않는 코드 작성을 중단하는 것입니다. 특히 다른 언어를 지원할 계획이라면 더욱 그렇습니다. 여기에서 모듈에 대한 완전한 제어권을 가졌으므로 멋진 해킹이 실제로 필요하지 않습니다.

관련 문제