我有一个带有以下签名的方法;
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:class,这样它将T限制为类并且可以使用运算符。 (在以下主题中找到了这个): How to solve Operator '!=' cannot be applied to operands of type 'T' and 'T'
我可以想象,如果我可以将T限制为仅Int64或Double,则此方法有效。但是,如果我在签名中更改以下内容:
where T : class, Int64, Double
它给出了同样的错误。
@Edit - 06-08-2015 11:16 我的坏,如果我运行先前它在where子句中给出了关于Int64和Double的错误。 (这不是一个有效的约束)
答案 0 :(得分:1)
checkValue可以是Double或Int64
不,它不能。您已where T : class
作为约束来坚持T
是引用类型,因此T
可能既不是这些内容。你实际上要坚持相反的事情:
private static void CheckValue<T>(ref Double result, Int64 value, String condition, T checkValue) where T : struct
{
}
运营商&#39;&gt; =&#39;不适用于长期类型的歌剧院。和&#39; <&#39;
嗯,它不能。您需要具有>=
可以使用的特定类型。
您可以依赖long
和double
实现IComparable
的事实。我不知道您在实施中实际想做什么,但以下工作:
private static void CheckValue<T>(ref Double result, Int64 value, String condition, T checkValue) where T : struct, IComparable
{
if(checkValue is long)
result = checkValue.CompareTo(value) >= 0 ? 1.0 : -1.0;
else if(checkValue is double)
result = checkValue.CompareTo((double)value) >= 0 ? 1.0 : -1.0;
else
throw new InvalidOperationException();
}
因为我想要一个泛型函数,并且不想定义两个函数(一个使用Int64 checkValue,另一个使用Double checkValue签名),我想出了T.
虽然上述方法有效,但我建议您在此处使用单独的方法。结果将更快(没有运行时检查类型,更快的比较调用)和更多类型安全(运行时检查类型失败的可能性)。值得注意的是,由于这些原因,许多框架方法在不同的基本类型上都有重载,即使是在添加到.NET的泛型之后首次引入框架的方法中也是如此。
(我还注意到,通常最好避免使用ref
,尤其是因为您没有返回任何其他值来强制您使用ref
。您能否接受{ {1}}并返回Double result
,替换调用所发生的值,而不是在此方法中?)
答案 1 :(得分:0)
没有必要使用泛型来实现它,因为您要将double或int与Integer值进行比较。但如果你使用泛型实现一些, 然后就像这样签名。
private static void CheckValue<T>(ref Double result, int value, String condition, T checkValue) where T : struct
{
if (value.Equals(checkValue))
result=1; // do anything you want here
else
result=0;
}