【问题标题】:The call is ambiguous between the following methods and properties - Linq and MoreLinq以下方法和属性之间的调用不明确 - Linq 和 MoreLinq
【发布时间】:2023-01-06 22:37:27
【问题描述】:

我这里有一行代码是使用 MoreLinq 编写的:

var maxPage = _pageState?.Value?.Pages?.MaxBy(p => p.Type.Grids["desktop"].ColCount)?.FirstOrDefault();

因为我的解决方案同时使用了 MoreLinq 和 Linq,所以出现以下错误:

以下方法或属性之间的调用不明确:“MoreLinq.MoreEnumerable.DistinctBy<TSource, TKey>(System.Collections.Generic.IEnumerable, System.Func<TSource, TKey>)”和“System.Linq.Enumerable.DistinctBy” <TSource, TKey>(System.Collections.Generic.IEnumerable, System.Func<TSource, TKey>)

我尝试将以下静态扩展添加到我的文档中: MoreLinq.Extensions.AppendExtension 但这会在行尾出现 FirstOrDefault() 并出现以下错误:

“MyClass”不包含“FirstOrDefault”的定义,并且找不到接受“MyClass”类型的第一个参数的可访问扩展方法“FirstOrDefault”(您是否缺少 using 指令或程序集引用?)

我也尝试过删除 MoreLinq,但我得到的结果是不包含 FirstOrDefault 错误的定义。

解决此问题的最佳方法是什么?

【问题讨论】:

  • 您是否仍然需要在同一个源文件中为 MoreLinq 使用 using 指令,或者那是该文件中唯一使用 MoreLinq 的地方吗?我不明白您在文档中添加静态扩展名是什么意思 - 什么文档?你是说源文件吗?这与第一个错误有关还是单独的?目前你的问题还不清楚。
  • @JonSkeet 它在文件中唯一使用 MoreLinq
  • 所以摆脱using MoreLinq;应该没问题。它只会使用Enumerable.MaxBy
  • @JonSkeet 我最终得到了上面提到的关于 firstordefault 的第二个错误
  • 请重写你的问题,因为它是非常目前还不清楚你是如何解决第二个问题的,以及你试图解决第二个问题的意思。 minimal reproducible example 会让一切都更清楚。

标签: c# linq morelinq


【解决方案1】:

MaxByDistinctBy 方法是在.NET 6 中引入的,如果您使用MoreLinq,将会导致上述问题。如果您不需要任何MoreLinq方法,只需将其删除或替换为using System.Linq;(如果您不使用全局/隐式用法)。

如果你仍然需要两者,你可以使用在命名空间之前和之后拆分导入的技巧(尽管它可能有点深奥):

// ... common imports
using MoreLinq.Extensions;

namespace YourNameSpace;
{
    using System.Linq; // default LINQ methods will be prefered
}

【讨论】:

  • 这是一个巧妙的技巧!不知道您可以通过这种方式处理类/方法名称冲突。
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 2012-02-09
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多