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

本文关键字:变量 Int16 Int64 Int32 两个 比较 类型 | 更新日期: 2023-09-27 17:49:51

我需要比较两个变量,看看它们是否相同。这些变量被强制转换为"object",可以被赋值为任何。net类型。

我遇到的问题是,如果它们都是数字。在它们具有相同值(例如它们都是-1)但具有不同类型(例如一个是Int32,另一个是Int64)的情况下,则对象。=返回false。

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

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

假设类型是框整型,因此您不能简单地==它们,您可能需要使用Convert。ToInt64将所有值转换为长值,然后使用==对它们进行比较。如果你想支持UInt64s,你需要额外的逻辑。

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

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

另一个选项(有点粗糙)是对两个字符串都调用ToString()并比较字符串。只有当它们都是整型(即没有doubledecimal)时才会起作用,因此您需要事先检查类型。

我可以使用系统了。为值类型解决此问题的不可转换接口:

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