c++-cli - 为什么 'System::Guid' 类型的 switch 表达式是非法的?

标签 c++-cli switch-statement typeid

void Foo(Type^ type)
{
  System::Guid id = type->GUID;
  switch (id)
  {
  case System::Byte::typeid->GUID:
    ...
    break;
  ...
  }

显然 case 表达式不是恒定的。但我想知道为什么 GUID 在编译时无法得知? (我猜是个愚蠢的问题)。

归根结底,您似乎必须使用叠瓦式 if then else 来针对 typeid 进行测试,这是唯一的方法,对吧?

最佳答案

简单地说:CLR 没有 Guid 的元数据表示...或者实际上 DateTimeDecimal,正如其他明显的候选者一样。这意味着 Guid 没有常量表示,并且 switch case 必须是常量,至少在 C# 中如此,我怀疑在 C++/CLI 中也是如此。

现在这没有成为一个阻碍...C#允许通过捏造的const十进制值,并且语言可以为Guids做同样的事情,并且然后允许您打开它们。毕竟,语言可以决定如何实现切换。

我怀疑 C++/CLI 设计者认为这是一个非常罕见的用例,不值得让语言和编译器复杂化来支持它。

关于c++-cli - 为什么 'System::Guid' 类型的 switch 表达式是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299390/

相关文章:

c++ - 使用运行时类型信息的内存分配

c++ - typeid 何时可以为同一类型返回不同的 type_info 实例?

c++在switch语句中定义变量 - 定义有/没有初始化

c++-cli - C++/CLI 等效于 C#'s ' readonly' 关键字

c++ - native 数组的 Memcpy 到 C++ CLI 中的托管数组

c++ - Visual C++ 异或加密错误

c# - Break inside switch 无法终止 FOR 循环

c++ - 在 Visual C++ 中 switch 是如何编译的,它的优化和速度如何?

c++ - typeid,如何仅获取类型名称

c# - C++/CLI 无法识别命名空间