2013-10-27 4 views
6
나는 다음과 같은 오류 얻을

:연산자 '??' 'System.DateTime'형식의 피연산자에 적용 할 수 없습니다

Operator '??' cannot be applied to operands of type 'System.DateTime' 

foreach (EndServReward r in reward) 
          { 
           if (con.State == ConnectionState.Closed) 
           { 
            con.Open(); 
           } 
           myIfxCmd.Parameters[0].Value = r.EmpNum ; 
           myIfxCmd.Parameters[1].Value = (r.ServDate) ?? DBNull.Value; 
          } 

reward is List<EndServReward> reward, 이런 이유와 해결 방법을 할 수 있습니까?

답변

11

??은 널 통합 연산자입니다.
null 수없는 값에 적용하는 것은 의미가 없습니다.

+0

'r.ServDate'가 'null'일 수없는 이유는 무엇입니까? !!그 빈 속성이 있는지 또는 값 (채우기) 값이 아닌지 확인하고 싶습니다 –

+2

@just_name 이것이 왜 null이 될 수 없습니다 : http://msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx –

+0

그런 다음 그 속성을 설정하지 않고 db에 삽입하면 오류가 발생합니까? –

6

기본적으로 nullcoalescing 연산자는 DateTime처럼 본질적으로 nullable이 아닌 유형에는 적용 할 수 없습니다. 어쨌든 사용하고 싶다면 DateTime을 사용할 수있는 유형으로 예견해야합니다. DateTime? dt;

3

귀하의 r.ServDate 속성은 null로 필요 : 기본적으로

public DateTime? ServDate { get; set; } 

날짜 시간은 널 (NULL)

2

날짜 시간이 치 형입니다하지 않습니다. 값 유형은 nullable이 아니며 항상 값을 전달합니다.

이 정수에 대해 동일 두 배, 등 값이 null의 경우, 그래서 필요하지 않은 경우 당신이 수표를 사용하는

운영자.

그러나 Min과 같은 기본 값과 비교하여 값을 확인하는 것이 좋습니다. 실제로이 변수의 기본값이 무엇인지 고려해야합니다 (허용되는 경우).

다시 생각해 보면 int입니다. null에 대해서는 체크하지 않지만, 0이나 네거티브에 대해서는 체크 할 수 있습니다.

private bool IsDefault<T>(T value) 
{ 
    if (value == null) 
     return false; 
    return value.Equals(default(T)); 
} 

다음이에 코드를 변경 :

myIfxCmd.Parameters[1].Value = IsDefault<DateTime>(r.ServDate) ? (object)DBNull.Value : (object)r.ServDate; 
3

당신은 다른 답변에 제안 Null 허용하는 유형을 변경하거나 코드에 다음과 같이 헬퍼 메소드를 추가 할 수 있습니다 다른 답변에서 올바르게 지적했듯이 Null-Coalescing 연산자를 -DateTime 값 유형에 사용할 수 없습니다.

myIfxCmd.Parameters[1].ValueNull을 할당하기 전에 시도해보십시오. 첫 번째 질문은 ServDate 속성의 기본값을 EndServReward 클래스로 설정 한 것입니다. null 또는 DateTime.Min으로 변환하는 것은 개체 자체를 만들 때 ServData의 기본값을 더 잘 설정하는 것이 좋습니다. 이렇게하면 한 곳에서 기능을 결정하고 일관된 솔루션을 제공하는 데 도움이됩니다.

데이터베이스를 업데이트 할 시점이 아닌 DateTime.Min 또는 Null으로 설정할 수 있습니다.

관련 문제