왜 내가 '??'을 사용할 수 없습니까?System.Dbnull 값을위한 피연산자?
문제
NULL이되는 열을 가져 오는 Oracle 데이터 테이블이 있습니다.그래서 나는 코드를 멋지고 단순하게 유지하는 것을 알아야합니다.피연산자.AlternatePhoneNumber는 내 C # 모델의 문자열입니다.
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
.
그러나 그러나 해당 코드가 아직 오류가 발생합니다.
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
.
나는 오류가 무엇인지 알고 있지만 그 이유는 무엇입니까 ??dbnull에서 사용할 수 없습니까?null 및 dbnull은 본질적으로 동일하지 않습니까?
고맙습니다.
해결책
??
연산자는 실제 null
s에만 적용됩니다.
null
및 DBNull.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"동작을 에뮬레이트하는 객체가 아닌 널 참조 만 감지합니다.