值类型的静态Equals方法返回False

时间:2018-11-01 08:22:57

标签: c#

 public static bool EqualsMethod(**ValueType** value1, **ValueType** value2)
        {
            bool result = false;
            Type t1 = value1.GetType();
            Type t2 = value2.GetType();
            var i = (**dynamic**)value1;
            var j = (**dynamic**)value2;
        }

任何人都可以告诉我动态而不是取消装箱该怎么用?。这样,它可以取消装箱任何原始数据类型。而且,我不应在代码中的任何地方使用等于关键字。我可以使用比较技术,但是它不起作用

4 个答案:

答案 0 :(得分:2)

原始类型的相等性(相对于CLR,例如int)是使用CIL指令实现的。值类型的默认相等性完成by reflection(这就是结构类型应提供其自身相等性的原因)。

System.ValueType是一种引用类型,以便使其用作其他类型的基本类型。因此,将传递给ValueType参数的任何结构都装箱,并在它们上调用==运算符进行参考比较。

如果要传递结构而不进行装箱,则可以使用泛型和where T : struct约束。

答案 1 :(得分:0)

基于@ jan.h的答案,我建议使用:

public static bool EqualsMethod<T>(T value1, T value2) where T: struct
{
    return value1.Equals(value2);
}

作为起点。通过限制为值类型(T: struct),这应该可以满足您的要求。

答案 2 :(得分:0)

您可以直接使用对象类中的 ToString()方法,而不必取消装箱并将其存储在另一个变量中。 例如:value1.ToString()&& value2.ToString()

答案 3 :(得分:0)

EqualityComparer<T>已经为您覆盖:

public static bool EqualsMethod<T>(T value1, T value2)
    => EqualityComparer<T>.Default.Equals(value1, value2);

通过使用泛型,此方法适用于任何T-在值类型为T的情况下,无需装箱或拆箱即可使用。 .Default的实现很聪明,并且具有以下单独的实现:

  • 引用类型
  • 裸值类型
  • Nullable<T>值类型

每个实现都做“正确的事情”。它还利用受支持的IEquatable<T>接口,作为后备选项降为.Equals(object)

所以:它应该在所有相关情况下都做正确的事。对于您自己的值类型:请务必实现IEquatable<T>

如果要将其限制为 just 值类型,请添加一个where T : struct子句,但是...在这里似乎没有必要或无用。