.NET Func<T1, T2, TResult>
的编写是为了T1
和T2
是逆变的,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;
为什么在这种情况下,逆变似乎不起作用?
答案 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);
}