왜 내가 '??'을 사용할 수 없습니까?System.Dbnull 값을위한 피연산자?

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

  •  13-09-2020
  •  | 
  •  

문제

NULL이되는 열을 가져 오는 Oracle 데이터 테이블이 있습니다.그래서 나는 코드를 멋지고 단순하게 유지하는 것을 알아야합니다.피연산자.AlternatePhoneNumber는 내 C # 모델의 문자열입니다.

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
. 그러나

그러나 해당 코드가 아직 오류가 발생합니다.

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
.

나는 오류가 무엇인지 알고 있지만 그 이유는 무엇입니까 ??dbnull에서 사용할 수 없습니까?null 및 dbnull은 본질적으로 동일하지 않습니까?

고맙습니다.

도움이 되었습니까?

해결책

?? 연산자는 실제 nulls에만 적용됩니다.

nullDBNull.Value가 동일하지 않습니다.DBNull.Value는 단순히 자리 표시 자 개체입니다.

또한 AlternatePhoneNumber 운영자가 실행되기 전에 ?? 속성 내부에서 예외가 발생했습니다.(코드에 캐스팅이 없음)

customer가 입력 된 데이터 집합의 행이면 디자이너의 열의 NullValue 속성을 변경하십시오.

다른 팁

null 및 dbnull은 동일하지 않습니다.system.dbnull은 실제 객체입니다.

문제점은 generacodicicetagcode가 문자열입니다.dbnull이 아닙니다.

이 대신 시도해보십시오 :

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""
.

수행 :

public T IfNull<T>(object o, T value)
{
   return (o == DbNull.Value) ? value : (T)o;       
}
.

dbnull은 단일 값의 유형이며, null 문자열 참조와 동일하지 않으므로 ??를 사용할 수 없습니다.그러나 당신은 이것을 할 수 있습니다 :

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;
.

다른 답글 상태로, null는 객체를 참조하는 참조를 의미하고, DBNull는 필드 또는 값이 데이터베이스에서 null 인 경우 을 을 에 표시하는 클래스입니다.DATATABLE).

조건부 (삼원) 연산자를 사용할 수 있습니다.(? :) 원하는 것을하기 위해 :

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;
.

i 확장 방법 에서 랩핑하는 경향이 있습니다.

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}
.

코드를 쉽게 읽고 이해할 수 있습니다.

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );
.

dbnull은 실제 "null"가 아닙니다.

"??"- 운영자는 "null"동작을 에뮬레이트하는 객체가 아닌 널 참조 만 감지합니다.

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