为什么不允许为方法声明空表达式体?

Why is it not allowed to declare empty expression body for methods?

我有一个像这样有一个空主体的方法:

public void Foo()
{
}

根据 ReSharper 的建议,我想将其转换为表达式主体以节省一些 space 结果变成了:

public void Foo() => ;

无法编译。是否有不支持的具体原因?

而且我认为我应该为 ReSharper 打开一个错误票,因为它将代码重构为不可编译的版本。

[编辑:此答案不正确,请勿使用 - 请参阅评论。]

如您所见,表达式正文使用了 lambda 运算符(“=>”)。如果您仍想将空的 void 方法编写为表达式主体,则可以使用 Expression.Empty() 来表明 Foo() 是一个空(void)表达式。

Methods that return void or Task should be implemented with expressions that don’t return anything, either. (https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/october/csharp-the-new-and-improved-csharp-6-0)

下面的代码片段应该可以工作。

public void Foo() => Expression.Empty();

我也同意你最后的评论,这是一个 ReSharper 错误。

来自docs

An expression body definition has the following general syntax:

member => expression;

where expression is a valid expression.

还有:

An expression-bodied method consists of a single expression that returns a value whose type matches the method's return type, or, for methods that return void, that performs some operation.

所以如果你想使用表达式主体成员,你实际上需要...... 一个表达式(惊喜!)

但是你仍然可以使用常规样式:

string Property
{
    get => _value;
    set { } // empty
}

void Method() { } // empty

您可以创建一个“无操作”助手,如下所示:

public static void Noop() {}

string Property
{
    set => Noop();
}

void Method() => Noop();

另一种选择是 GC.KeepAlive(null)

new object()更好。

Expression.Empty()真的没有任何意义