예외 설명에 역설이 있습니다. Nullable 객체에는 값 (?!)이 있어야합니다.
이게 문제 야:
나는이 DateTimeExtended
그 있으며, 클래스를
{
DateTime? MyDataTime;
int? otherdata;
}
그리고 생성자
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
이 코드를 실행
DateTimeExtended res = new DateTimeExtended(oldDTE);
발생 InvalidOperationException
메시지와 함께 :
널 입력 가능 오브젝트에는 값이 있어야합니다.
myNewDT.MyDateTime.Value
-유효하며 일반 DateTime
객체를 포함 합니다.
이 메시지의 의미는 무엇이며 내가 뭘 잘못하고 있습니까?
참고 oldDTE
하지 않습니다 null
. Value
에서를 제거 myNewDT.MyDateTime
했지만 생성 된 setter로 인해 동일한 예외가 발생합니다.
답변
줄 this.MyDateTime = myNewDT.MyDateTime.Value;
을 그냥 변경해야합니다this.MyDateTime = myNewDT.MyDateTime;
당신이 수신 있었던 예외에 던져진 .Value
의 특성 Null 허용 DateTime
반환해야 한, DateTime
(대한 그 이후 어떤 계약 .Value
상태),하지만 거기에 있기 때문에 그렇게 할 수 없어 DateTime
반환에 예외를 throw 있도록.
일반적으로 .Value
변수 에 값이 있어야 한다는 사전 지식이없는 한 (예 : .HasValue
검사를 통해 ) 맹목적으로 nullable 형식을 호출하는 것은 좋지 않습니다 .
편집하다
DateTimeExtended
예외를 발생시키지 않는 코드는 다음과 같습니다 .
class DateTimeExtended
{
public DateTime? MyDateTime;
public int? otherdata;
public DateTimeExtended() { }
public DateTimeExtended(DateTimeExtended other)
{
this.MyDateTime = other.MyDateTime;
this.otherdata = other.otherdata;
}
}
나는 이것을 다음과 같이 테스트했다.
DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);
.Value
on을 추가하면 other.MyDateTime
예외가 발생합니다. 제거하면 예외가 제거됩니다. 당신이 잘못된 곳을보고 있다고 생각합니다.
답변
(예를 들어 LINQ 확장 방법을 사용하는 경우 Select
, Where
), 람다 함수는 당신의 C # 코드에 동일하게 작동하지 않을 수 있습니다 그 SQL로 변환 할 수 있습니다. 예를 들어, C #의 단락 회로 평가 &&
와는 ||
SQL의 열망로 변환 AND
하고 OR
. 람다에서 null을 확인할 때 문제가 발생할 수 있습니다.
예:
MyEnum? type = null;
Entities.Table.Where(a => type == null ||
a.type == (int)type).ToArray(); // Exception: Nullable object must have a value
답변
떨어 뜨리십시오 .value
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}
답변
이 경우 oldDTE는 null이므로 oldDTE.Value에 액세스하려고하면 값이 없으므로 InvalidOperationException이 발생합니다. 귀하의 예에서 간단하게 할 수 있습니다 :
this.MyDateTime = newDT.MyDateTime;
답변
.Value
파트 없이 멤버를 직접 지정하십시오 .
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}
답변
oldDTE.MyDateTime이 null 인 것처럼 보이므로 생성자가 값을 가져 오려고했습니다.
답변
null 값을 가진 개체의 값에 액세스하려고 할 때이 메시지가 나타납니다.
sName = myObj.Name;
오류가 발생합니다. 먼저 객체가 null이 아닌지 확인해야합니다
if(myObj != null)
sName = myObj.Name;
작동합니다.