[C#] nullable 객체는 값을 가져야합니다

예외 설명에 역설이 있습니다. 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);

.Valueon을 추가하면 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;

작동합니다.