先看一段C#代码:
string name = null;
Session["name"] = name;
string out1 = Convert.ToString(name);
string out2 = Convert.ToString(Session["name"]);
在Microsoft Visual Studio .NET 2003调试,运行结果为: out1 = null out2 = " ";
这个结果,的确是遵守----"值类型做参数的时候,不能返回null,引用类型做参数的时候,可以返回null" 的原则.
但是,看看下面的运行逻辑,就不是那样认为了.
我们看看MS的关于ToString 方法的调用:
public static string ToString(string value)
{
return value;
}
public static string ToString(object value)
{
return Convert.ToString(value, (IFormatProvider) null);
}
public static string ToString(object value, IFormatProvider provider)
{
IConvertible convertible1 = value as IConvertible;
if (convertible1 != null)
{
return convertible1.ToString(provider);
}
if (value != null)
{
return value.ToString();
}
return string.Empty;
}
根据上述代码:
string out1 = Convert.ToString(name);
string out2 = Convert.ToString(Session["name"]);
我们可以理解为:
string out1 = Convert.ToString((object)null);
string out2 = Convert.ToString((string)null);
调用ToString方法,out1的值一直会运行到 return string.Empty, 而这个结果应该是"",所以分析出来,out1=" "
同样,调用ToString方法,out2的值一直会运行到 return value,而这个结果应该是null,所以分析出来,out2=null