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

4

2 回答 2

1

未赋值赋值为 null是局部变量的两种不同状态。局部变量必须先用一些东西初始化,甚至是 null,然后才能访问它们。默认情况下,它们根本不初始化,与类字段不同。

为了比较,这段代码没有给出编译错误:

MediaDescription media = null;
...    
    case FieldType.Information:
        if(media == null)    <-- Use of local unassigned variable
            message.Description = field.Value;
于 2013-07-25T15:20:26.000 回答
1

我认为您误解了编译器的信息:抱怨不是您可能正在访问media对象的属性,而是您正在访问变量本身,它根本不包含对任何对象的引用 - 甚至没有null引用。

在 C# 中,局部变量不是默认初始化的——在首次使用之前,您必须在初始化期间或之后显式分配它们;即使将它们与它们进行比较null也是不允许的。

于 2013-07-25T15:21:09.510 回答