Bol*_*ock 361
它是枚举的任何成员代表值0
.具体来说,从文档:
an的默认值
enum E
是表达式生成的值(E)0
.
例如,请使用以下枚举:
enum E
{
Foo, Bar, Baz, Quux
}
Run Code Online (Sandbox Code Playgroud)
在不覆盖默认值的情况下,打印default(E)
返回,Foo
因为它是第一个出现的元素.
但是,并不总是0
枚举由第一个成员表示的情况.例如,如果您这样做:
enum F
{
// Give each element a custom value
Foo = 1, Bar = 2, Baz = 3, Quux = 0
}
Run Code Online (Sandbox Code Playgroud)
打印default(F)
会给你Quux
,而不是Foo
.
如果枚举中没有元素G
对应于0
:
enum G
{
Foo = 1, Bar = 2, Baz = 3, Quux = 4
}
Run Code Online (Sandbox Code Playgroud)
default(G)
字面上返回0
,虽然它的类型保持为G
(如上面的文档所引用的,给定枚举类型的强制转换).
Pie*_*rez 11
你可以使用这个片段:-D
using System;
using System.Reflection;
public static class EnumUtils
{
public static T GetDefaultValue<T>()
where T : struct, Enum
{
return (T)GetDefaultValue(typeof(T));
}
public static object GetDefaultValue(Type enumType)
{
var attribute = enumType.GetCustomAttribute<DefaultValueAttribute>(inherit: false);
if (attribute != null)
return attribute.Value;
var innerType = enumType.GetEnumUnderlyingType();
var zero = Activator.CreateInstance(innerType);
if (enumType.IsEnumDefined(zero))
return zero;
var values = enumType.GetEnumValues();
return values.GetValue(0);
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
using System;
public enum Enum1
{
Foo,
Bar,
Baz,
Quux
}
public enum Enum2
{
Foo = 1,
Bar = 2,
Baz = 3,
Quux = 0
}
public enum Enum3
{
Foo = 1,
Bar = 2,
Baz = 3,
Quux = 4
}
[DefaultValue(Enum4.Bar)]
public enum Enum4
{
Foo = 1,
Bar = 2,
Baz = 3,
Quux = 4
}
public static class Program
{
public static void Main()
{
var defaultValue1 = EnumUtils.GetDefaultValue<Enum1>();
Console.WriteLine(defaultValue1); // Foo
var defaultValue2 = EnumUtils.GetDefaultValue<Enum2>();
Console.WriteLine(defaultValue2); // Quux
var defaultValue3 = EnumUtils.GetDefaultValue<Enum3>();
Console.WriteLine(defaultValue3); // Foo
var defaultValue4 = EnumUtils.GetDefaultValue<Enum4>();
Console.WriteLine(defaultValue4); // Bar
}
}
Run Code Online (Sandbox Code Playgroud)
use*_*431 10
我认为依赖枚举中值的顺序并假设第一个始终是默认值是非常危险的.如果您担心保护默认值,这将是一个很好的做法.
enum E
{
Foo = 0, Bar, Baz, Quux
}
Run Code Online (Sandbox Code Playgroud)
否则,所需要的只是一个粗略的订单重构,你有一个完全不同的默认值.
归档时间: |
|
查看次数: |
125420 次 |
最近记录: |