c# - 运算符 '?' 不能应用于类型 'method group' 的操作数

标签 c# .net c#-6.0

这是一个关于 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只被评估一次。

问题是 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# 将无能为力。

关于c# - 运算符 '?' 不能应用于类型 'method group' 的操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34909915/

相关文章:

c# - EntityFramework 6.0 CreateDatabaseIfNotExists 代码先创建数据库

c# - Azure函数中通过实例id获取主机锁租约的原因是什么?

c# - 无法添加对 microsoft.office.interop.excel 的引用

c# - .NET - 如何正确设置函数的 Azure 服务总线队列/主题

c# - 通过反射设置自动属性的值

c# - 通过方法创建具有通用 csv 阅读器的类

c# - 数据绑定(bind)后访问 ListBox 项

c# - 获取屏幕的原始分辨率

c# - 虚拟主机.exe。为什么需要这个?

c# - 在 Razor 中以正确的方式使用 C# 6 字符串插值