原始类型上可为空的模板类

时间:2019-11-17 23:11:39

标签: c#

我想实现以下目标:

int? a = 1;
int? b = 2;
int? smallerInt = NullableOps<int>.Min(a, b);

float? c = 1;
float? d = 2;
float? smallerFloat = NullableOps<float>.Min(a, b);

当前NullableOps是:

public class NullableOps<T>
{
    public static Nullable<T> Min(Nullable<T> a, Nullable<T> b)
    {
        // do some stuff
        var x = a.Value < b.Value ? a : b; // error here: '<' can't be applied to operand T and T
    }
}

但是有类似T must not be a nullable type的错误。 因此,我必须使用函数重载为不同类型复制相同的代码:

public class NullableOps
{
    public static int? Min(int? a, int? b)
    {
        // do stuff
    }

    public static float? Min(float? a, float? b)
    {
        // do stuff
    }
}

但是我不想这样做,因为每次添加新类型时,我都需要再次复制代码。谁能帮忙吗?

1 个答案:

答案 0 :(得分:4)

您需要添加以下约束。

public class NullableOps<T> where T : struct

该错误说明编译器无法保证参数类型T不会为空。

使用Nullable<T>时,类型参数T必须是不可为空的值类型,例如int,float。 (不能为int?)。您可以使用T是值类型(结构)的约束来强制执行此操作

更新:基于编辑

基于OP中的更新,您需要添加IComparable<T>约束并使用CompareTo代替“ <”。例如,

public class NullableOps<T> where T : struct,IComparable<T>
{
    public static Nullable<T> Min(Nullable<T> a, Nullable<T> b)
    {
         return a.Value.CompareTo(b.Value) < 0 ? a : b; 
    }
}