我有一个关于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的类型是字符串
它可能看起来很愚蠢,但我无法找到它为什么调用字符串函数的区域。
答案 0 :(得分:30)
有关空文字类型的问题请在此处解答:What is the type of null literal?
但在谈论重载解析时,这并不重要。实际的空值本身将自动转换为它最终的任何类型。
至于调用string
重载的原因:
您不能将int
和char
参数传递为null,因为它们是值类型,因此这两个重载都已超出。 (如果你让他们成为可以int?
和char?
类型的人,他们可能是候选人,但我不会进入那个。)
在引用类型的其他两个重载之间,string
是一种比object
更具体的类型。也就是说,它源自(并因此可以隐式转换为)object
。此外,从C#语言规范的以下部分(强调我的):
7.5.3.5更好的转换目标
鉴于两种不同类型
T1
和T2
,T1
是一个比T2
更好的转换目标,如果至少满足下列条件之一:
存在从
T1
到T2
的隐式转换,并且不存在从T2
到T1
的隐式转换...
因此,选择string
重载是最合适的。
答案 1 :(得分:4)
null
可以适合任何引用类型。因此是多态性的一个很好的例子。
假设您有一个Vehicle
课程。您再创建三个课程Two-Wheeler
,Three-Wheeler
,Four-Wheeler
。
如果后三班extends
Vehicle
班级;它被称为Vehicle
被指定为这三个类别。
因此,给定一个值,比如说汽车,更适合这个值的是Four-Wheeler
。
null
的情况类似。它可以适合Object
OR String
;但更具体的匹配是String
。
让我们看看编译器在看到对ShowText(null)
方法的调用时如何思考(仅限于您的代码)
ShowText
方法。null
。ShowText
方法。所有带有原始参数的重载都将被忽略。string
或object
匹配。string
..让我们来称呼它。并且,对于练习,如果你想要解决如果编译器在步骤6找到并且比一个匹配将会发生什么...定义一个ShowText(string [] vals)并看到你自己。
答案 2 :(得分:1)
这是C#中重载解析的一个示例,它不能证明null
的类型是字符串。
null
是包含在任何引用类型的域中的特殊值,它基本上确定没有有效引用。因此,它可以是string
,int?
,object
等等。
您甚至可以将null
投射到任何引用类型,以获得“正确”键入的null
,例如如果它在?
运算符
int? value = (i > 0) ? i : null; // does not compile
int? value = (i > 0) ? i : (int?)null; //works