Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# 传递到函数(但不是本地)时列表元素出现意外不平等_C#_System.reflection - Fatal编程技术网

C# 传递到函数(但不是本地)时列表元素出现意外不平等

C# 传递到函数(但不是本地)时列表元素出现意外不平等,c#,system.reflection,C#,System.reflection,我试图实现一个比较不同列表元素的函数。我不断得到意想不到的行为,显然OpCodes.Brfalse!=操作码.Brfalse或12!=12 只有当我将项目列表作为参数传递给一个比较它们各自元素的函数时,它才显示出这种行为,而不是当我在本地比较它们时 [TestMethod()] 公共无效findListMatch_测试() { var alist=新列表() { 新的Harmony.CodeInstruction(操作码Brfalse,12), }; var blist=新列表() { 新的Ha

我试图实现一个比较不同列表元素的函数。我不断得到意想不到的行为,显然
OpCodes.Brfalse!=操作码.Brfalse
12!=12

只有当我将项目列表作为参数传递给一个比较它们各自元素的函数时,它才显示出这种行为,而不是当我在本地比较它们时

[TestMethod()]
公共无效findListMatch_测试()
{
var alist=新列表()
{
新的Harmony.CodeInstruction(操作码Brfalse,12),
};
var blist=新列表()
{
新的Harmony.CodeInstruction(操作码Brfalse,12),
};
Assert.AreEqual(alist[0]。操作码,blist[0]。操作码);//传递
Assert.AreEqual(列表[0]。操作数,blist[0]。操作数);//传递
Assert.IsTrue(Foo(alist,blist));//失败
}
bool Foo(列表列表列表,列表列表)
{
var A=0;
var B=blist[0];
if(A.opcode!=B.opcode)
{
return false;//有时点击此按钮,预计不会
}
else if(A.操作数!=B.操作数)
{
return false;//有时点击此按钮,预计不会
}
返回true;
}
Harmony.CodeInstruction
是一个类,具有库中的字段
opcode
{System.Reflection.Emit.opcode}和
操作数
{object}。

操作数字段中的类型为object

所以您的第一次比较使用
Object.Equals
方法检查相等性

// Uses Object.Equals
Assert.AreEqual(alist[0].operand, blist[0].operand); 
您的第二个比较是reference equals,这将是错误的

// Reference comparison will be false because both are boxing value 12 in different memory locations.
A.operand != B.operand
您可以在一个简单的控制台应用程序中轻松测试这一点

object a = 12;
object b = 12;
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a == b); // False

执行
Assert.IsTrue(列表[0]。操作码==blist[0]。操作码)
Assert.IsTrue(列表[0]。操作数==blist[0]。操作数)