【问题标题】:Compare T to Int64 or Double将 T 与 Int64 或 Double 进行比较
【发布时间】: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 的错误。 (这不是一个有效的约束)

【问题讨论】:

  • 您如何比较 Foolong 的课程?编译器怎么知道怎么做呢?
  • 写两个方法,一个是long,一个是double。这里不需要泛型
  • 我认为这是 C# 中泛型的一个已知限制。
  • 如果你有一个只适用于两种输入类型的函数,那么它就不是通用的。
  • 你解决不了。泛型的目的是接受 any 类型。是的,有限制,但这些也是有限的。编译器无法验证是否可以将给定值与任何内容进行比较。

标签: c# generics operators


【解决方案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
{
}

运算符“>=”不能应用于“long”和“T”类型的操作数

好吧,它不能。你需要有一个特定的类型,&gt;= 可以与它​​一起使用。

您可以依赖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。您能否改为接受Double result并返回double , 替换发生在调用的地方而不是这个方法内部的值?)

【讨论】:

    【解决方案2】:

    当您将 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;
            }
    

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多