[英]As per CA1008 rule of FXCop Enums should have a default value of zero. Is this applicable for C#?
此規則是否適用於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();
}
}
枚舉應為零的原因在與之相關的代碼分析錯誤的文檔中進行了解釋:
http://msdn.microsoft.com/en-us/library/ms182149.aspx
CA1008:枚舉應為零值
與其他值類型一樣,未初始化的枚舉的默認值為零。 非標記屬性的枚舉應定義一個值為零的成員,以便默認值是枚舉的有效值。
因此,原因是,例如,如果您在類或結構中聲明一個枚舉字段並且不對其進行初始化,則其默認值為零。 如果沒有枚舉的成員具有零值,則在那種情況(相當普遍)下,您將擁有一個包含無效值的枚舉字段。
在其他情況下,您最終可能會使用默認初始化的枚舉字段(例如,反序列化期間)。 您要避免默認初始化的枚舉字段的值無效,因此該規則無效。
這不是FXCop錯誤,而是C#編譯器錯誤。 在C#中,必須先初始化所有局部變量,然后才能使用它們。
TraceLevel traceLevelOptions = 0; // or TraceLevel.Error for example
像其他所有類型一樣...如果traceLevelOptions
是一個int
,則將得到相同的錯誤。
struct
類型存在漏洞。 您可以為它們分配一個值或為它們的所有字段分配一個值,它們將被視為已分配。 請注意,如果struct
具有例如private
字段,則有時無法滿足此條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.