首页 新闻 赞助 找找看

C#里NULL的问题

0
悬赏园豆:10 [已解决问题] 解决于 2015-03-20 14:59
// 1
string a = null;
Console.WriteLine(string.Format("Value = '{0}'", a));
// 2
object o = null;
Console.WriteLine(string.Format("Value = '{0}'", o));
// 3
Console.WriteLine(string.Format("Value = '{0}'", null));
Console.Read();

以上代码为什么只有3报异常? 感觉没什么区别啊? 望高手赐教!

wulawulaho的主页 wulawulaho | 初学一级 | 园豆:74
提问于:2015-03-20 13:17
< >
分享
最佳答案
0

第三个默认选中的是Format(string format, params object[] args);这个重载,代码里{0}要求object数组至少有一个元素,但这里为null。

收获园豆:8
JeffWong | 老鸟四级 |园豆:2328 | 2015-03-20 13:58

null不能算一个参数吗?我试了一下

string.Format("Value = '{0}'")

string.Format("Value = '{0}'", null)

异常信息还不太一样

wulawulaho | 园豆:74 (初学一级) | 2015-03-20 14:16

@wulawulaho: 你又理解错了,参数类型是params object[] args啊。用下面的代码试一下你就理解了:

Console.WriteLine(string.Format("Value = '{0}'", new object[] { null }));
JeffWong | 园豆:2328 (老鸟四级) | 2015-03-20 14:25

@JeffWong: 感谢回复。

为什么string.Format("Value = '{0}'", null)不使用Format(string format, object arg0)的重载,却使用了params的重载方法?null算object吗?null是不是可以代表一个空object也可以代表一个空new object[]?

wulawulaho | 园豆:74 (初学一级) | 2015-03-20 14:33

@wulawulaho: 这个和c#编译器类型推断有关系。null什么都是又什么都不是,它可以是object对象数组、也可以是object对象,这里c#编译器类型推断默认优先认为null是object对象数组。

JeffWong | 园豆:2328 (老鸟四级) | 2015-03-20 14:38

@JeffWong: 我在查查资料,非常感谢你的回复

wulawulaho | 园豆:74 (初学一级) | 2015-03-20 14:58
其他回答(2)
0

string.Format 方法重载很多,应该调用不同的方法,方法实现不同。

收获园豆:2
Qlin | 园豆:2403 (老鸟四级) | 2015-03-20 13:31

我使用“转到定义”定位了一下重载方法,确实如你说的,1,2定位到了下面

public static string Format(string format, object arg0);

而3定位到了下面

public static string Format(string format, params object[] args)

主要是有带params参数的重载,我想问一下这个重载方法分配的机制是什么?为什么直接写null不使用object的重载,却使用了params的重载方法?

 

支持(0) 反对(0) wulawulaho | 园豆:74 (初学一级) | 2015-03-20 14:08
0

因为要调用参数的ToString方法吧,你传null值的话,肯定会报我们常见的空引用错误吧

cshere | 园豆:188 (初学一级) | 2015-12-07 18:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册