2009-03-01 4 views

답변

28

암시 적은 변환시 코드에 캐스트가 필요 없음을 의미합니다.

이제이 작업을 수행 할 수 있습니다

Savepoint point = new Savepoint(); 
if(point) // becomes a bool using your operator 
{ 
} 

를 대신이 작업을 수행 할 필요없이이 유용한 구별이 숫자 유형입니다 이유

Savepoint point = new Savepoint(); 
if((bool)point) // an "explicit" conversion 
{ 
} 

한 예입니다.

float f = 6.5; 
double d = f; // implicit conversion 

그러나 사용자를 강제로 만 명시 적 변환이 그래서 작은 종류의 큰 종류를 변환하는 것은 위험 할 수 있습니다 정말 그 것을 명확히하기 : 암시 적 변환은 예를 "큰"유형, "작은"유형에서있다 문제의 작업을 수행하려고합니다 :

long l = 20; 
// short s = l; 
short s = (short)l; // explicit conversion 
+0

당신은 노골적인 숫자 캐스팅에 당신의 단어가 섞여 있습니다. "더 작은 유형을 더 큰 유형으로 변환"하는 것은 그 반대의 방향이어야합니다. – Samuel

+0

감사합니다. 나는 내 실수를 고쳤다. – mquander

+0

float가 double보다 작습니까? – configurator

2

그냥 mquander의 답변에 추가 할 수 있습니다. 는 C# 3.0 언어 사양에서

:

는 사용자 정의 암시 변환 도입 implicit 키워드를 포함하는 변환 연산자 선언. 암시 적 변환은 다양한 상황에서 , 함수 멤버 호출을 포함하는 , 캐스트 표현식 및 할당을 등 다양한 상황에서 발생할 수 있습니다.

(섹션 10.10.3)

0

또한 명시 적으로 운영이 있기 때문에 '암시'를 지정해야합니다.

이것은 부울과 저장 점 간의 변환이 암시 적으로 수행 될 수 있음을 의미합니다. = 숨김.

Savepoint s = new Savepoint(); 
bool b = s; 

명시 적 변환 분명히, 이러한 방법을 수행 할 수없는 데이터 손실이없는 경우

Savepoint s = new Savepoint(); 
bool b = (bool)s; 

암시 적 변환이 자주 즉 Int16 (short)Int32 (int)에 사용된다. 그러나 가능하다면 명시 적 변환을 사용하여 '동의'해야합니다. 예를 들어, 귀하의 경우에는

, Savepoint 경우 단지

struct Savepoint 
{ 
    public bool data; 
} 

데이터 손실이 가능하지 않기 때문에 당신이 암시 적 변환을 사용할 수 있습니다 그렇지 않으면

Savepoint s = new Savepoint(); 
s.data = true; 
bool b = s; 

난 당신이 명시 적으로 정의하는 것이 좋습니다 운영자!

7

암시 적 연산자의 오용과 같습니다. Savepoint 클래스가하는 일을 모르지만, 부울로 변환하는 것은 논리적으로 보이지 않습니다.

if (point) { 

대신 : 암시 적 연산자는 세이브 포인트 참조가 null인지 아닌지 단순히 참조 평가하여 확인할 수 있습니다 그것은 그런 식으로 사용되는 경우

if (point != null) { 

을, 그 숨어있는 어떤 코드 실제로하고 있고, 그것은 거의 C#에 관한 모든 것에 반대합니다.

+0

이것은 완전히 맞습니다. – mquander

1

변환 연산자는 한 유형에서 다른 유형으로 변환합니다. 암시 적은 변환을 위해 코드에 명시 적 형변환을 입력 할 필요가 없음을 의미합니다. 명시 적으로 코드에서 캐스트를 호출해야합니다.

변환으로 인해 데이터가 손실되지 않는다는 것을 확신 할 때 암시 적 변환 연산자를 사용합니다. 예를 들어, 변환을 넓히는 경우 (int -> long, float -> double). 명시 적 변환 연산자는 일부 상태가 손실되거나 컴파일러가 모든 곳에서 변환을 삽입하여 클라이언트 코드를 자동으로 고사하고 싶지 않을 때 사용됩니다.

이 변환을 수행하는 것이 바람직하지 않기 때문에 사용자의 변환과 같은 혼란이 실제로 발생합니다.