충돌

2016-07-22 3 views
0

나는 C++/CLI에서 클래스를 관리 쓴 :충돌

public ref class Foo 
{ 
public: 
    void func1(Foo% foo){} 
    void func2(Foo^% foo){} 
}; 

을 그럼,이 같은 C# 콘솔 응용 프로그램의 방법을 사용하고 있습니다 :

Foo foo = new Foo(); 
Foo foo2 = new Foo(); 
foo.func1(ref foo2); // getting error 
foo.func2(ref foo2); // OK 

정말 돈 ' 이 차이를 이해하지 못합니다. 로서 FUNC1 및 FUNC2 C#의 취급 특성 :

void func1(Foo); 
void func2(ref Foo); 
+2

'^'는'ref'를 의미합니다. 너 이해 하지마? – SLaks

+0

나는 ^가 포인터를 의미한다고 생각했다. – LmTinyToon

+0

아, 이해했다. 고마워. – LmTinyToon

답변

2
void func1(Foo% foo) 

칠이 암시 기준이다. native C++ feature이며 Foo가 관리되지 않는 유형 인 경우 Foo&과 같습니다. C++/CLI도이를 지원합니다. 가능한 한 C++로 시도합니다. 때때로 실수로, 그들이 Foo^&을 대신 허용했다면 틀림없이 훨씬 더 명확해질 것입니다.

그러나 C#과 같은 다른 .NET 언어의 기능은 아니지만, 동일한 것을 표현하는 구문이 없습니다. 이 언어는 객체 참조와 값의 차이점을 최대한 숨기려고하기 때문에 최소한입니다. 때로는 실수로. MSIL 기능이 아니기 때문에 C++/CLI 컴파일러가이를 구현해야합니다. C++ 컴파일러와 매우 비슷합니다. 인수 유형은 실제로 메타 데이터에 Foo^이지만 메소드 인수에 주석을 달려면 a [modopt]입니다. C# 컴파일러가 금지 된 과일인지, 메소드 오버로드 문제를 일으킬 가능성이 있는지 충분히 알 수 있습니다.

Foo는 참조 유형이므로 실제로는 Foo^을 사용해야합니다. 또는 참조로 객체 참조를 전달하려는 경우 Foo^%, 메소드가 새 Foo 객체를 만드는 경우에만 유용합니다.