.NET 4中的奇怪切换行为

RaY*_*ell 10 .net .net-4.0 switch-statement

我有一个问题,在下面的代码中了解导致编译错误的原因:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误switch (test)符合:

A switch expression or case label must be a bool, char, string, integral, 
enum, or corresponding nullable type.
Run Code Online (Sandbox Code Playgroud)

Intellisence向我展示了foo操作将在运行时解决,这很好,因为我使用动态类型作为参数.但是我不明白if当开关没有时条件编译得很好.

上面的代码只是我在我的应用程序(VSTO)中的简化版本,它是在将应用程序从VSTO3迁移到VSTO4之后出现的,当时VSTO中的一个方法被更改为返回dynamic类型值而不是object.

任何人都可以给我一个解释是什么问题.我知道如何解决它,但我想了解发生了什么.

the*_*oop 10

因为你正在动态调用一个方法,结果也是一个dynamic(因为返回值可能是任何东西 - 直到运行时它才知道).你不能switchdynamic变量类型上.