2014-11-18 4 views
16

내 기존 솔루션으로 VS2015를 시도했지만 컴파일러가 이전에 잡을 수 없었던 코드와 같은 유효한 새로운 오류가 발생했지만이 줄에 예를 들어 오류가 발생합니다. : 그것은 분명히 유형이 일치하지, 그 오류가 발생 왜 내가 볼 수없는C# 6/C++ ref 키워드 오류

Error CS1503 Argument 3: cannot convert from 'ref bool [mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]' to 'ref bool [mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]'

:

bool bWasAlreadyLocked = false; 
oEnv.LockDoc(oWarnings, oEventDoc, ref bWasAlreadyLocked); 

나는 다음과 같은 오류가 발생합니다. 이 버그는 새 컴파일러에서 발생합니까 아니면 ref 키워드의 동작이 변경 되었습니까?

이 경우 함수는 C++ 클래스에서 파생 된 C# 클래스를 사용하여 C#으로 가져온 C++ 함수입니다.

void CBkgDocEnvX::LockDoc(
CFIWarningList ^oWarnings, 
CBaseDoc ^oBaseDoc, 
// Output 
bool %rbWasAlreadyLocked) 

내가 C++ 지금은 솔루션의 소스에 대한 VS2013의 C++ 컴파일러를 사용하기로 선택 언급하는 것이 좋을 것입니다, 그래서 C++ 측면 이전과 동일해야합니다 : 그것은 서명이입니다입니다. 내 생각 엔 C#과 C++ 사이의 interop에서 뭔가 바뀌었다.

+1

'LockDoc'의 서명은 무엇입니까? –

+0

그것을 찾았습니다, 그것은 C++ 함수입니다. –

+0

그리고'%'는 C++ 추적 연산자 인 것 같습니다. C#에서 처리하는 방법을 잘 모릅니다. –

답변

0

이 오류는 매개 변수에 out 특성을 명시 적으로 추가하여 해결할 수 있습니다.

매개 변수 을 ref 매개 변수에 추가하면 새 C# 컴파일러가 이들이 동일한 유형임을 인식하고 받아 들일 것입니다. 이제 interop 솔루션의 메소드는 다음과 같습니다.

using namespace System::Runtime::InteropServices; 

... 

virtual void LockDoc(
    CFIWarningList ^oWarnings, 
    CBaseDoc ^oBaseDoc, 
// Output 
    [Out] bool %rbWasAlreadyLocked 
    ) override; 
1

이 점을 확인하기 만하면됩니다.

  1. L- 값만 참조로 전달 될 수 있습니다. L 값은 과제의 왼쪽에 나타날 수있는 변수 및 기타 표현식입니다. 지역 주민, 필드 액세스, 포인터 역 참조 및 배열 요소 액세스를 포함합니다. L 값에는 식별 할 수있는 컴퓨터 주소가 없거나 CLR로 제한되는 읽기 전용 필드가 포함되지 않은 속성 액세스가 포함되지 않습니다.
  2. 참조 매개 변수는 확장 메소드의 대상이 될 수 없습니다. "this"매개 변수가 값으로 복사되기 때문에 확장 메서드 호출은 값 형식에 비쌉니다. 이것은 또한 값 유형이 변경 가능한 확장 메소드를 가질 수 없음을 의미합니다. 이는 참조로 값 유형 "this"매개 변수를 전달하는 인스턴스 메소드와 직접적으로 대조됩니다.
  3. 연산자 오버로딩 기능에는 참조 매개 변수를 사용할 수 없습니다.

자세한 내용은 here을 참조하십시오.

+0

모든 것이 합리적이지만 새로운 것은 아닙니다. 코드가 VS2013에서 작동하기 때문에이 경우 중 하나가 원인이라고 의심 스럽지만 내가 틀렸다면 수정 해주십시오. 또한 위의 ref 매개 변수 선언을 볼 수 있습니다. –

0

부울 대신 Object 데이터 형식을 사용해 볼 수 있습니다. 그 후에는 부울로 구문 분석 할 수 있습니다.

+1

또는 VS2015를 사용할 수 없습니다. 프로젝트 전체에서 수 백개의 장소에서 타이핑을 제거하는 대신 작동하지 않습니다.) –

1

두 프로젝트가 호환되지 않는 유형의 컴파일러 오류가 발생합니다. Visual Studio에서는 참조되는 어셈블리가 참조하는 프로젝트의 .NET 프로파일 유형에 의해 지원되지 않는 경우에도 휴대용 클래스 라이브러리 프로젝트 (또는 .NET 4.0 프로젝트)에 대한 참조를 추가 할 수 있습니다.

가장 일반적인 경우는 .NET 4.0 프로젝트를 사용하고 이전 .NET 4 버전보다는 프로필 설정에서 .NET 4.5를 지정하는 Probable Class Library 프로젝트를 참조하는 경우입니다. .NET 4.0 프로젝트에서 PCL 어셈블리를 참조 할 때 전체 intellisense 지원을 계속받습니다 (예 : intellisense 소스 코드를 편집 할 때 참조되는 어셈블리 안에 포함 된 모든 네임 스페이스, 클래스 및 속성이 표시됨). 그러나 컴파일 타임에 같은 종류의 오류가 발생했습니다. 특히 내가 솔루션을 컴파일 할 때 컴파일은 라이브러리 불일치를 나타내지 만 찾고있는 라이브러리, 버전 및 공개 키와 똑같은 것을 나열합니다.

프로젝트 속성을 검사하여 호환되는지 확인하십시오.