今天在 写一个 重载的 时候发现了 一个很奇怪的问题, 先看这样的一段程序!
{
test(null);
}
static void test(object obj)
{
Console.WriteLine("obj");
}
static void test(object[] obj)
{
Console.WriteLine("obj array");
}
程序 输出是 “obj array”。
可是,为什么test(null); 会自动调用
{
Console.WriteLine("obj array");
}
这个方法呢?
试着用 il 打开,也没有发现有什么区别,il 代码如下
{
.entrypoint
// Code size 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldnull
IL_0002: call void ConsoleApplication1.Program::test(object[])
IL_0007: nop
IL_0008: ret
} // end of method Program::Main
************这个是main方法的************
.method private hidebysig static void test(object[] obj) cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "obj array"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::test
************这个是test(object[] obj)方法的************
.method private hidebysig static void test(object obj) cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "obj"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::test
************这个是test(object obj)方法的************
总结:最好的解决办法就是增加一个没有参数的重载,这样,一切就都ok了!(感谢 曲滨*銘龘鶽)
{
test();
}
static void test()
{
Console.WriteLine("null");
}
static void test(object obj)
{
Console.WriteLine("obj");
}
static void test(object[] obj)
{
Console.WriteLine("obj array");
}