比较 T 和 Int64 或 Double。

14 浏览
0 Comments

比较 T 和 Int64 或 Double。

我有一个具有以下签名的方法:\n

private static void CheckValue(ref Double result, Int64 value, String condition, T checkValue) where T : class{};

\ncheckValue可以是Double或Int64。然而,它会给出以下错误:\n

运算符“> =”无法应用于类型“long”和“T”

\n因为我想要一个通用函数,不想定义两个函数(一个具有Int64 checkValue和一个具有Double checkValue签名的函数),所以我使用了T。\n我使用了where T:class,这样可以限制T为类并且可以使用运算符。(在以下主题中找到了这个解决方法):\n如何解决运算符“!=”无法应用于类型“T”和“T”\n我可以想象,如果我只限制T为Int64或Double,那么这个方法可以工作。然而,如果我在签名中更改以下内容:\n

where T : class, Int64, Double

\n它会给出相同的错误。\n@编辑-06-08-2015 11:16\n我的错误,如果我运行先前的代码,它会给出关于where子句中的Int64和Double的错误。(这不是有效的约束条件)

0
0 Comments

Compare T to Int64 or Double 问题的出现原因是需要比较一个泛型类型 T 和 Int64 或 Double 类型的值。根据给出的代码,可以看出,开发者希望实现一个通用的方法来比较不同类型的值。

解决方法是通过使用泛型来实现 CheckValue 方法。方法的签名如下:

private static void CheckValue<T>(ref Double result, int value, String condition, T checkValue) where T : struct
{
    if (value.Equals(checkValue))
        result=1; // 在这里可以进行任何想要的操作
    else
        result=0;
}

这个方法接受一个泛型类型 T,并使用该类型来比较 value 和 checkValue。方法中的泛型约束 where T : struct 确保了 T 类型必须是一个值类型。

通过这个方法,开发者可以方便地比较不同类型的值,并根据比较结果进行相应的操作。

0
0 Comments

这篇文章讨论了一个关于在泛型函数中比较T类型和Int64或Double类型的问题,并提供了解决方法。

问题的出现是因为在定义泛型函数时,约束条件where T : class要求T必须是引用类型,而Double和Int64都不是引用类型。因此,需要对约束条件进行修改。

解决方法是将约束条件修改为where T : struct,这样就可以接受值类型作为T的参数。同时,由于Double和Int64都实现了IComparable接口,可以依赖于这一事实来进行比较。

具体的解决方法是修改函数定义为private static void CheckValue<T>(ref Double result, Int64 value, String condition, T checkValue) where T : struct, IComparable。然后,在函数内部进行类型判断,根据checkValue的类型进行相应的比较操作。

然而,文章指出,尽管这种解决方法可以工作,但建议还是使用分开的方法来处理不同类型的参数。这样做的好处是更快的执行速度(无需运行时类型检查和更快的比较调用)和更安全的类型检查(无法出现运行时类型检查失败的情况)。文章还提到,许多框架方法在不同的基本类型上有重载,即使是在泛型被引入到.NET之后,也是出于这些原因。

最后,文章还提到了使用ref的问题。建议尽量避免使用ref,特别是在没有返回其他值的情况下。作者建议接受Double result作为参数,并返回一个double类型的值,在调用方法的地方进行值的替换,而不是在这个方法内部进行。

0