У меня проблема. Это мой код:C# отражение если: 0 равно 1?
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.DeclareLocal(typeof(int));
Label inequality = g.DefineLabel();
Label equality = g.DefineLabel();
Label end = g.DefineLabel();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Stloc_0);
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(int)}));
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Ldc_I4_1);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S, equality);
g.Emit(OpCodes.Brfalse_S, inequality);
g.MarkLabel(inequality);
g.Emit(OpCodes.Ldstr, "Specified strings are different.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)}));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(equality);
g.Emit(OpCodes.Ldstr, "Specified strings are same.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(end);
g.Emit(OpCodes.Ret);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Это мой результат:
1
Specified strings are different.
Но почему выход неправильно? Команда Ceq сравнивает 1 как результат op_Equation и 0, который находится в верхней части стека. И 1 не равно 0. Так почему это так? Где ошибка? Пожалуйста, помогите мне.
Это ваш третий вопрос по этой теме в последний час. Вы тратите достаточно времени на решение этих проблем самостоятельно? –
У меня нет книг для этого. Я знаю, что это кажется глупым, потому что я использую один и тот же код три раза, но мне нужно знать ответ, и я не знаю, как его решить. Вы можете закрыть его, если хотите, но это нормальный вопрос. Я также могу удалить его и поместить здесь завтра ... – user35443
В нем говорится, что они разные; не то, что вы хотите? – Ryan