今天在 写一个 重载的 时候发现了 一个很奇怪的问题, 先看这样的一段程序!

 

static void Main(string[] args)
{
     test(null);
}

static void test(object obj)
{
     Console.WriteLine("obj");
}

static void test(object[] obj)
{
     Console.WriteLine("obj array");
} Program
    {
        
static void Main(string[] args)
        {
            test(
null);
        }

        
static void test(object obj)
        {
            Console.WriteLine(
"obj");
        }

        
static void test(object[] obj)
        {
            Console.WriteLine(
"obj array");
        }
    }

 

程序 输出是 “obj array”。


可是,为什么test(null); 会自动调用 

 static void test(object[] obj)
 {
      Console.WriteLine("obj array");
 }

 

这个方法呢?

 

试着用 il 打开,也没有发现有什么区别,il 代码如下

.method private hidebysig static void  Main(string[] args) cil managed
{
  .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)方法的************

 


[] 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

 

总结:最好的解决办法就是增加一个没有参数的重载,这样,一切就都ok了!(感谢 曲滨*銘龘鶽

 static void Main(string[] args)
 {
      test();
 }

 
static void test()
 {
     Console.WriteLine(
"null");
 }

 
static void test(object obj)
 {
     Console.WriteLine(
"obj");
 }

 
static void test(object[] obj)
 {
      Console.WriteLine(
"obj array");
 }

 

 

相关文章:

  • 2021-11-06
  • 2021-06-04
  • 2022-12-23
  • 2021-06-24
  • 2021-12-04
  • 2021-09-04
猜你喜欢
  • 2021-10-17
  • 2021-05-20
  • 2021-10-17
  • 2022-02-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案