c# - 为什么在使用枚举代替其基础类型时必须使用显式强制转换?

标签 c# types enums casting byte

public enum Foo : byte 
{
    BAR = 0x00,
    BAZ = 0x01,
    DERP = 0xFF
}

public void AppendAsHex(StringBuilder sb, byte b)
{
    sb.AppendFormat("{0:X}", b);
}

为什么这需要显式转换?

Foo theDerp = Foo.DERP;
AppendAsHex(sb, (byte)theDerp); // Fine
AppendAsHex(sb, theDerp); // Compile Error

不会发生精度损失。该方法声明它只需要一个 byte,忽略任何 enum 优点。

编辑

如果我们将 enum 换成 byte 并使函数采用另一种数字类型,这会很好地工作,例如:

public void AppendAsHex(StringBuilder sb, uint u)
{
    sb.AppendFormat("{0:X}", u);
}

byte b = 21;

AppendAsHex(sb, b); // Fine

因此,编译器会毫不费力地将数字类型提升为更大的数字类型,但需要强制转换以将 enum:byte 转换为 byte .

很明显,enum:byte 在技术上不是类型 byte,但编译器肯定可以看到它是 System 类型。 Enum 并检查 enum?

中包含的值的类型

虽然如果使用复杂类型编译器可能无法调整大小是非常合理的,但在这种情况下编译器会完全了解所有内容。我不明白,如果可以提升原语,编译器将如何拒绝提升/强制转换明确声明为原语的内容。

这对我来说似乎不一致,我想更好地理解它。

最佳答案

非常简单,因为 C# 是强类型的。枚举值不是 byte 类型,即使您将它的翻译值设置为 byte,因此您必须先将其转换为 byte,然后才能将其用于期望类型为 byte 的函数。这与转换另一种类型没有什么不同。

此外,如果您的重点是保持整洁,您可以考虑稍微重写(或重载)您的方法,以便转换对它之外的所有内容都是不可见的。它不会改变解决方案,但假设您将在多个地方重用该方法,它的代码会更少:

public void AppendAsHex(StringBuilder sb, Foo b)
{
    AppendAsHex(sb, (byte)b);
}
public void AppendAsHex(StringBuilder sb, byte b)
{
    sb.AppendFormat("{0:X}", b);
}

到那时,这会起作用

Foo theDerp = Foo.DERP;
AppendAsHex(sb, theDerp);

关于c# - 为什么在使用枚举代替其基础类型时必须使用显式强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136026/

相关文章:

c# - 从 C++ 调用 C# dll

c# - 回发不适用于 Safari 中的鼠标单击

c# - 同步等待异步方法在同一线程上完成

c++ - 如何获取 std::numeric_limits<char>::min() 值?

c# - 如何从 Controller 重启 BackgroundService

scala - 为什么 scala 返回一个 Any(Val/Ref) 当函数显然是用错误的类型调用时

python-3.x - 如何将单元格添加到 pd.DataFrame 但保留值的类型(np.uint64)?

java - 是否可以为 @RequestMapping 使用字符串而不是字符串文字的值?

C# 根据枚举值获取公共(public)变量的类型

java - 验证@RequestParam 在枚举列表中