zoukankan      html  css  js  c++  java
  • 一个奇怪的问题,关于重载!

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

    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)方法的************


    总结:最好的解决办法就是增加一个没有参数的重载,这样,一切就都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");
     }
  • 相关阅读:
    特殊字符,如Emoji表情Base64存储到数据库
    判断文本文件的编码
    很多.net 程序员不知道又非常重要的 .net高级调试技巧.调试别人的dll方法内的变量
    没想到你是这样的Linux
    PDF转成txt
    生成云图
    Data collection (imaging)
    Python Conda 软件包升级
    电镜作业2的脚本版本
    电镜作业2
  • 原文地址:https://www.cnblogs.com/xiao_p/p/1285041.html
Copyright © 2011-2022 走看看