【发布时间】:2015-07-11 10:44:37
【问题描述】:
我有一些 int 常量分组在几个 Enum 中,例如:
enum myEnum{
OBJECT_A = 10, OBJECT_B = 13 };
现在我有几个函数可以使用这个枚举并做一些事情,比如:
void myfunc(myEnum e)
{ .... }
在我的代码中,我需要以这两种方式使用 myfunc:
myfunc(myEnum.OBJECT_A);
myfunc(13);
这会产生错误,因为 int 不会隐式转换为 Enum。
您推荐什么作为最佳做法来保持代码的可读性?
一个明显的解决方案是使用 myfunc((myEnum)13);但这很无聊,因为每次都需要转换 int 并且代码很繁重。
到目前为止,我所做的是(完全避免枚举):
using EChannelInt = System.Int32;
public static class EChannel
{
public static readonly int CH_CONNECTION = 10;
public static readonly int CH_DATA = 50;
}
public void doit(EChannelInt ch)
{ .... }
doit(EChannel.CH_DATA);
doit(10);
这行得通,但我不太喜欢它,因为它看起来像是一个“技巧”或重命名 thigs。你有什么建议?也许“隐式运算符”可能有用?
【问题讨论】:
-
规范中的澄清:
int通常不能隐式转换为枚举类型,数字文字0除外。 -
"在我的代码中,我需要" -- 不,你不需要:很明显可以禁止
myfunc(13)而不会丢失任何功能:调用者可以写myfunc((myEnum)13)反而。你想要。那是另一回事。你为什么想要?也许理解你的推理可以让你找到更好的方法。 -
在代码周围传递
13会降低可读性并使代码更容易出错。尽早将 13 转换为myEnum.OBJECT_B,并在其余代码中使用myEnum.OBJECT_B。创建大量重载函数或允许将 int 隐式转换为枚举将创建不易阅读且难以维护的代码。