为什么我不能打开一个类,对枚举进行一次隐式转换

2023-12-27

我想知道为什么到枚举值的单个隐式转换的工作方式与转换到系统类型时的工作方式不同。我看不出任何技术原因,但也许比我聪明的人可以为我提供一些启示。

以下无法编译,"A value of an integral type expected" and "Cannot implicitly convert type 'Test.En' to 'Test.Foo".

void test1 (){
    Foo f = new Foo();

    switch (f)         // Comment this line to compile
    //switch ((En)f)   // Uncomment this line to compile
    {
        case En.One:
            break;
    }
}


//////////////////////////////////////////////////////////////////

public enum En
{
    One,
    Two,
    Three,
}

public class Foo
{
    En _myEn;

    public static implicit operator En(Foo f)
    {
        return f._myEn;
    }
}

edit从规范:

switch 语句的控制类型由 switch 表达式确定。如果 switch 表达式的类型是sbyte、byte、short、ushort、int、uint、long、ulong、char、string 或枚举类型,那么这就是 switch 语句的控制类型。否则,必须存在从 switch 表达式的类型到以下可能的控制类型之一的用户定义的隐式转换(第 6.4 节):sbyte、字节、短、ushort、int、uint、long、ulong、char、字符串。如果不存在此类隐式转换,或者存在多个此类隐式转换,则会发生编译时错误。

为了澄清这个问题,为什么枚举类型不包含在允许的列表中用户定义的隐式转换s?


语言设计说明存档没有提供此决定的理由。这是不幸的,因为决定改变了。正如您所看到的,设计随着时间的推移而演变:

1999 年 5 月 26 日的笔记:

允许哪些类型作为 switch 语句的参数? 整型包括 char、enum 类型,布尔。 C# 也允许类型 这可以隐含地并且 明确转换为其中之一 上述类型。 (如果有 多次隐式转换,那么它的 不明确且编译时错误 发生。)我们不确定我们是否 是否支持字符串。

1999 年 6 月 7 日:

我们讨论了启用字符串开关 论据。我们认为这是一个很好的 特性——语言可以增加价值 通过使这种常见情况更容易 写,以及额外的复杂性 对于用户来说是非常低的。

1999 年 12 月 20 日:

开机是违法的 bool 类型的表达式。这是合法的 打开 a 的表达式 整型或字符串类型。这是 打开 a 的表达式是合法的 只具有一个隐式的类型 转换为整型或 字符串类型。

这里我们第一次出现了相关规则。枚举似乎已经消失了。为什么不使用用户定义的隐式转换为枚举?这只是一个疏忽吗?设计师没有记录他们的想法。

请注意,第一句话不是我们实现的。我不清楚为什么实施者的做法与设计委员会的建议相反。几年后,这一点在笔记中再次出现:

2003 年 8 月 13 日:

编译器允许在 bool 上进行切换。 不想记录并添加它 到语言。不想删除 出于兼容性原因。决定了 默默继续支持switch 在布尔上。

我觉得这很愚蠢;当我们制作 C# 3.0 规范的带注释的印刷版时,我将 bool (和 bool?) 添加到合法管理类型列表中。

简而言之:整个事情有点混乱。我不知道为什么枚举先输入,然后输出,然后半进半出。这可能仍然是未知之谜之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能打开一个类,对枚举进行一次隐式转换 的相关文章

