2016-07-21 4 views
-1

나는 다음과 같은 클래스가 : 난 단지 최대 값을 전달하는 경우일반은 Nullable이 될 수 있습니까?

public class RangeFilter<T> : IFilter<T> where T : IConvertible, IComparable { 

    public T Maximum { get; private set; } 
    public T Minimum { get; private set; } 

    public RangeFilter(T maximum) { 
    Minimum = null; 
    Maximum = maximum; 
    } 

} 

T는 INT, 더블 될 수 ... 나는 널 (null)로 최소 필요하지만 난 얻을 수행 할 때 다음과 같은 오류 :

Cannot convert null to type parameter 'T' because it could be a non-nullable value type. 
Consider using 'default(T)' instead.  

의 I이 기본값을 사용하지 않으려는 이유 (T) 나는 최소 정의 및 기본 (T)는 최소의 유효한 값 경우 나중에 확인해야하기 때문이다.

답변

4

만큼 T이 유형을 만들고있는 클래스는 본질적으로 널 (NULL)입니다 ... 당신이 할 수있는 것은이 같은 것입니다 null에 값을 설정할 수 없습니다 당신을

public class RangeFilter<T> : IFilter<T> 
    where T : struct, IConvertible, IComparable 
{ 

    public T? Maximum { get; private set; } 
    public T? Minimum { get; private set; } 

    public RangeFilter(T maximum) 
    { 
     Minimum = null; 
     Maximum = maximum; 
    } 

} 
+0

내 답변을 삭제 한 후 여기로 향하고 있습니다. 사용법에서 'T'가 숫자로 표시된다고 가정하면이 문제와 상관없이'struct' 제약 조건이 적절하다고 생각합니다. – spender

0

당신을 Null을 허용하지 않습니다로 패스가 아닐 수도 있습니다. 전달하는 유형을 T (doc)로 제한하거나 두 시나리오를 모두 지원하도록 과제를 변경할 수 있습니다.

1

문제는 명확하게 컴파일러 오류에 의해 설명되어 있지만, 여기에 완전히 사용할 수 없게 때문에 당신이 (T 경우 참조 유형 또는 Nullable<U> 무엇인지?) 다행히, 당신은 Functional.Maybe 인 대안을 시도 할 수 Nullable<T>을 사용할 수 없습니다 . 값 유형과 참조 유형 모두에서 작동합니다.

대신 마법의 값을 사용하여 플래그는

public HasMinimum {get; private set;} 

private T _min; 
public T Minimum 
{ 
    get 
    { 
     if(!HasMinimum) 
      throw new InvalidOperationException("Minimum not set"); 
     return _min; 
    } 
    private set 
    { 
     HasMinimum = true; 
     _min = value; 
    } 
} 

를 최소 설정 또는 무언가가 설정되지 않았거나없는 경우 생성자에 단지 최소한의 속성을 설정하지 않는 알려 만들 수

0

public RangeFilter(T maximum) 
{ 
     Maximum = maximum; 
} 
0

intdouble은 Null 허용 유형이 아니므로 값이 할당되어 있어야하며 그 이유는 그 이유입니다. 당신이 주위에 작품으로 T? 또는 Nullable<T>을 사용할 수 있지만 :

int? t = null; // t is nullable, so it works 

당신은 또한 당신의 최소 또는 최대에 대한 기본 값이있는 경우, 귀하의 경우에도 유용 할 수 있습니다 중첩 Nullable<T>.GetValueOrDefault를 사용할 수 있습니다.

관련 문제