'x'유형을 '문자열'으로 암시 적으로 변환 할 수 없다 - 언제 그리고 어떻게“할 수 없다”고 결정 하는가?
-
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 ().
그 외에도 컴파일러는 호환되는 것으로 알려진 경우에만 유형을 변환합니다 (예 : 기본 클래스 또는 인터페이스 구현 또는 명시 적으로 코딩 된 변환 연산자를 통해). 캐스트를 사용하고 컴파일러가 유형이 호환 될 수 없다는 것을 알고있을 때 (예 : 인터페이스가 아닌 동일한 상속 선에 있지 않음)도 변환 할 수 없다고 말합니다. 일반 유형 매개 변수도 마찬가지입니다.