随机推荐

  • 将 Unicode 转换为 ASCII 而不更改字符串长度(在 Java 中)

    将字符串从 Unicode 转换为 ASCII 而不改变其长度的最佳方法是什么 这对我来说非常重要 此外 没有任何转换问题的字符必须位于与原始字符串相同的位置 因此 必须转换为 A 而不是具有更多字符的神秘内容 Edit novalis 这
  • fseek for fd(int fd 而不是 FILE*)

    fd 是否有相当于 fseek 的功能 我已经使用int fds很长时间了 想使用fseek 但我知道没有seek功能 提前致谢 查看 POSIX 函数lseek 2 http linux die net man 2 lseek SYNOP
  • 如何使用情感 CSS 覆盖 React 组件的 CSS?

    下面的例子说明了如何申请background color green to the
  • 如何创建 4 或 8 连接的邻接矩阵

    我一直在寻找一个 python 实现 给定一个数组 它返回 4 或 8 连接的邻接矩阵 我感到惊讶的是 cv2 或 networkx 不包含此功能 我发现了这个很棒的 Matlab执行 https stackoverflow com a 3
  • WCF 并行模拟

    我有一个带有 ImpersonationOption Required 的 WCF 服务 使用并行性时 模拟似乎不会流动 例如 Parallel ForEach items gt results Add SystemUtil Windows
  • F# 中测量单位的模式匹配

    这个功能 let convert v float lt gt match v with float
  • 是否有一种声明式方法将 XML 解析为 Java 对象?

    我正在将 XML 文件的导入函数编写到我的 Java 应用程序中 我在用XOM http xom nu 解析 XML 文件 解析XML的代码并不容易理解 它是一些硬编码的 getChild 3 等等 与声明性 XML 文档相比 很难理解代码
  • 安装了多个.net core SDK(不同版本),我可以只保留最新的吗?

    我最近一直在使用 Visual Studio Community IDE 开发一些应用程序 我刚刚看到我的桌面上安装了多个 NET Core SDK 其次要版本更新略有不同 可能与 Microsoft 推送的 VS 更新一起安装 问题 我可
  • 如何在颤动的滚动视图中将容器或任何其他小部件固定在应用栏下方

    我希望在滚动屏幕时将小部件放置在应用程序下方 屏幕包含一个具有灵活空间的浮动应用程序栏 sliverappbar 其下方是一个具有任何容器或选项卡视图的容器 链接中的视频是我想要的效果的示例 好吧 我想我现在明白你了 您需要实现 Custo
  • 订阅类别流,事件永远不会出现在订阅客户端中

    第一次使用获取事件存储 http geteventstore com阅读文档后 我遇到了一个问题 事件永远不会出现在我的订阅客户端上 由于我错过了一个配置步骤 这是可能的 拥有这个控制台应用程序客户端 public class EventS
  • 是否有 .NET 4.5 相当于:Storagefile.Openasync

    我爱上了异步和等待 但是我无法弄清楚如何在不使用 Task Run 的情况下等待文件打开 似乎有一个WRT 中的 API http msdn microsoft com en us library windows apps windows
  • 错误处理(向客户端发送 ex.Message)

    我有一个 ASP NET Core 1 0 Web API 应用程序 并试图弄清楚如果我的控制器调用的函数出错 如何将异常消息传递给客户端 我尝试了很多东西 但没有任何实现IActionResult 我不明白为什么这不是人们需要的常见东西
  • AWS 上的 Kubernetes PVC 与 ReadWriteMany

    我想在 AWS 上设置 PVC 我需要ReadWriteMany作为访问模式 不幸的是 EBS仅支持ReadWriteOnce 我该如何解决这个问题 我看到 AWS EFS 有一个测试版提供商 它支持ReadWriteMany 但正如所说
  • 如何强制我想要的任何显示分辨率/时间?

    我无法找到一种方法来在我的 C 程序中强制执行我想要的任何显示分辨率 计时 我运行的是带有 GeForce 210 显卡的 Windows 7 我当前实现这些自定义分辨率的方法是使用驱动程序 GUI 手动添加自定义分辨率 然后使用 Wind
  • Eclipse 找不到 std c++ 库

    我有一台Windows8机器 mingw安装在c mingw Eclipse 确实成功编译了程序 但它认为包含错误的行在编译时没有问题 Eclipse 本身没有找到库 当我第一次在 Eclipse 中构建一个安装了 CDT 组件的项目时 它
  • this 指针不能在构造函数中使用别名:

    我正在学习 C 中的继承 我遇到了以下情况陈述 https en cppreference com w cpp language this 换句话说 this 指针不能在构造函数中使用别名 extern struct D d struct
  • 访问 ASP.Net MVC 中的“Application”对象来存储应用程序范围的变量

    如何在 ASP net MVC 中存储应用程序范围内的变量或对象 在常规 ASP 中 您有 Application 对象 显然在 ASP net 中也是如此 我正在使用 ASP net MVC 2 在控制器中 您应该能够执行以下操作 thi
  • 更改 Woocommerce 3 中的订单商品价格

    我需要更改 woocommerce 订单中的商品价格 但我发现的所有内容都是更改购物车中的价格 但这不是我需要的 因为我需要在结帐过程后进行更改 有人可以告诉我如何做到这一点吗 你需要使用新的CRUD 设置器方法 https github
  • 如何将值添加到地图内的集合? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有这张地图Map
  • 为什么我不能打开一个类,对枚举进行一次隐式转换

    我想知道为什么到枚举值的单个隐式转换的工作方式与转换到系统类型时的工作方式不同 我看不出任何技术原因 但也许比我聪明的人可以为我提供一些启示 以下无法编译 A value of an integral type expected and C