C#中的null文字类型

शेख*_*ेखर 17 c# null

我有一个关于null类型的查询.
我有一个小程序,任何人都可以告诉我这个.

public class TestApplication
{
    public void ShowText(object  ob)
    {
        Console.Write("Inside object");
    }
    public void ShowText(string str)
    {
        Console.Write("Inside string");
    }
    public void ShowText(int i)
    {
        Console.Write("Inside int.");
    }
    public void ShowText(char c)
    {
        Console.Write("Inside Character");
    }
    static void Main(string[] args)
    {
        new TestApplication().ShowText(null);            
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么它调用字符串函数.
是否意味着null的类型是字符串.
它看起来可能看起来很愚蠢,但我无法找到它为什么调用字符串函数的区域.

Bol*_*ock 30

关于null文字类型的问题在这里得到解答:null文字的类型是什么?

但在谈论重载解析时,这并不重要.实际的空值本身将自动转换为它最终的任何类型.

至于string调用重载的原因:

  1. 你不能传递null作为intchar参数,因为它们是值类型,所以这两个重载都出来了.(他们本可以成为候选人,如果你让它们成为可空int?char?类型,但我不会进入那个.)

  2. 在引用类型的两个其他重载之间,string是一种比它更具体的类型object.也就是说,它源自(因此可以隐式转换为)object.此外,从C#语言规范的以下部分(强调我的):

    7.5.3.5更好的转换目标

    给出了两种不同类型T1T2,T1是更好的转换目标比T2如果以下中的至少一个成立:

    • 从隐式转换T1T2存在,从没有隐式转换T2T1存在

    • ...

因此,string选择过载作为最佳拟合.

  • 从链接的答案中,从"null type"的C#3.0中删除了规范,因此null基本上没有类型. (2认同)
  • 它更具体,因为排除了除``object`和`string`选项以外的所有选项,然后编译器会注意到只要它可以将某些内容传递给带有`string`的表单,它就可以将它传递给带有`object`的表单,但不是相反(想想这个值是否为非空字符串,以及你希望它是如何使用的形式,即使另一个是可能的).如果您使用另一种引用另一种引用类型的方法,则编译器将无法在它们之间进行选择. (2认同)

Azo*_*ous 6

null可以适合任何参考类型。因此这是多态性的一个很好的例子。

假设你有Vehicle课。您再创建三个类Two-Wheeler, Three-Wheeler, Four-Wheeler

如果是后3类extends Vehicle类;它被称为Vehicle指定为这三个类别。

因此,给定一个值(例如汽车),更具体地适合该值的是Four-Wheeler

类似的情况也是如此null。它可以适合ObjectOR String;但更具体的匹配是String.

ShowText(null)让我们看看编译器在看到对方法的调用时如何思考(仅特定于您的代码)

  1. 寻找ShowText方法。
  2. 哦,我找到了4个方法,该调用哪一个?!!
  3. 让我们看看传递了什么参数,嗯..是null
  4. 查找ShowText以引用类型作为参数的方法。所有带有原始参数的重载都将被忽略。
  5. 哦不...我可以将它与stringOR匹配object
  6. 哪个更具体。即从下面的继承层次结构中排在第一位的。
  7. 万岁..找到了..它是string..让我们称呼它吧。

并且,如果您想了解如果编译器在第 6 步发现多个匹配项会发生什么,请进行练习...定义一个 ShowText(string[] vals) 并自行查看。