【问题标题】:Why switch expressions of type 'System::Guid' are illegal?为什么'System::Guid'类型的switch表达式是非法的?
【发布时间】:2010-07-21 12:52:19
【问题描述】:
void Foo(Type^ type)
{
  System::Guid id = type->GUID;
  switch (id)
  {
  case System::Byte::typeid->GUID:
    ...
    break;
  ...
  }

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

在一天结束的时候,看起来你必须使用覆盖的if then else 来测试typeid,这是唯一的方法,对吧?

【问题讨论】:

  • MetadataToken 属性对于打开类型不是更有用吗?

标签: c++-cli switch-statement typeid


【解决方案1】:

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

现在, 不会成为阻止程序...C# 允许通过软糖来实现 const 十进制值,而语言 可以 为 Guid 做同样的事情,并且然后让你打开它们。毕竟,语言可以决定如何实现切换。

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

【讨论】:

  • 啊,有道理。谢谢!
【解决方案2】:

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

【讨论】:

  • 由语言决定支持什么。您当然可以创建一种针对 .NET 的语言,它确实支持打开 Guid。
  • C# switch 语句是这样。 .net switch 指令只能采用整数类型(通过整数值使用枚举)。
  • @Jon Skeet 和@Jb Evain:但这将无法通过switch MSIL 指令实现。
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2020-07-14
  • 2017-05-27
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多