我在启动类(.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()
};
您应该显式声明处理程序的类型,而不是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 { }
var
是挑剔的-它希望事情模棱两可,由于handler
和MyHandler1
是不同的类型,因此MyHandler2
应该是什么类型也不明显;基本上,从MyHandler1
和MyHandler2
中选择一些通用的基本类型或已实现的接口,并使用它们代替var
。在最坏的情况下,object
就足够了:
object handler = key switch
{
"myhandler1" => new MyHandler1(),
"myhandler2" => new MyHandler2(),
_ => throw new NotImplementedException()
};
编译器本身不会尝试这样做。