我想实现以下目标:
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
}
}
但是我不想这样做,因为每次添加新类型时,我都需要再次复制代码。谁能帮忙吗?
答案 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;
}
}