使用局部未赋值变量 - 即使使用 else-语句
本文关键字:else- 语句 变量 用局 赋值 | 更新日期: 2023-09-27 18:25:06
MediaDescription media;
foreach(var field in fields) {
switch(field.Key) {
case FieldType.Version:
message.Version = Convert.ToInt32(field.Value);
break;
case FieldType.Originator:
message.Originator = OriginatorField.Parse(field.Value);
break;
...
...
case FieldType.Information:
if(media == null) <-- Use of local unassigned variable
message.Description = field.Value;
else media.Description = field.Value;
break;
...
我的意思是,为什么?编译器应该足够聪明,以便我预先检查声明,并且只有在 else-语句中才能访问声明。怎么了?
未赋值和被赋值为 null 是局部变量的两种不同状态。局部变量必须用某些东西(甚至是 null(初始化,然后才能访问它们。默认情况下,它们根本不初始化,这与类字段不同。
为了进行比较,此代码不会给出编译错误:
MediaDescription media = null;
...
case FieldType.Information:
if(media == null) <-- Use of local unassigned variable
message.Description = field.Value;
我想你误解了编译器的信息:抱怨不是你可能正在访问media
对象的属性,而是你正在访问变量本身,它根本不包含对任何对象的引用 - 甚至没有null
引用。
在 C# 中,局部变量不是默认初始化的 - 必须在首次使用之前初始化期间或之后显式分配它们;甚至不允许将它们与 null
进行比较。