我只是想知道下两个语句之间有什么区别:
导致NullReferenceException - 没关系.
object test1 = default(int?);
object result = test1.ToString();
Run Code Online (Sandbox Code Playgroud)返回一个空字符串"",为什么?
object test2 = default(int?).ToString();
Run Code Online (Sandbox Code Playgroud)这与2相同.
int? test3 = null;
if (test3.ToString() == string.Empty) //returns true
{
Console.WriteLine("int? = String.Empty, isn't it strange?").
}
Run Code Online (Sandbox Code Playgroud)而且只是为了好玩 - 我可以证明bool可以等于int值(嗯,怎么样?bool只能是false,或者是true,而int永远不会那样).
if (default(int?).ToString() == default(bool?).ToString()) //returns true because both are empty strings
{
Console.WriteLine("int = bool");
}
Run Code Online (Sandbox Code Playgroud)注意: default(int?)返回null.
Ser*_*rvy 29
安int?是一个Nullable<int>. Nullable是一个结构,它使它成为值类型,而不是引用类型. test3实际上并未设置为null.分配null给它实际上会导致创建一个新结构,只需HasValue将该结构的字段设置为false而不是true.(需要特殊的编译器支持才能进行这种隐式转换;因此您无法拥有自己的MyNullable<T>类型来执行此操作.)
由于可空对象具有实际值,因此它可以调用ToString并提供有意义的值,在本例中为空字符串.
当您通过将该值置于object变量中来装入该可空值时,将导致实际 null值存储在该变量中,这就是为什么在调用其上的方法时获得NRE的原因.
当一个可以为空的值类型被装箱时,它不会包含可空值类型; 相反,如果它没有值,它会分配null给对象,如果它有一个值,那么该基础值将被解包然后装箱.(此行为需要来自运行时的特殊支持,这是您无法创建自己的MyNullable<T>类型的另一个原因.)
| 归档时间: |
|
| 查看次数: |
2950 次 |
| 最近记录: |