带有 Func 参数的泛型方法,Func 逆变似乎不起作用
Generic method with Func parameter, Func contravariance doesn't seem to work
.NET的Func<T1, T2, TResult>
是这样写的,T1
和T2
是逆变的,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);
}
.NET的Func<T1, T2, TResult>
是这样写的,T1
和T2
是逆变的,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);
}