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;
}
任何人都可以告诉我动态而不是。 取消装箱该怎么用?。这样,它可以取消装箱任何原始数据类型。而且,我不应在代码中的任何地方使用等于关键字。我可以使用比较技术,但是它不起作用
答案 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
子句,但是...在这里似乎没有必要或无用。