我有一个关于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调用重载的原因:
你不能传递null作为int和char参数,因为它们是值类型,所以这两个重载都出来了.(他们本可以成为候选人,如果你让它们成为可空int?和char?类型,但我不会进入那个.)
在引用类型的两个其他重载之间,string是一种比它更具体的类型object.也就是说,它源自(因此可以隐式转换为)object.此外,从C#语言规范的以下部分(强调我的):
7.5.3.5更好的转换目标
给出了两种不同类型
T1和T2,T1是更好的转换目标比T2如果以下中的至少一个成立:
从隐式转换
T1到T2存在,从没有隐式转换T2到T1存在...
因此,string选择过载作为最佳拟合.
null可以适合任何参考类型。因此这是多态性的一个很好的例子。
假设你有Vehicle课。您再创建三个类Two-Wheeler, Three-Wheeler, Four-Wheeler。
如果是后3类extends Vehicle类;它被称为Vehicle指定为这三个类别。
因此,给定一个值(例如汽车),更具体地适合该值的是Four-Wheeler。
类似的情况也是如此null。它可以适合ObjectOR String;但更具体的匹配是String.
ShowText(null)让我们看看编译器在看到对方法的调用时如何思考(仅特定于您的代码)
ShowText方法。null。ShowText以引用类型作为参数的方法。所有带有原始参数的重载都将被忽略。stringOR匹配object。string..让我们称呼它吧。并且,如果您想了解如果编译器在第 6 步发现多个匹配项会发生什么,请进行练习...定义一个 ShowText(string[] vals) 并自行查看。