【问题标题】:Getting "Cannot use ref or out parameter inside an anonymous method, lambda expression, or query expression" for an "in" parameter为“in”参数获取“无法在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数”
【发布时间】:2018-02-01 14:20:01
【问题描述】:

C# 7.2 为方法参数添加了只读结构和 in 修饰符。但是,当您尝试在 lambda 表达式中使用具有类引用语义的这些结构时,会出现编译器错误:

public readonly struct Point {
    public Struct(int x, int y) {
        X = x;
        Y = y;
    }
    public int X { get; }
    public int Y { get; }
}

public IEnumerable<Point> FindMatching(
    this IEnumerable<Point> points, 
    in Point toMatch) {
    return point.Where(p => p.X == point.X && p.Y == point.Y);
}

编译返回错误:

错误 CS1628:不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“toMatch”。

但是,它不是 ref 或 out 参数。

【问题讨论】:

  • @Servy 我不同意那个重复;它不是问为什么我们不能在这里使用ref/out。它专门询问 C# 7.2 功能,因此 2009 年的答案不可能直接回答这个问题
  • @Servy 我在这里根本不同意你的观点
  • @MarcGravell 您如何看待副本无法回答问题?它没有回答问题怎么办?
  • @Servy 因为这个问题解释了为什么你不能在 lambda 中使用 ref / out。 “当我使用in 时为什么它抱怨ref / out”的答案很简单:因为in 实际上是ref。指向那个答案根本没有回答那个。特别是考虑到编译器消息非常混乱并且在这里没有帮助。我同意它们是密切相关的问题,但它们并不相同。
  • 该问题说明了一条错误消息并且没有提出任何问题。我们只能推断问题是为什么会产生错误,或者为什么会产生 that 错误。作为重复关闭是否正确取决于此。

标签: c#


【解决方案1】:

在幕后,in 一个ref 参数,但具有奇特的语义。与out 相同的是具有花哨语义的ref 参数。编译器消息可能会更清晰,也许 - 这可能是一个很好的bug to log on the Roslyn github。但是:错误是正确的。我同意错误应该明确提及in 参数。

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2011-08-29
    • 2010-11-24
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2011-05-13
    相关资源
    最近更新 更多