2016-09-02 1 views
0

C# 코드를 호출 할 수있는 C++/CLI 래퍼가 있습니다. C# 코드에서는 nullable enum을 매개 변수로 받아들이는 메서드가 있지만 래퍼의 null 매개 변수로이 메서드를 호출하는 방법을 알 수 없습니다.C++/CLI에서 관리되는 C#으로 Nothing 보내기

C#을 방법 :

public int DoSomething(MyEnum? option) 
{ 
    if (option != null) 
     //Do something 
    else 
     //Do something else 
} 

해봐요() 호출하는 C++ 기능 : 나는 몇 가지를 시도했지만 아무것도 지금까지 근무하지 않았다

int MyMethod(int option) 
{ 
    int myVal; 
    if (option > -1) 
    { 
     myVal = component->DoSomething((CSharpNameSpace::MyEnum)option); //This works 
    } 
    else 
    { 
     myVal = component->DoSomething(??); //I want to send null here 
    } 
} 

:

  • 0 전송을 NULL , 또는 nullptr 컴파일되지 않습니다.
  • (CSharpNameSpace :: MyEnum) NULL i 값을 0으로 설정하는 것

나는 C# 코드를 제어 할 수 없기 때문에 열거 형을 none 값이나 그와 비슷한 것으로 변경할 수 없다.

+1

무엇 C++ 코드에서 실제의 형태가'MyEnum', 그리고 당신이 C 번호에'MyEnum' 종류와 같은지 어떻게 셨나요? – PaulMcKenzie

+0

실제로 CSharpNameSpace :: MyEnum으로 사용 중입니다 ... 코드를 업데이트 할 것입니다 ... –

+0

은 C++ env에 정의 된 모두 소문자'null'입니까? –

답변

4

Nullable 유형은 C++/CLI에서 구문 사랑이 없으므로 C#과 매우 유사합니다. 기본 장애물은 nullptr에서 Nullable 로의 암시 적 변환이 없다는 것입니다. 간단한 방법은 기본 생성자에 의존하는 것입니다

int MyMethod(int option) 
{ 
    Nullable<ClassLibrary1::MyEnum> enu; 
    if (option > -1) enu = safe_cast<ClassLibrary1::MyEnum>(option); 
    return component->DoSomething(enu); 
} 
+0

내가 그 일을하고 옵션이 -2라고 말하면 C# 메서드는 -2 값을 얻고 널 확인에 실패합니다 :-( –

+2

해리포터 소설에서만 가능합니다. 당신은 어떻게 든 if() 문을 놓쳤습니다. –

+0

그래서이게 실제로 작동합니다! 당신이 말한 것처럼 정확하게하고 있었지만, 나를 위해 실패했습니다 .C# 비트를 책임지는 개발자를 얻었고 코드에서 버그를 발견했습니다! 두 번 승리하십시오! –