2017-12-18 34 views
0

암시 적 캐스팅을 int에서 A으로 오버로드 할 때 연산의 왼쪽면 인스턴스를 얻을 수있는 방법이 있습니까? 이처럼암시 적 캐스트 연산자의 왼쪽 편에 대한 참조

:

public class A 
{ 
    int myInt; 
    public static implicit operator A(int x) 
    { 
     a.myInt = x; 
    } 
} 

다음

A myA = new A(); 
myA = 2; 

myA.myInt 내가 인터넷에서 검색하지만이 정확한 문제에 대한 답을 찾을 수 없습니다 2

이되도록. 정적 함수이기 때문에 가능하지 않다고 생각합니다. 함수에 두 개의 매개 변수를 넣으려고하면 오류가 발생합니다. 또한 null 변수 (예 : A myA;과 같이 선언 한 경우)에서이 작업을 수행하려고하면 오류가 발생하는 것을 확인할 수 있습니다. 하지만 구조체에서 할 수있다. (왜냐하면 구조체가 널이 될 수 없다는 것을 알기 때문에 또는 널을 할당 할 수 없기 때문에 내가 틀렸다면 나를 바로 잡아라.).

나는이 작품과 비슷한 것을 만들 수있는 일종의 마법사가 있는지 궁금합니다.

+0

그것은 내가 할 때'(MyDestType)을 참조로 "는"'MyDestType'이 있어야한다 myExpr' 말하는 것과 같다. 그러나 캐스트가 발생하기 전에 __ myDestType이 없습니다. 변환 연산자 본문에서 먼저 인스턴스를 로컬 변수로 만듭니다. 그런 다음 필요에 따라 수정할 수 있습니다. 마지막으로 반환하십시오. 위의 내용은 합법적 인 C#이 아닙니다. –

+0

= 연산자를 오버로드하면 어떻게됩니까? 작업의 왼쪽에 대한 참조를 얻을 수있는 방법이 있습니까? – ItsaMeTuni

+0

@ItsaMeTuni 해당 운영자에게 과부하를 걸 수 없습니다. – Servy

답변

4

항상 존재하지는 않으므로 myA.myInt 또는 다른 왼쪽면에 대한 참조를 얻을 수 없습니다.

void Foo(A a) {...} 
... 
Foo(2); 

Foo(2)이 암시 적 변환 연산자를 호출 할 필요 호출, 아직 반환 값은 Fooa 이외의 다른 할당되지 않은 : 여기

은 왼쪽이 문제가 될 것입니다 결정할 때 예입니다 매개 변수는 호출자에서 사용할 수있는 변수가 아닙니다.

Demo.

3

이것은 불가능합니다. 암시 적 연산자는 값을 반환합니다. C# 컴파일러가 생성 한 코드로 해당 코드를 호출하여 값을 얻고 호출자가 사용해야한다고 지시 한 방식으로 코드를 사용합니다.

심지어 일 수는 없습니다. 저장 위치는입니다. 누군가가 SomeMethodThatAcceptsAnAInstance(2)이라고 쓰면 암시 적 변환 결과를 변수에 저장하지 않을 것입니다. 이 암시 적 연산자의 값이 설정 될 때까지 초기화되지 않은 변수 인 A a = 2;을 쓸 수도 있습니다. 따라서 암시 적 연산자가 호출 될 때 저장소 위치가 유효한 상태가 아닙니다.