当值相同但类型不同时比较两个变量(例如Int16,Int32,Int64)

时间:2011-04-10 02:10:34

标签: c# .net

我需要比较两个变量,以确定它们是否相同。这些变量被转换为“对象”,可以分配任何.NET类型。

我遇到的问题是它们是否都是数字。在它们具有相同值(例如它们都是-1)但具有不同类型(例如,一个是Int32,另一个是Int64)的情况下,然后object.Equals返回false。

是否有一种比较通用的方法来比较忽略变量类型的值,只看数字值?

4 个答案:

答案 0 :(得分:2)

假设类型为盒装整数,因此您不能简单地==它们,您可能希望使用Convert.ToInt64将所有值转换为long,然后使用==进行比较。如果你想支持UInt64,你需要额外的逻辑。

答案 1 :(得分:1)

只需使用==<等常用运算符,Int16将自动转换为Int32,因为没有信息丢失。 Int *是值类型,因此值会自动进行比较。

答案 2 :(得分:0)

假设您有一个带有两个object参数的方法,您可以创建一个带有两个long参数的重载。我相信(虽然我还没有验证)传递2个整数会选择带有long的重载,而不是对象。

另一个有点hackish的选择是在两者上调用ToString()并比较字符串。这只有在它们都是整数类型(即没有doubledecimal)时才有效,因此您需要事先检查类型。

答案 3 :(得分:0)

我能够使用System.IConvertible接口来解决值类型的问题:

object expectedValue = (int) 42;
object testValue = (long) 42;

// This handles equal values stored as different types, such as int vs. long.
if (testValue is IConvertible testValueConvertible
    && expectedValue is IConvertible)
{
    testValue = testValueConvertible
        .ToType(expectedValue.GetType(),
                System.Globalization.CultureInfo.InvariantCulture);
}

if (object.Equals(testValue, expectedValue))
    Console.WriteLine("Values are equal");
else
    Console.WriteLine("Values are NOT equal");

我创建了这个.NET Fiddle作为演示:https://dotnetfiddle.net/GSUjIS