C++ cli 为什么要切换类型为';系统::Guid';这是违法的吗?

C++ cli 为什么要切换类型为';系统::Guid';这是违法的吗?,c++-cli,switch-statement,typeid,C++ Cli,Switch Statement,Typeid,显然,大小写表达式不是常数。但是我想知道为什么不能在编译时知道guid?(我想这是个愚蠢的问题) 在一天结束时,您似乎必须使用叠瓦if-then-else对typeid进行测试,这是唯一的方法,对吗?在.NET的switch语句中只能使用字符串、整型类型和枚举。简单地说:CLR没有Guid的元数据表示形式。。。或者确实是DateTime或Decimal,就像其他明显的候选者一样。这意味着Guid没有常量表示,开关大小写必须是常量,至少在C#中是这样,我怀疑在C++/CLI中也是这样 现在这不一定

显然,大小写表达式不是常数。但是我想知道为什么不能在编译时知道guid?(我想这是个愚蠢的问题)


在一天结束时,您似乎必须使用叠瓦
if-then-else
typeid
进行测试,这是唯一的方法,对吗?

在.NET的switch语句中只能使用字符串、整型类型和枚举。

简单地说:CLR没有
Guid的元数据表示形式。。。或者确实是
DateTime
Decimal
,就像其他明显的候选者一样。这意味着
Guid
没有常量表示,开关大小写必须是常量,至少在C#中是这样,我怀疑在C++/CLI中也是这样

现在这不一定是一个拦截器。。。C#允许通过一个伪造的常量十进制值,语言可以对GUI做同样的事情,然后允许您打开它们。毕竟,语言可以决定如何实现切换


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

由语言决定支持什么。您当然可以创建一种针对.NET的语言,它确实支持打开GUI。这对于C#switch语句来说是正确的。.net switch指令只能采用整数类型(枚举通过其整数值使用)。@Jon Skeet&@Jb Evain:但这将无法通过
switch
MSIL指令实现。啊,这是有意义的。谢谢
MetadataToken
属性对于打开类型不是更有用吗?
void Foo(Type^ type)
{
  System::Guid id = type->GUID;
  switch (id)
  {
  case System::Byte::typeid->GUID:
    ...
    break;
  ...
  }