当调用具有多个对应名称的值ToString()
时,是什么决定了选择哪个名称?enum
问题的详细解释如下。
我已经确定这不是由以下任何一个唯一确定的:字母顺序;申报单;也不是,名称长度。
例如,考虑我想要一个枚举,其中数值直接对应于实际用途(例如颜色的 rgb 值)。
public enum RgbColor
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
现在,使用这个枚举,调用default(RgbColor)
将返回黑色的 rgb 值。假设我不希望默认值是黑色,因为我希望 UI 设计人员能够在他们没有关于使用什么颜色的具体说明时使用对“默认”的调用。目前,UI 设计人员使用的默认值实际上是“蓝色”,但这可能会改变。所以,我在枚举上添加了一个额外的TextDefault
定义,现在它看起来像:
public enum RgbColorWithTextDefaultFirst
{
TextDefault = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
现在,我已经对此进行了测试,我发现调用RgbColorWithTextDefaultFirst.TextDefault.ToString()
并且RgbColorWithTextDefaultFirst.Blue.ToString()
两者都产生“蓝色”。因此,我认为最后声明的名称将覆盖先前声明的名称。为了检验我的假设,我写道:
public enum RgbColorWithTextDefaultLast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
TextDefault = 0x0000ff
}
然而,令我惊讶的是,RgbColorWithTextDefaultLast.Blue.ToString()
和RgbColorWithTextDefaultLast.TextDefault.ToString()
。我的下一个猜测是它按字母顺序对名称进行排序并返回第一个。为了测试这一点,我尝试:
public enum RgbColorWithATextDefaultFirst
{
ATextDefault = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
public enum RgbColorWithATextDefaultLast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
ATextDefault = 0x0000ff
}
现在,对于所有四个RgbColorWithATextDefaultFirst.ATextDefault.ToString()
, RgbColorWithATextDefaultFirst.Blue.ToString()
, RgbColorWithATextDefaultLast.ATextDefault.ToString()
, RgbColorWithATextDefaultLast.Blue.ToString()
,我最终得到“蓝色”。我意识到还有另一个区别因素,那就是字符串的长度。我现在的猜测是,所选名称是由名称字符串的长度决定的。所以,我的测试是使用这些声明:
public enum RgbColorWithALast
{
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff,
A = 0x0000ff
}
public enum RgbColorWithAFirst
{
A = 0x0000ff,
Black = 0x000000,
Red = 0xff0000,
Green = 0x00ff00,
Blue = 0x0000ff,
White = 0xffffff
}
现在,猜猜我得到的所有值是多少RgbColorWithAFirst.A.ToString()
:RgbColorWithAFirst.Blue.ToString()
; RgbColorWithALast.A.ToString()
, RgbColorWithALast.Blue.ToString()
. 没错,就是“蓝”。
在这一点上,我已经放弃试图通过猜测来弄清楚是什么决定了这一点。我打开了反射器,我要看看并试图弄清楚这一点,但我想我会在这里问一个问题,看看这里是否有人已经知道答案,再次是:什么决定了哪个名字是调用具有多个对应名称的值ToString()
时选择?enum