想象一下这样的代码:
var str = (String)null;
Run Code Online (Sandbox Code Playgroud)
它有什么不同于:
String str;
Run Code Online (Sandbox Code Playgroud)
要么:
String str = null;
Run Code Online (Sandbox Code Playgroud)
第一个代码是否会导致空值的装箱,还是在编译时将其解析为字符串?
String 是一个参考类型,所以不,没有拳击.
var str = (String)null;
String str = null;
Run Code Online (Sandbox Code Playgroud)
这两个是等价的.在第一行中,编译器str从表达式的右侧推断出类型.在第二行中,来自nullto string的强制转换是隐含的.
String str;
Run Code Online (Sandbox Code Playgroud)
最后一个等同于String str = null if它是一个字段声明,这意味着str将分配其默认值,即null.但是,如果str是局部变量,则必须先明确赋值,然后才能使用它.
让我们把你的问题拿出来挑选它.
您问题中的代码会导致拳击吗?
不,它不会.
这不是因为3个语句中的任何一个都以不同的方式运行(虽然存在差异,但更多如下),但拳击不是使用字符串时发生的概念.
当您获取值类型并将其包装到对象中时,就会发生拳击.A string是引用类型,因此永远不会涉及到拳击.
所以拳击出局了,剩下的就是这三个陈述相等吗?
这两个也会这样做:
var str = (String)null;
String str = null;
Run Code Online (Sandbox Code Playgroud)
第三个(虽然你的问题顺序中的第二个)是不同的,因为它只声明str标识符是类型String,它没有专门初始化它null.
但是,如果这是一个类的字段声明,这将是相同的,因为在构造对象时所有字段都被初始化为默认值/零,因此它实际上将被初始化为null无论如何.
另一方面,如果这是一个局部变量,那么现在有一个未初始化的变量.从你写的这个事实来看var ...,这在字段方面是非法的,这可能对你的问题更正确.