区块链技术博客
www.b2bchain.cn

C#8开关表达式:找不到用于开关表达式的最佳类型 – c#程序员分享

本文介绍了C#8开关表达式:找不到用于开关表达式的最佳类型 – c#程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我在启动类(.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 { } 

对于依赖项注入示例也是如此,您应该显式声明一个类型(假设Handler1Handler2实现IHandler

return key switch {     Constants.Brand => sp.GetService<Handler1>(),     Constants.Series => (IHandler) sp.GetService<Handler2>(),     _ => throw new NotImplementedException() }; 

您只能为一个常数执行此操作,编译器足够智能,可以为您完成其余工作

我是这里的新手。我有一个VS2017 asp.net C#Web应用程序。我目前不在使用Angular。这是一个简单的网站。我隐藏了div,当用户单击菜单项时,相关的div出现,而我隐藏了其余的div。我使用JavaScript完成此任务。在开发和IIS Express中,它可以工作。当我发布到IIS时,它不起作用。静态页面显示“确定”,但菜单按钮不执行任何…

我正在尝试确保一个下拉框或另一个下拉框具有选定的条目,不能两者都选,并且不能都留空/未选择。每次单击运行javascript验证代码的搜索按钮时,即使我只是从一个下拉列表中选择,甚至从两个下拉列表中都没有选择,我都会收到一条消息,好像在两个下拉框中都选择了一样!这可能是我的逻辑,但是,我认为也可能是我的变量读为null。是否有人对问题可能是什么以及如何解决这…

我有一个母版页,在on load事件中包含以下几行: string menuIDdata = Page.Request.QueryString["mid"]; menuID = 0; // Get the menu ID if (!int.TryParse(menuIDdata, out menuID)) { menuID = 0; } …

有没有一种方法可以使div上的click事件与表单环境中的单选按钮相同?我只希望下面的div提交值,单选按钮很丑代码输出如下:<input id="radio-2011-06-08" value="2011-06-08" type="radio" name="radio_date&#…

我有一个生成随机数的模型:public int IsLocked { get { var rnd = new Random(); return rnd.Next(0, 2); } } 这是我的局部视图:<table class="table table-striped table-hover dataTable admin-form them…

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » C#8开关表达式:找不到用于开关表达式的最佳类型 – c#程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们