这是一个关于 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/