Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于值类型,static Equals方法返回False_C# - Fatal编程技术网

C# 对于值类型,static Equals方法返回False

C# 对于值类型,static Equals方法返回False,c#,C#,谁能告诉我而不是动态的。如何使用解除装箱?。因此,它可以取消装箱任何基本数据类型。我不应该在代码中的任何地方使用Equals关键字。我可以使用比较器技术,但它不起作用基本类型(CLR本机,如int)的相等性是通过CIL指令实现的。值类型的默认相等已完成(这就是为什么结构类型应该提供自己的相等) System.ValueType是一种引用类型,以便作为其他类型的基类型。因此,传递给ValueType参数的任何结构都会被装箱,并且对它们调用=操作符会进行引用比较,正如您所注意到的那样 如果希望在不装

谁能告诉我而不是动态的。如何使用解除装箱?。因此,它可以取消装箱任何基本数据类型。我不应该在代码中的任何地方使用Equals关键字。我可以使用比较器技术,但它不起作用

基本类型(CLR本机,如
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@johnUse
Comparer.Default.Compare(value1,value2)==0
进行比较,而不是整个方法。我知道这并不完全适用于所有情况,但对于内置值类型,它应该是相同的?如中所示,此操作失败的值类型是:int i=12和int j=12。当我将它们传递给equals方法时。。由于两个值相等。。它应该是真的。但是返回的是False。@jon您可能想修改示例,因为您在示例中的
控制台.WriteLine
旁边放了“//True”。另外,您的示例
Main()
方法为我输出
true
。。。但我在代码中使用了动态关键字。。。因此,我想使用另一个关键字或任何其他过程,而不是使用动态Help@johnUse
Com