【发布时间】:2010-06-02 12:54:44
【问题描述】:
我无法理解导致以下代码中的编译错误的原因:
static class Program
{
static void Main()
{
dynamic x = "";
var test = foo(x);
if (test == "test")
{
Console.WriteLine(test);
}
switch (test)
{
case "test":
Console.WriteLine(test);
break;
}
}
private static string foo(object item)
{
return "bar";
}
}
我得到的错误在switch (test) 行:
A switch expression or case label must be a bool, char, string, integral,
enum, or corresponding nullable type.
Intellisence 告诉我 foo 操作将在运行时解决,这很好,因为我使用动态类型作为参数。但是我不明白 if 条件在 switch 没有时如何编译。
上面的代码只是我在应用程序 (VSTO) 中的简化版本,它是在将应用程序从 VSTO3 迁移到 VSTO4 后出现的,当时 VSTO 中的一种方法被更改为返回 dynamic 类型值而不是 object。
谁能给我一个解释是什么问题。我知道如何解决它,但我想了解发生了什么。
【问题讨论】:
-
看起来你不能直接输入开关
-
因为
switch不是为所有可能的对象类型定义的 -
每个人似乎都在回答,好像问题是“为什么我不能在
dynamic上使用switch?”我认为问题真的应该是“为什么test首先输入为dynamic?”我知道 iffoo有返回不同类型的重载,test必须是dynamic;但由于它没有,我仍然无法在这里找出“真正”问题的答案。 -
我怀疑它在 C# 规范中 - 如果一个表达式有一个
dynamic输入,那么输出也是dynamic,不管表达式是否只有一种可能的解释(因为,比如说,您可以使用反射添加另一种方法)
标签: .net .net-4.0 switch-statement