c# – 操作符’?’不能应用于’方法组’类型的操作数
发布时间:2020-12-15 18:06:45 所属栏目:百科 来源:网络整理
导读:这是关于C#新引入的空检查运算符的问题. 假设我有一个界面,如: interface ILogger{ void Log(string message);} 和一个期望记录操作的函数: void DoWork(Actionstring logAction){ // Do work and use @logAction} 如果我尝试编写,为什么会出现以下编译器
这是关于C#新引入的空检查运算符的问题.
假设我有一个界面,如: interface ILogger { void Log(string message); } 和一个期望记录操作的函数: void DoWork(Action<string> logAction) { // Do work and use @logAction } 如果我尝试编写,为什么会出现以下编译器错误: void Main(string[] args) { ILogger logger = GetLogger(); // Assume GetLogger() may return null // // Compiler error: // Operator '?' cannot be applied to operand of type 'method group' // DoWork(logger?.Log); } 解决方法
没有什么特别的事吗?在这里,它的工作原理与它一样?:: logger?.Log会给出与logger == null相同的结果? null:logger.Log,除了仅记录一次的记录器.
问题是logger == null? null:logger.Log在早期版本的C#中同样无效. ?:要求一个操作数可以转换为另一个操作数的类型,但是null和logger.Log都没有类型.你必须把它写成例如logger == null? null:(Action< string>)logger.Log. 不幸的是,引入那个强制转换意味着你可以使用简单漂亮的C#6缩短版本,因为同样适用于.:.logger?.Log无效,因为logger.Log没有类型,所以logger?.Log doesn也没有类型,但如果它是一个没有类型的表达式,并且它不是一个方法组,那么C#就不会让你做任何事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- c – 将sockaddr_storage复制到另一个sockaddr_s
- 这是PostgreSQL的通用MERGE / UPSERT功能安全吗?
- Dependency Injection and Inversion Control(依
- ruby-on-rails – 如果空闲,Rails protect_from_
- objective-c – 如果目标支持,只执行选择器?
- c# – 从列表中删除子列表
- c – 指向一个空数组的指针
- ruby-on-rails – Ruby on Rails应用程序的FTPS(
- ruby-on-rails – 如何在Rails验证错误上突出显示
- 为什么我的C对象丢失了它的VPTr
热点阅读