使用本地未分配的变量 - 甚至使用else语句

时间:2013-07-25 15:14:07

标签: c# .net compiler-construction declaration

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语句中才能访问声明。怎么了?

2 个答案:

答案 0 :(得分:1)

未分配分配null 是局部变量的两种不同状态。在访问局部变量之前,必须使用某些东西初始化局部变量,甚至是null。默认情况下,与类字段不同,它们根本没有初始化。

为了进行比较,此代码不会出现编译错误:

MediaDescription media = null;
...    
    case FieldType.Information:
        if(media == null)    <-- Use of local unassigned variable
            message.Description = field.Value;

答案 1 :(得分:1)

我认为您误解了编译器的消息:投诉不是您可能正在访问media对象的属性,而是您正在访问变量本身,该变量根本没有对任何对象的引用 - 甚至没有null参考。

在C#中,局部变量不是默认初始化的 - 你必须在初次使用之前或之后显式地分配它们;甚至不允许将它们与null进行比较。