2012-01-17 38 views
18

我有一个关于null类型的查询。
我有一个小程序,任何人都可以告诉我这个。C中的空字面的类型#

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的类型是字符串。
这看起来可能是一个愚蠢的结论,但我无法找到该区域为什么要调用字符串的函数。

回答

31

您对null文本类型的问题是在这里找到答案:What is the type of null literal?

但是,在谈论重载决议时,其实并不重要。实际的空值本身会自动转换为最终的类型。

至于为什么string超载被称为:

  1. 你不能传递null作为intchar参数,它们是值类型,所以这两个重载都出来了。 (他们本来是应聘人员,你让他们可为空int?char?类型,但我不会去成。)

  2. 服用引用类型的其他两个重载之间,string是一个更具体的类型比object。也就是说,它来源于(因此可以隐式转换为)object。另外,从C#语言规范以下部分(重点煤矿):

    7.5.3.5更好的转换目标

    给出了两种不同类型T1T2T1T2更好的转换目标如果下列中的至少一个成立:

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

    • ...

因此,过载string被选择作为最合适的。

+0

你可以给我的任何地区,为什么它更具体。我无法理解。这是否意味着null的类型是字符串? – 2012-01-17 09:08:12

+0

@krshekhar:不,它有任何类型。强制对象做:'(object)null' – leppie 2012-01-17 09:10:01

+2

从链接的答案来看,从null类型的C#3.0被从规范中删除,所以null基本上没有类型。 – SWeko 2012-01-17 09:20:08

1

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

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

您甚至可以将null投射到任何参考类型,以获得“正确”键入null,例如,如果它作为一个值在?操作

int? value = (i > 0) ? i : null; // does not compile 
int? value = (i > 0) ? i : (int?)null; //works 
4

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

可以说你有一个Vehicle类。您可以创建另外三个类别Two-WheelerThree-WheelerFour-Wheeler

if后3类extendsVehicle class;它被称为Vehicle被指定为这三个类别。

所以,给定一个值,比如汽车,更具体地适合这个值是Four-Wheeler

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

让我们来看看编译器如何认为(具体到你的代码只),当它看到一个调用ShowText(null)方法

  1. 查找ShowText方法。
  2. 哦,我找到了4种方法,哪一种叫?!!
  3. 让我们看看通过了什么参数,嗯..它是null
  4. 查找ShowText以引用类型为参数的方法。所有带原始参数的重载都会被忽略。
  5. 哦不......我可以匹配它012it或object
  6. 哪个更具体。即从下面的继承层次结构开始。
  7. 华友..发现它..它的string ..让我们打电话吧。

而且,因为如果你想要的是已了解如果编译器发现在步骤6铁道部以上的比赛会发生什么......定义ShowText(字符串[]瓦尔斯),并看到自己的练习。