【问题标题】:Type of null literal in C#C#中空文字的类型
【发布时间】:2012-01-17 09:03:53
【问题描述】:

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

【问题讨论】:

    标签: c# null


    【解决方案1】:

    您关于 null 文字类型的问题在这里得到解答:What is the type of null literal?

    但在讨论重载解决方案时,这并不重要。实际的 null 值本身将自动转换为最终的任何类型。

    至于为什么调用string重载:

    1. 您不能将 null 作为 int 和 char 参数传递,因为它们是值类型,因此这两个重载已失效。 (如果您将它们设为可空的 int? 和 char? 类型,它们可能会成为候选对象,但我不会深入讨论。)

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

      7.5.3.5 更好的转化目标

      鉴于T1 和T2 两种不同的类型,如果满足以下至少一项,T1 是比T2 更好的转化目标:

      • 存在从T1 到T2 的隐式转换,不存在从T2 到T1 的隐式转换

      • ...

    因此,string 重载被选为最合适的。

    【讨论】:

    • 你能告诉我任何地区为什么它更具体。我无法理解。是不是说明null的类型是string?
    • @krshekhar:不,它有任何类型。强制对象执行:(object)null
    • 从链接的答案中,null type 上的 C# 3.0 已从规范中删除,因此 null 基本上没有类型。
    • 它更具体,因为排除了除object 和string 选项之外的所有选项,编译器然后指出,只要它可以将某些内容传递给采用string 的表单,它就可以将其传递给采用object 的表单,但不是相反(考虑该值是否为非空字符串,以及您希望它如何成为使用的表单,即使另一个是可能的)。如果您有另一种采用另一种引用类型的方法,那么编译器将无法在它们之间进行选择。
    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      您甚至可以将null 转换为任何引用类型,以获得“正确”类型的null,例如如果在 ? 运算符中用作值,则必须强制转换 null

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

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 2012-01-02
        • 2021-05-25
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        相关资源
        最近更新 更多