// 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报异常? 感觉没什么区别啊? 望高手赐教!
第三个默认选中的是Format(string format, params object[] args);这个重载,代码里{0}要求object数组至少有一个元素,但这里为null。
null不能算一个参数吗?我试了一下
string.Format("Value = '{0}'")
和
string.Format("Value = '{0}'", null)
异常信息还不太一样
@wulawulaho: 你又理解错了,参数类型是params object[] args啊。用下面的代码试一下你就理解了:
Console.WriteLine(string.Format("Value = '{0}'", new object[] { null }));
@JeffWong: 感谢回复。
为什么string.Format("Value = '{0}'", null)不使用Format(string format, object arg0)的重载,却使用了params的重载方法?null算object吗?null是不是可以代表一个空object也可以代表一个空new object[]?
@wulawulaho: 这个和c#编译器类型推断有关系。null什么都是又什么都不是,它可以是object对象数组、也可以是object对象,这里c#编译器类型推断默认优先认为null是object对象数组。
@JeffWong: 我在查查资料,非常感谢你的回复
string.Format 方法重载很多,应该调用不同的方法,方法实现不同。
我使用“转到定义”定位了一下重载方法,确实如你说的,1,2定位到了下面
public static string Format(string format, object arg0);
而3定位到了下面
public static string Format(string format, params object[] args)
主要是有带params参数的重载,我想问一下这个重载方法分配的机制是什么?为什么直接写null不使用object的重载,却使用了params的重载方法?
因为要调用参数的ToString方法吧,你传null值的话,肯定会报我们常见的空引用错误吧