C#没有选择具有默认值的正确重载

本文关键字:重载 默认值 有选择 | 更新日期: 2023-09-27 18:20:00

我在C#中使用FluentValidation框架,它有以下两个方法重载:

IRuleBuilder<TObject, TProperty>
    IRuleBuilderOptions<TObject, TProperty> Equal(TProperty toCompare, [IEqualityComparer comparer = null])
    IRuleBuilderOptions<TObject, TProperty> Equal(Expression<Func<TObject,TProperty>> expression, [IEqualityComparer comparer = null])

基本上,其中一个重载允许您传入实际的TProperty进行比较,另一个重载则允许您执行从TObject返回TProperty的lambda。

当我做以下事情时,它是有效的:

RuleFor(r => r.First).Equals(r => r.Second);

在这种情况下,它得到了正确的过载。当我尝试为比较器传递一个值时,它默认为另一个重载:

RuleFor(r => r.First).Equals(r => r.Second, new ObjectComparer()); // will not compile

这不会编译,因为它认为我正在尝试使用第一个重载。

有没有办法强迫C#使用第二个重载?

编辑:

ObjectComparer是一个IEqualityComparer:

public class ObjectComparer : IEqualityComparer<MyClass>
{
     // ...
}

C#没有选择具有默认值的正确重载

IEqualityComparer<T>没有继承IEqualityComparer,因此您的类没有实现IEqualityComparer!同时执行这两项。