1

这条规则是否应该适用于 C#?

如果我们尝试使用枚举而不显式设置值,编译器会给出错误“使用未分配的局部变量”?

被问到的观点是 FxCop 规则的有效性,因为我不能使用枚举的默认值。

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        TraceLevel traceLevelOptions;
        Console.WriteLine(traceLevelOptions.ToString());
        Console.ReadLine();
    }
}

得到正确答案后更新。以下代码应该可以工作:

public class SerializeMe
{
    public int Id { get; set; }
    public TraceLevel MyTrace { get; set; }
}

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        SerializeMe serializeMe = new SerializeMe();
        Console.WriteLine(serializeMe.MyTrace.ToString());
        Console.ReadLine();
    }
}
4

2 回答 2

5

与枚举相关的代码分析错误的文档中解释了枚举应该具有零值的原因:

http://msdn.microsoft.com/en-us/library/ms182149.aspx

CA1008: 枚举值应该为零

与其他值类型一样,未初始化枚举的默认值为零。一个非标志属性的枚举应该定义一个具有零值的成员,以便默认值是枚举的有效值。

所以原因是,例如,如果您在类或结构中声明一个枚举字段并且不初始化它,它将具有默认值零。如果枚举中没有零值的成员,那么在这种(相当常见的)情况下,您将有一个包含无效值的枚举字段。

在其他情况下,您最终可以使用默认初始化的枚举字段(例如在反序列化期间)。您希望避免默认初始化的枚举字段具有无效值,因此该规则。

于 2013-09-16T10:10:43.083 回答
2

这不是 FXCop 错误,而是 C# 编译器错误。在 C# 中,所有局部变量必须在使用前进行初始化。

TraceLevel traceLevelOptions = 0; // or TraceLevel.Error for example

就像所有其他类型一样......如果traceLevelOptionsint,你会得到同样的错误。

类型存在漏洞struct。您可以为它们分配一个值或为它们的所有字段分配一个值,它们将被视为已分配。struct请注意,如果具有例如private字段,则有时无法满足此条件。

于 2013-09-16T10:06:44.410 回答