C# 对于值类型,static Equals方法返回False
谁能告诉我而不是动态的。如何使用解除装箱?。因此,它可以取消装箱任何基本数据类型。我不应该在代码中的任何地方使用Equals关键字。我可以使用比较器技术,但它不起作用基本类型(CLR本机,如C# 对于值类型,static Equals方法返回False,c#,C#,谁能告诉我而不是动态的。如何使用解除装箱?。因此,它可以取消装箱任何基本数据类型。我不应该在代码中的任何地方使用Equals关键字。我可以使用比较器技术,但它不起作用基本类型(CLR本机,如int)的相等性是通过CIL指令实现的。值类型的默认相等已完成(这就是为什么结构类型应该提供自己的相等) System.ValueType是一种引用类型,以便作为其他类型的基类型。因此,传递给ValueType参数的任何结构都会被装箱,并且对它们调用=操作符会进行引用比较,正如您所注意到的那样 如果希望在不装
int
)的相等性是通过CIL指令实现的。值类型的默认相等已完成(这就是为什么结构类型应该提供自己的相等)
System.ValueType
是一种引用类型,以便作为其他类型的基类型。因此,传递给ValueType
参数的任何结构都会被装箱,并且对它们调用=
操作符会进行引用比较,正如您所注意到的那样
如果希望在不装箱的情况下传入结构,可以使用泛型和
where T:struct
约束。基本类型的相等(CLR本机,如int
)由CIL指令实现。值类型的默认相等已完成(这就是为什么结构类型应该提供自己的相等)
System.ValueType
是一种引用类型,以便作为其他类型的基类型。因此,传递给ValueType
参数的任何结构都会被装箱,并且对它们调用=
操作符会进行引用比较,正如您所注意到的那样
如果您想在不装箱的情况下传入结构,可以使用泛型和
where T:struct
约束。基于@jan.h的答案,我建议使用:
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;
}
publicstaticboolequalmethod(T值1,T值2),其中T:struct
{
返回值1.等于(值2);
}
作为一个起点。通过限制为值类型(
T:struct
),这应该满足您的要求。基于@jan.h的答案,我建议使用:
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;
}
publicstaticboolequalmethod(T值1,T值2),其中T:struct
{
返回值1.等于(值2);
}
作为一个起点。通过约束到值类型(T:struct
),这应该可以满足您的要求。您可以直接从对象类中使用ToString()方法,而不是将其取消装箱并存储在另一个变量中。
例如:value1.ToString()&&value2.ToString()您可以直接从对象类使用ToString()方法,而不是将其拆开并存储在另一个变量中。
例如:value1.ToString()和&value2.ToString()EqualityComparer
已经介绍了以下内容:
public static bool EqualsMethod<T>(T value1, T value2) where T: struct
{
return value1.Equals(value2);
}
公共静态布尔均衡方法(T值1,T值2)
=>EqualityComparer.Default.Equals(值1,值2);
通过使用泛型,这适用于任何T
——在值类型T
的情况下,它将在不装箱或取消装箱的情况下工作。这里的.Default
的实现很聪明,并且有以下几个方面的单独实现:
- 参考类型
- 裸值类型
值类型Nullable
IEquatable
接口,将其下拉到.Equals(object)
作为回退
因此:在所有相关情况下,它都应该做正确的事情。对于您自己的值类型:确保实现IEquatable
如果要将其限制为仅值类型,请添加一个where T:struct
子句,但是。。。这在这里似乎没有必要或没有用处。EqualityComparer
已经介绍过:
public static bool EqualsMethod<T>(T value1, T value2) where T: struct
{
return value1.Equals(value2);
}
公共静态布尔均衡方法(T值1,T值2)
=>EqualityComparer.Default.Equals(值1,值2);
通过使用泛型,这适用于任何T
——在值类型T
的情况下,它将在不装箱或取消装箱的情况下工作。这里的.Default
的实现很聪明,并且有以下几个方面的单独实现:
- 参考类型
- 裸值类型
值类型Nullable
IEquatable
接口,将其下拉到.Equals(object)
作为回退
因此:在所有相关情况下,它都应该做正确的事情。对于您自己的值类型:确保实现IEquatable
如果要将其限制为仅值类型,请添加一个
where T:struct
子句,但是。。。这在这里似乎没有必要或没有用处。您能提供一个解决方案吗?如中所示,此操作失败的值类型是:int i=12和int j=12。当我将它们传递给equals方法时。。由于两个值相等。。它应该是真的。但是返回的是False。@jon您可能想修改示例,因为您在示例中的控制台.WriteLine
旁边放了“//True”。另外,您的示例Main()
方法为我输出true
。。。但我在代码中使用了动态关键字。。。因此,我想使用另一个关键字或任何其他过程,而不是使用动态Help@johnUseComparer.Default.Compare(value1,value2)==0
进行比较,而不是整个方法。我知道这并不完全适用于所有情况,但对于内置值类型,它应该是相同的?如中所示,此操作失败的值类型是:int i=12和int j=12。当我将它们传递给equals方法时。。由于两个值相等。。它应该是真的。但是返回的是False。@jon您可能想修改示例,因为您在示例中的控制台.WriteLine
旁边放了“//True”。另外,您的示例Main()
方法为我输出true
。。。但我在代码中使用了动态关键字。。。因此,我想使用另一个关键字或任何其他过程,而不是使用动态Help@johnUseCom