У меня есть кусок кода, который выводит разные результаты, в зависимости от компилятора C # и времени выполнения.
Код, о котором идет речь:
using System;
public class Program {
public static void Main() {
Console.WriteLine(string.Compare("alo\0alo\0", "alo\0alo\0\0", false, System.Globalization.CultureInfo.InvariantCulture));
}
}
Результаты следующие:
Compiling with mono (gmcs) Compiling with .Net (csc)
Running with mono -1 -1
Running with .Net -1 0
Как выводить различные значения при работе с .Net framework?
(Кстати, согласно http://msdn.microsoft.com/en-us/library/system.string.aspx вывод должен быть 0, поэтому ответ мононеверно, но это не связано с моим вопросом.)
Даже сгенерированный код IL (почти) одинаков.
Компиляция с помощью .Net:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 29 (0x1d)
.maxstack 8
IL_0000: nop
IL_0001: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 ) // a.l.o...a.l.o...
IL_0006: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 // a.l.o...a.l.o...
00 00 )
IL_000b: ldc.i4.0
IL_000c: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture()
IL_0011: call int32 [mscorlib]System.String::Compare(string,
string,
bool,
class [mscorlib]System.Globalization.CultureInfo)
IL_0016: call void [mscorlib]System.Console::WriteLine(int32)
IL_001b: nop
IL_001c: ret
} // end of method Program::Main
Компиляция с помощьюmono:
.method public hidebysig static void Main() cil managed
{
.entrypoint
// Code size 27 (0x1b)
.maxstack 8
IL_0000: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 ) // a.l.o...a.l.o...
IL_0005: ldstr bytearray (61 00 6C 00 6F 00 00 00 61 00 6C 00 6F 00 00 00 // a.l.o...a.l.o...
00 00 )
IL_000a: ldc.i4.0
IL_000b: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_InvariantCulture()
IL_0010: call int32 [mscorlib]System.String::Compare(string,
string,
bool,
class [mscorlib]System.Globalization.CultureInfo)
IL_0015: call void [mscorlib]System.Console::WriteLine(int32)
IL_001a: ret
} // end of method Program::Main
Единственное отличие - две дополнительные инструкции NOP в версии .Net.
Как это возможно?Чем могут отличаться два выходных значения?
Кроме того, если у кого-нибудь установлены и .Net, и моно, вы можете воспроизвести его?
РЕДАКТИРОВАТЬ: Мне все равно каков правильный результат, и Мне все равно , что моно и .Net дают разные результаты.Я, вероятно, никогда не столкнусь со встроенными нулями и сортирую их, и порядок сортировки будет важен.
Моя проблема в том, что один и тот же runtime (.Net 2.0) дает разные результаты, когда скомпилировано различными компиляторами.
РЕДАКТИРОВАТЬ 2: Я добавил таблицу и попытался прояснить вопрос, теперь это должно быть легче понять.