使用Func参数的通用方法,Func逆变似乎不起作用

时间:2017-09-04 14:18:37

标签: c# .net generics variance

.NET Func<T1, T2, TResult>的编写是为了T1T2是逆变的,TResult是协变的。

这意味着:

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

是有效的作业。

现在,我有一个类有这些方法的类:

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

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

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

  

CS0123&#39; object.Equals(object,object)&#39;匹配委托&#39; Func&lt; T,T,bool&gt;&#39;

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

1 个答案:

答案 0 :(得分:4)

反演和一般方差don't work with value types

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

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

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