具有Func参数的泛型方法,Func协方差似乎不起作用

Mar*_*oDS 0 .net c# generics variance

.NET的Func<T1, T2, TResult>是这么写的T1,并T2是逆变和TResult是协变的。

这意味着:

Func<object, object, bool> objectEquals = object.Equals;
Func<MyObject, MyObject, bool> myObjectEquals = objectEquals;
Run Code Online (Sandbox Code Playgroud)

是有效的分配。

现在,我有了一个类,其中包含遵循以下方法的方法:

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

protected abstract void DoSomethingCore<T>(T value, Func<T, T, bool> equals);
Run Code Online (Sandbox Code Playgroud)

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

CS0123'object.Equals(object,object)'没有重载匹配代表'Func <T,T,bool>'

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

Mar*_*oDS 5

总体而言,矛盾和差异不适用于值类型

因此,DoSomething如果要Object.Equals用作的功能,则必须限制该方法仅适用于引用类型Func<T, T, bool>

换句话说,添加where T : class方法签名:

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