通用可以为Nullable吗?

时间:2016-07-21 16:50:37

标签: c#

我有以下课程:

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,Double,...当我只传递最大值时,我需要将Minimum变为null但是当我这样做时,我得到以下错误:

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

我不想使用默认值(T)的原因是因为我需要稍后检查是否定义了最小值并且默认值(T)是最小值的有效值。

5 个答案:

答案 0 :(得分:4)

只要/address/c\ text 不可为空,您就无法将值设置为T,您可以做的就是这样......

null

答案 1 :(得分:1)

问题由编译器错误清楚地描述,但您无法使用Nullable<T>,因为它在此处完全无法使用(如果T是引用类型,或Nullable<U>会怎么样?)幸运的是,您可以尝试替代方案Functional.Maybe。它适用于值类型和引用类型。

答案 2 :(得分:0)

您正在创建的类本质上是可空的,您传递的类型可能不是。您可以将传递的类型限制为T(location.getTime()),也可以更改分配以支持两种方案。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

intdouble不是可空类型,因此必须为其分配值,这就是您收到该错误的原因。但是,您可以使用T?Nullable<T>作为解决方法:

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

如果你有Min或​​Max的默认值,你也可以使用嵌套的Nullable<T>.GetValueOrDefault,这在你的情况下也很有用。