c#8转换表达式:找不到最佳的转换表达式类型

问题描述 投票:0回答:2

我在启动类(.net核心3.1)中添加了代码,以根据参数返回类型,并且出现编译时错误。

我已经在sharplab中创建了一个正在运行的示例。如果switch表达式包含字符串或其他对象,则运行良好。

工作示例1:

var x = key switch
            {
                "myhandler1" => "something",
                "myhandler2" => "something else",
                _ => "default case"
            };

工作示例2:

object obj =  s switch {
            "a" => new object(),
            "b" => new DateTime(),
            _ => throw new NotImplementedException()
        };

错误示例:]

var key = "myhandler1";

            var handler = key switch
            {
                "myhandler1" => new MyHandler1(),
                "myhandler2" => new MyHandler2(),
                _ => throw new NotImplementedException()
            };

找到此链接:https://github.com/dotnet/csharplang/issues/2728

c# asp.net-core-3.1 switch-expression
2个回答
1
投票

您应该显式声明处理程序的类型,而不是var

IHandler handler = key switch //or BaseHandler handler = key switch
            {
                "myhandler1" => new MyHandler1(),
                "myhandler2" => new MyHandler2(),
                _ => throw new NotImplementedException()
            };

在您的示例中,两个处理程序都继承了接口和基本类型,编译器根本不知道要使用哪种类型

interface IHandler { }
public class BaseHandler { }
public class MyHandler1: BaseHandler, IHandler { }
public class MyHandler2: BaseHandler, IHandler { }

1
投票

var是挑剔的-它希望事情模棱两可,由于handlerMyHandler1是不同的类型,因此MyHandler2应该是什么类型也不明显;基本上,从MyHandler1MyHandler2中选择一些通用的基本类型或已实现的接口,并使用它们代替var。在最坏的情况下,object就足够了:

object handler = key switch
{
    "myhandler1" => new MyHandler1(),
    "myhandler2" => new MyHandler2(),
    _ => throw new NotImplementedException()
};

编译器本身不会尝试这样做。

© www.soinside.com 2019 - 2024. All rights reserved.