gpt4 book ai didi

c# - .NET对不同参数重载方法的误解(Call Ambiguous)

转载 作者:可可西里 更新时间:2023-11-01 07:51:11 25 4
gpt4 key购买 nike

我有一些重载方法的问题,我会尝试给出一个简单的实现。

所以这是一个包含以下两个方法的类:

public class MyRepo<TEntity>
{
public List<TEntity> GetData(Expression<Func<TEntity, Boolean>> expression)
{
//Do something
}

public List<TEntity> GetData(Func<TEntity,Boolean> whereClause)
{
//Do something
}
}

这是我的实体:

public class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
}

这里是我使用它的地方:

{
...
MyRepo<MyEntity> myRepo = new MyRepo<MyEntity>();
myRepo.GetData(x => x.Id == 1); // The ambiguity point
...
}

问题是我只有两个名称相同但参数不同的方法,因此,基于 OOP 多态性概念,我希望 .NET 能够理解我想要的方法。

但显然 .NET 无法理解它,因为 Expression<Func<TEntity, Boolean>> 的实例形式和 Func<TEntity, Boolean>是相同的,这是 .NET 引发的编译时错误:

The call is ambiguous between the following methods or properties:
'Program.MyRepo<TEntity>.GetData(Expression<Func<TEntity, bool>>)' and
'Program.MyRepo<TEntity>.GetData(Func<TEntity, bool>)'

问题是:我怎样才能避免这个编译时错误?

我的偏好是不要触摸我打电话的方式 GetData()在这一行:

myRepo.GetData(x => x.Id == 1);

最佳答案

Lambda 表达式 (x=> x.Id==1) 本身没有类型 - 当类型是已知。 IE。 Why must a lambda expression be cast when supplied as a plain Delegate parameter处理不同委托(delegate)类型之间的类似问题。

在您的情况下,潜在候选方法表明变体和编译器都无法做出选择。

如果你真的必须保持相同的名字,那么调用者必须自己指定类型:

 myRepo.GetData((Expression<Func<TEntity, Boolean>>)(x => x.Id == 1));
myRepo.GetData((Func<TEntity, Boolean>)(x => x.Id == 2));

我认为您不能将扩展方法用于替代方法之一,因为搜索将在类级别停止。所以真正拥有不同名称的方法是唯一真正的选择(如果你需要两者)。考虑一下 Expression 版本是否足够。或者,您可以将它们分成不同的类(类似于 IQueryable 的扩展如何采用 ExpressionIEnumerable 上的类似方法采用 Func(参见 QueryableExtenasions ) .

关于c# - .NET对不同参数重载方法的误解(Call Ambiguous),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54001248/

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