nullable int에 값을 할당하기 위해 다른 방법을 사용하여 이것에 대한 연구를했습니다. 여러 가지 일을했을 때 일어난 일입니다. 무슨 일이 일어나고 있는지 분명히해야합니다. 명심하십시오 : Nullable<something>
또는 속기 something?
는 컴파일러가 마치 마치 클래스 인 것처럼 null로 사용할 수 있도록 많은 작업을 수행하는 것처럼 보입니다.
아래 볼 수로서, SomeNullable == null
그리고 SomeNullable.HasValue
항상이 참 또는 거짓 예상 반환합니다. 아래에 설명되어 있지는 않지만 SomeNullable == 3
유효합니다 (SomeNullable이이라고 가정 int?
).
하지만 SomeNullable.Value
우리에게 런타임 오류를 가져옵니다 우리는 할당 된 경우 null
에 SomeNullable
. 오버로드 된 연산자의 조합으로 인해 nullables가 문제를 일으킬 수있는 유일한 경우입니다.object.Equals(obj)
방법, 컴파일러 최적화 및 원숭이 사업.
다음은 내가 실행 한 코드와 레이블에서 생성 된 출력에 대한 설명입니다.
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
좋아, 다음 초기화 방법을 시도해보십시오.
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
이전과 동일합니다. int? val = new int?(null);
nullable 객체의 VALUE은 (는) nullable이 아니므로 생성자로 null이 전달 된 상태에서을 (를) 초기화 하면 COMPILE 시간 오류가 발생합니다. 널 (null)과 같은 것은 랩퍼 오브젝트 자체입니다.
마찬가지로 다음과 같이 컴파일 시간 오류가 발생합니다.
int? val = new int?();
val.Value = null;
그것이 val.Value
읽기 전용 속성 이라는 것은 말할 것도없고 , 다음과 같은 것을 사용할 수도 없습니다 :
val.Value = 3;
다시 말하지만, 다형성 오버로드 된 암시 적 변환 연산자는 다음과 같이합니다.
val = 3;
polysomthing whatchamacallits가 제대로 작동하는 한 걱정할 필요가 없습니까? :)