接线员'?' 不能应用于'方法组'类型的操作数

Ahm*_*mid 10 .net c# c#-6.0

这是关于C#新引入的空检查运算符的问题.

假设我有一个界面,如:

interface ILogger
{
    void Log(string message);
}
Run Code Online (Sandbox Code Playgroud)

和一个期望记录操作的函数:

void DoWork(Action<string> logAction)
{
    // Do work and use @logAction
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试编写,为什么会出现以下编译器错误:

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);   
}
Run Code Online (Sandbox Code Playgroud)

小智 16

这里没有什么特别之处?.,它就像它一样工作?::logger?.Log会给出相同的结果logger == null ? null : logger.Log,除了logger只被评估一次.

问题是logger == null ? null : logger.Log在早期版本的C#中同样无效.?:要求一个操作数可以转换为另一个操作数的类型,但既不是null也不logger.Log是类型.你必须把它写成例如logger == null ? null : (Action<string>) logger.Log.

不幸的是,引入那个强制转换意味着没有简单漂亮的C#6缩短版本可以使用,因为同样适用于?.:logger?.Log无效因为logger.Log没有类型,所以logger?.Log也没有类型,但如果它是一个表达式没有一个类型,它不是一个方法组,那么C#就不会让你这么做.