将T与Int64或Double进行比较

时间:2015-08-06 09:14:23

标签: c# generics operators

我有一个带有以下签名的方法;

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的错误。 (这不是一个有效的约束)

2 个答案:

答案 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;

嗯,它不能。您需要具有>=可以使用的特定类型。

您可以依赖longdouble实现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 Invalid‎OperationException();
}
  

因为我想要一个泛型函数,并且不想定义两个函数(一个使用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;
        }