有人可以在C#开关表达式中解释这种类型的推断“故障”吗?

问题描述

我在搞弄C#开关表达式,遇到了很奇怪的事情。

代码如下:

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 )强制转换。

因此,我决定删除其中之一:

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

但是现在,IDE用红色突出显示了“ switch”关键字。 “错误”的消息是“找不到用于开关表达式的最佳类型”。在这一点上,我认为来自IDE的关于冗余的建议是无效的,并且在此之后会插入错误。但是...当我运行该程序时,即使该关键字用红色下划线标记并出现错误,它也可以正确编译并正常运行(它会显示“ hello”并在ReadLine上阻止)。

所以问题是:这是bug(来自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”为红色,鼠标悬停时显示“无法解析符号'DayOfWeek'”,但是类型的定义在那里,一切仍然可以编译和可以正常输出“ hello Saturday”。

从那里,如果我删除第二个强制类型转换(Func ),由于错误CS0149,它将无法编译:预期使用方法名(我认为它无法正确解析表达式)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)