【发布时间】:2015-10-29 08:33:29
【问题描述】:
我有一个带有以下签名的方法;
private static void CheckValue<T>(ref Double result, Int64 value, String condition, T checkValue) where T : class{};
checkValue 可以是 Double 或 Int64。但是它给出了以下错误;
Operator '>=' cannot be applied to operatands of type 'long' and 'T'
因为我想要一个通用函数并且不想定义两个函数(一个带有 Int64 checkValue 和一个带有 Double checkValue 签名),所以我想出了 T。
我使用了 where T : 类,这样它将 T 限制为类并且可以使用运算符。 (在以下主题中找到此内容): How to solve Operator '!=' cannot be applied to operands of type 'T' and 'T'
如果我可以将 T 限制为仅 Int64 或 Double,我可以想象这会起作用。但是,如果我在签名中更改以下内容:
where T : class, Int64, Double
同样的错误。
@编辑 - 06-08-2015 11:16 我的错,如果我运行先验,它会在 where 子句中给出关于 Int64 和 Double 的错误。 (这不是一个有效的约束)
【问题讨论】:
-
您如何比较
Foo和long的课程?编译器怎么知道怎么做呢? -
写两个方法,一个是long,一个是double。这里不需要泛型
-
我认为这是 C# 中泛型的一个已知限制。
-
如果你有一个只适用于两种输入类型的函数,那么它就不是通用的。
-
你解决不了。泛型的目的是接受 any 类型。是的,有限制,但这些也是有限的。编译器无法验证是否可以将给定值与任何内容进行比较。