2016-07-21 3 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, Двойной ... Когда я прохожу только максимальное значение мне нужно минимальный, чтобы быть пустыми, но когда я делаю, что я получаю следующее ошибка:

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

причина, почему я не хочу использовать значение по умолчанию (T), потому что мне нужно проверить позже, если минимум определяется и по умолчанию (T) является допустимым значением для Minimum.

ответ

4

Пока T не NULLABLE что вы не можете установить значение 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

класс вы создаете обнуляемым по своей природе, типа вас прохода может и не быть. Вы можете либо ограничить тип, который вы передаете, как T (doc), либо изменить свое задание для поддержки обоих сценариев.

1

Проблема явно описывается ошибка компилятора, но вы не можете использовать Nullable<T>, потому что это совершенно непригодным для использования здесь (что если T тип ссылки, или Nullable<U>?) К счастью, вы можете попробовать альтернативу, которая Functional.Maybe , Он работает как для типов значений, так и для ссылочных типов.

0

Вы можете сделать флаги вместо того, чтобы использовать магическое значение, чтобы вы знаете, если минимум был установлен или не то, что установлено или не

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; 
    } 
} 

Тогда в конструкторе просто не установить минимальное свойство

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

int10 и double не являются нулевыми типами, поэтому они должны иметь назначенное им значение, и именно поэтому вы получаете эту ошибку. Хотя, вы можете использовать T? или Nullable<T> как работа вокруг:

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

Вы также можете использовать вложенную Nullable<T>.GetValueOrDefault, которые могут быть также полезны в случае, если у вас есть значение по умолчанию для Min или Max.