2

我在搞乱 C# switch 表达式,我遇到了一些很奇怪的东西。

这是代码:

static void Main(string[] args)
{
    Console.WriteLine(Test('a'));
    Console.ReadLine();
}

public static string Test(char x)
{
    return (x switch
    {
        'a' => (Func<int, string>)(i => "hello"),
         _ => (Func<int, string>)(i => "world")
    })(1);
}

IDE(Visual Studio)警告我 IDE0004 C# Cast 是多余的。所以我相信它并决定移除演员表。它适用于两个 (Func<int, string>) 强制转换。

所以,我决定删除其中一个:

public static string Test(char x)
{
    return (x switch
    {
        'a' => i => "hello",
         _ => (Func<int, string>)(i => "world")
    })(1);
}

但是现在,IDE 用红色强调了“switch”关键字。“错误”的消息是“没有为 switch 表达式找到最佳类型”。在这一点上,我假设 IDE 关于冗余的建议是无效的,并且后面会插入一个错误。但是......当我运行程序时,即使关键字带有红色下划线并且出现错误,它也可以正常编译并正常运行(它会打印“hello”并在 ReadLine 上阻塞)。

所以问题是:这是一个错误(来自 IDE 还是编译器)?如果是,我在哪里可以举报?如果不是……有人愿意详细说明为什么会这样吗?

奖励:另外,让我们假设“x”是一个 DateTimeOffset:

public static string Test(char x)
{
    return (x switch
    {
        'a' => i => $"hello {i.DayOfWeek}",
         _ => (Func<DateTimeOffset, string>)(i => "world")
    })(DateTimeOffset.FromUnixTimeSeconds(1599335154));
}

现在,“switch”仍然是红色的,但同样的错误,但是,“DayOfWeek”是红色的,鼠标悬停告诉“Cannot resolve symbol 'DayOfWeek'”,但是类型的定义在那里,一切仍然按预期编译和工作输出“你好星期六”。

从那里,如果我删除第二个强制转换 (Func<DateTimeOffset, string>),由于错误 CS0149: Method name expected(我认为它无法正确解析表达式)而无法编译。

4

0 回答 0