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>'
为什么在这种情况下,逆向似乎不起作用?
总体而言,矛盾和差异不适用于值类型。
因此,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)
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |