带有 Func 参数的泛型方法,Func 逆变似乎不起作用

Generic method with Func parameter, Func contravariance doesn't seem to work

.NET的Func<T1, T2, TResult>是这样写的,T1T2是逆变的,TResult是协变的。

这意味着:

Func<object, object, bool> objectEquals = object.Equals;
Func<MyObject, MyObject, bool> myObjectEquals = objectEquals;

是一个有效的分配。

现在,我有一个 class 方法如下:

public void DoSomething<T>(T value)
{
    DoSomethingCore(T, Object.Equals);
}

protected abstract void DoSomethingCore<T>(T value, Func<T, T, bool> equals);

代码无法编译,出现以下错误:

CS0123 No overload for 'object.Equals(object, object)' matches delegate 'Func<T, T, bool>'

为什么逆变在这种情况下似乎不起作用?

逆变和一般方差,don't work with value types

因此,如果您想将 Object.Equals 用作 Func<T, T, bool> 的函数,则必须限制 DoSomething 方法仅适用于引用类型。

也就是说,在方法签名中添加where T : class

public void DoSomething<T>(T value) where T : class
{
    DoSomethingCore(T, Object.Equals);
}