为什么不允许为方法声明空表达式体?
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()
真的没有任何意义
我有一个像这样有一个空主体的方法:
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()
真的没有任何意义