문제

방금 최근 답변 중 하나에서 사용하는 것을 보았습니다.

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

왜 우리는 단어가 필요합니까? 절대적인 여기, 그리고 그것은 무엇을 의미합니까?

도움이 되었습니까?

해결책

암시 적 란 전환에 코드에 캐스트가 필요하지 않음을 의미합니다.

이제 다음을 수행 할 수 있습니다.

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

다른 팁

그것은 암시 적 연산자의 오용처럼 보입니다. SavePoint 클래스가 무엇을하는지 모르겠지만 부울으로 변환하는 것은 논리적으로 보이지 않습니다. 암시 적 연산자를 사용하면 저장 포인트 참조가 단순히 참조를 평가하여 NULL인지 확인할 수 있습니다.

if (point) {

대신에:

if (point != null) {

그런 식으로 사용된다면 코드가 실제로 수행하는 작업을 숨기고 있으며 C#에 대한 거의 모든 것에 위배됩니다.

Mquander의 대답에 추가하기 위해.

C# 3.0 언어 사양에서 :

전환 연산자 선언 implicit 키워드는 사용자 정의 암시 적 변환을 소개합니다. 기능 멤버 호출, 캐스트 표현 및 할당을 포함한 다양한 상황에서 암시 적 변환이 발생할 수 있습니다.

(섹션 10.10.3)

변환 연산자는 한 유형에서 다른 유형으로 변환합니다. 암시 적은 변환이 발생하기 위해 코드에 명시적인 캐스트를 입력 할 필요가 없다는 것을 의미합니다.

변환이 데이터를 잃지 않는다고 확신 할 때 암시 적 변환 연산자를 사용합니다. 예를 들어, 강요가 넓어지면 (int-> long, float-> double). 명시 적 변환 연산자는 일부 상태가 손실되거나 컴파일러가 전환기를 삽입하여 클라이언트 코드를 자동으로 조이는 것을 원하지 않습니다.

당신과 같은 전환은이 특정 변환을 수행하는 것이 좋지 않기 때문에 실제로 혼란을 일으킬 것입니다.

명백한 연산자도 있기 때문에 '암시 적'을 지정해야합니다.

이것은 부울과 저장 점 사이의 변환이 암시 적으로 수행 될 수 있음을 의미합니다 (예 : = 숨겨진).

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

예를 들어 명시적인 전환은 다음과 같은 방식으로 수행 할 수 있습니다.

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

데이터 손실이없는 경우 암시 적 변환이 종종 사용됩니다. Int16 (short) 에게 Int32 (int). 그러나 가능하다면 명시 적 변환을 사용하여 '동의'해야합니다.

예를 들어, 귀하의 경우 if Savepoint 그냥 a

struct Savepoint
{
  public bool data;
}

데이터 손실이 없기 때문에 암시 적 변환을 사용할 수 있습니다.

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

그렇지 않으면 명시 적 연산자를 정의하는 것이 좋습니다!

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