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# キャストが冗長であると警告します。だから私はそれを信頼し、キャストを削除することにしました. 両方の (Func<int, string>) キャストに適用されます。
そこで、そのうちの 1 つを削除することにしました。
public static string Test(char x)
{
return (x switch
{
'a' => i => "hello",
_ => (Func<int, string>)(i => "world")
})(1);
}
しかし今、IDE は「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));
}
現在、「スイッチ」は同じエラーでまだ赤ですが、さらに「DayOfWeek」は赤で、マウスオーバーすると「シンボル 'DayOfWeek' を解決できません」と表示されますが、型の定義はそこにあり、すべてがコンパイルされ、期待どおりに動作します「こんにちは土曜日」を出力します。
そこから、2 番目のキャスト (Func<DateTimeOffset, string>) を削除すると、エラー CS0149: Method name expected が原因でコンパイルされません (どういうわけか式を適切に解析できないと思います)。