c# – 操作符’?’不能应用于’方法组’类型的操作数

这是关于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#就不会让你做任何事情.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...