我在启动类(.net core 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()
};
错误示例:
interface IHandler { }
public class BaseHandler { }
public class MyHandler1: BaseHandler, IHandler { }
public class MyHandler2: BaseHandler, IHandler { }
class Program
{
static void Main(string[] args)
{
var key = "myhandler1";
var handler = key switch
{
"myhandler1" => new MyHandler1(),
"myhandler2" => new MyHandler2(),
_ => throw new NotImplementedException()
};
var x = key switch
{
"myhandler1" => "something",
"myhandler2" => "something else",
_ => "default case"
};
Console.WriteLine("Hello World!");
}
}
原始问题(需要解决):
serviceCollection.AddTransient<Func<string, IHandler>>(sp => key =>
{
return key switch
{
Constants.Brand => sp.GetService<Handler1>(),
Constants.Series => sp.GetService<Handler2>(),
_ => throw new NotImplementedException()
};
}
找到此链接:https://github.com/dotnet/csharplang/issues/2728
感谢Pavel和Marc,下面是解决方法:
serviceCollection.AddTransient<Func<string, IHandler>>(sp => key =>
{
return key switch
{
Constants.Brand => (sp.GetService<Handler1>() as IHandler),
Constants.Series => (sp.GetService<Handler2>() as IHandler),
_ => throw new NotImplementedException()
};
}
参考方案
您应该显式声明处理程序的类型,而不是var
IHandler handler = key switch //or BaseHandler handler = key switch
{
"myhandler1" => new MyHandler1(),
"myhandler2" => new MyHandler2(),
_ => throw new NotImplementedException()
};
在您的sharplab示例中,两个处理程序都实现了IHandler
接口并继承了BaseHandler
类,编译器根本不知道要使用哪种类型,您应该明确地告诉他
interface IHandler { }
public class BaseHandler { }
public class MyHandler1 : BaseHandler, IHandler { }
public class MyHandler2 : BaseHandler, IHandler { }
对于依赖项注入示例也是如此,您应该显式声明一个类型(假设Handler1
和Handler2
实现IHandler
)
return key switch
{
Constants.Brand => sp.GetService<Handler1>(),
Constants.Series => (IHandler) sp.GetService<Handler2>(),
_ => throw new NotImplementedException()
};
您只能为一个常数执行此操作,编译器足够智能,可以为您完成其余工作
将asp.net.core 2.0应用发布到IIS时JavaScript无法运行 - javascript我是这里的新手。我有一个VS2017 asp.net C#Web应用程序。我目前不在使用Angular。这是一个简单的网站。我隐藏了div,当用户单击菜单项时,相关的div出现,而我隐藏了其余的div。我使用JavaScript完成此任务。在开发和IIS Express中,它可以工作。当我发布到IIS时,它不起作用。静态页面显示“确定”,但菜单按钮不执行任何…
使用Java脚本基于另一个控件项来验证ASP.NET C#控件 - c#我正在尝试确保一个下拉框或另一个下拉框具有选定的条目,不能两者都选,并且不能都留空/未选择。每次单击运行javascript验证代码的搜索按钮时,即使我只是从一个下拉列表中选择,甚至从两个下拉列表中都没有选择,我都会收到一条消息,好像在两个下拉框中都选择了一样!这可能是我的逻辑,但是,我认为也可能是我的变量读为null。是否有人对问题可能是什么以及如何解决这…
ASP.net C#崩溃一行 - c#我有一个母版页,在on load事件中包含以下几行: string menuIDdata = Page.Request.QueryString["mid"]; menuID = 0; // Get the menu ID if (!int.TryParse(menuIDdata, out menuID)) { menuID = 0; } …
Div单击与单选按钮相同吗? - php有没有一种方法可以使div上的click事件与表单环境中的单选按钮相同?我只希望下面的div提交值,单选按钮很丑代码输出如下:<input id="radio-2011-06-08" value="2011-06-08" type="radio" name="radio_date…
如果数字是1或0,则显示不同的图标-ASP.NET C#MVC JQuery - javascript我有一个生成随机数的模型:public int IsLocked { get { var rnd = new Random(); return rnd.Next(0, 2); } } 这是我的局部视图:<table class="table table-striped table-hover dataTable admin-form them…