C#中的null文字类型

时间:2012-01-17 09:03:53

标签: 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();
    }
}

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

3 个答案:

答案 0 :(得分:30)

有关空文字类型的问题请在此处解答:What is the type of null literal?

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

至于调用string重载的原因:

  1. 您不能将intchar参数传递为null,因为它们是值类型,因此这两个重载都已超出。 (如果你让他们成为可以int?char?类型的人,他们可能是候选人,但我不会进入那个。)

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

      

    7.5.3.5更好的转换目标

         

    鉴于两种不同类型T1T2T1是一个比T2更好的转换目标,如果至少满足下列条件之一:

         
        
    • 存在从T1T2的隐式转换,并且不存在从T2T1的隐式转换

    •   
    • ...

    •   
  3. 因此,选择string重载是最合适的。

答案 1 :(得分:4)

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

假设您有一个Vehicle课程。您再创建三个课程Two-WheelerThree-WheelerFour-Wheeler

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

因此,给定一个值,比如说汽车,更适合这个值的是Four-Wheeler

null的情况类似。它可以适合Object OR String;但更具体的匹配是String

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

  1. 查找ShowText方法。
  2. 哦,我找到了4个方法,哪一个叫?!!
  3. 让我们看看传递了什么参数,嗯..它是null
  4. 查找具有引用类型作为参数的ShowText方法。所有带有原始参数的重载都将被忽略。
  5. 哦不...我可以将它与stringobject匹配。
  6. 哪个更具体。即从下面继承层次结构中的第一个。
  7. Hurray ..发现它..它是string ..让我们来称呼它。
  8. 并且,对于练习,如果你想要解决如果编译器在步骤6找到并且比一个匹配将会发生什么...定义一个ShowText(string [] vals)并看到你自己。

答案 2 :(得分:1)

这是C#中重载解析的一个示例,它不能证明null的类型是字符串。

null是包含在任何引用类型的域中的特殊值,它基本上确定没有有效引用。因此,它可以是stringint?object等等。

您甚至可以将null投射到任何引用类型,以获得“正确”键入的null,例如如果它在?运算符

中用作值,则必须转换为null
int? value = (i > 0) ? i : null; // does not compile
int? value = (i > 0) ? i : (int?)null; //works