gpt4 book ai didi

C# 表达式主体推断?

转载 作者:行者123 更新时间:2023-12-04 02:28:28 25 4
gpt4 key购买 nike

假设我有一个小示例类:

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 时上面的摘录没有给出任何警告或错误?名为 RemoveNumber 的返回类型方法使用 bool返回类型 List<int>.Remove(int item)方法?调用方法和被调用方法的返回类型是否应该不匹配?

最佳答案

The C# documentation's page on Expression-bodied members说(强调我的):

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.

所以 C# 语言正在为 void 创建一个特例异常,所以给定一个这种形式的成员:

T Name() => Expr;

...然后 typeof(Expr) 必须匹配 T - 当 Tvoid 时除外(如它在你的情况下)在这种情况下 Expr 是一个方法执行一些操作并且 Expr 的返回值被隐式丢弃。

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


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

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

关于C# 表达式主体推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65737046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com