C#表达式主体推断?

c#

假设我有一个小的示例类:

public class Test
{
    public Test() {}
    public List<int> Numbers { get; set; } = new List<int>();

    public void AddNumber(int number) => Numbers.Add(number);
    public void RemoveNumber(int number) => Numbers.Remove(number);
}

void命名RemoveNumberbool返回类型List<int>.Remove(int item)方法使用返回类型方法时,为什么上面的摘录没有给出任何警告或错误?调用方法和被调用方法的返回类型是否应该不匹配?

回答

C# 文档关于 Expression-bodied 成员的页面说(强调我的):

表达健全方法包括一个单一的表达的返回类型与方法的返回类型相匹配的值,或者,对于该方法返回void执行某种操作

所以 C# 语言正在为 做一个特殊情况的例外void,所以给定一个这种形式的成员:

T Name() => Expr;

...thentypeof(Expr)必须匹配T- 除了 when Tis void(就像你的情况一样),在这种情况下Expr是一种执行某些操作的方法并且Expr隐式丢弃其返回值。

C# 不支持此类场景的类型推断(如果支持,您void无论如何都不会指定)。


至于为什么没有警告或错误 - 那是因为您关闭了代码分析。如果您要在您的项目中启用它,那么您的代码将收到CA1806警告,因为boolNumbers.Remove(number)被忽略的返回- 修复方法是添加显式丢弃 ( _ = ),如下所示:

public void RemoveNumber(int number) => _ = Numbers.Remove(number);


以上是C#表达式主体推断?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>