开发者

Why switch expressions of type 'System::Guid' are illegal?

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

Obviously case expressions are not constant. But I'd like to know why GUIDs cannot be开发者_开发问答 known at compile time? (silly question I guess).

At the end of the day it looks you have to use imbricated if then else for testing against typeid and thats the only way to go, right?


Simply put: the CLR has no metadata representation of a Guid... or indeed DateTime or Decimal, as the other obvious candidates. That means there isn't a constant representation of Guid, and switch cases have to be constants, at least in C# and I suspect in C++/CLI too.

Now that doesn't have to be a blocker... C# allows const decimal values via a fudge, and languages could do the same thing for Guids, and then allow you to switch on them. The language can decide how it's going to implement switching, after all.

I suspect that the C++/CLI designers felt that it would be a sufficiently rare use-case that it wasn't worth complicating the language and the compiler to support it.


Only strings, integral types and enums can be used in .NET in a switch statement.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