'x'유형을 '문자열'으로 암시 적으로 변환 할 수 없다 - 언제 그리고 어떻게“할 수 없다”고 결정 하는가?

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

문제

지금 나는 그것을 가지고있다 Guid에스.

나는 어떤 곳에서 코드 전체 에서이 암시 적 변환이 작동하지만, 다른 곳에서는 그렇지 않다는 것을 기억합니다. 지금까지 나는 패턴을 보지 못한다.

컴파일러가 할 수없는시기를 어떻게 결정합니까? 내 말은, 유형 방법입니다 Guid.ToString() 이 변형이 필요할 때마다 호출되지 않습니까?

누군가가 어떤 상황 에서이 변화가 자동으로 그리고 내가 전화 해야하는시기를 말해 줄 수 있습니까? myInstance.ToString() 명시 적으로?

도움이 되었습니까?

해결책

요컨대, 암시 적 또는 명시 적 변환 연산자가 정의 된 경우 :

class WithImplicit {
    public static implicit operator string(WithImplicit x) {
        return x.ToString();}
}
class WithExplicit {
    public static explicit operator string(WithExplicit x) {
        return x.ToString(); }
}
class WithNone { }

class Program {
    static void Main() {
        var imp = new WithImplicit();
        var exp = new WithExplicit();
        var none = new WithNone();
        string s1 = imp;
        string s2 = (string)exp;
        string s3 = none.ToString();
    } 
}

다른 팁

아니요, 암시 적 변환은 없습니다 GUID 에게 String, 코드에서는 전혀 작동하지 않습니다.

명시적인 변환이있는 곳에서만 작동하지만 변환은 눈에 잘 띄지 않을 수 있습니다. 예를 들어 현을 연결할 때 :

string id = "--" + guidValue + " : " + num;

이것은 암시 적 변환처럼 보일 수 있습니다 GUID 에게 String, 그러나 그렇지 않습니다. 생성 된 코드는 실제로 다음과 같습니다.

string id = String.Concat(new object[] { "--", guidValue, " : ", num });

모든 피연산자는 유형에 캐스트됩니다 Object 배열에 배치됩니다. 그만큼 String.Concat 메소드를 호출합니다 ToString 배열의 각 항목에 대한 방법 문자열 표현을 얻을 수 있습니다.

효과적으로 Tostring () 자신을 부를 필요가없는 유일한 곳은 현을 연결할 때입니다.

Guid g;
int i;
string s = "Hello "+g+' '+i;

그런 다음 .NET 프레임 워크에 의해 호출이 이루어지는 상황이 있습니다. String.format ().

그 외에도 컴파일러는 호환되는 것으로 알려진 경우에만 유형을 변환합니다 (예 : 기본 클래스 또는 인터페이스 구현 또는 명시 적으로 코딩 된 변환 연산자를 통해). 캐스트를 사용하고 컴파일러가 유형이 호환 될 수 없다는 것을 알고있을 때 (예 : 인터페이스가 아닌 동일한 상속 선에 있지 않음)도 변환 할 수 없다고 말합니다. 일반 유형 매개 변수도 마찬가지입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top