在c#中分配给泛型委托时遇到麻烦

本文关键字:遇到 麻烦 泛型 分配 | 更新日期: 2023-09-27 18:01:42

我的问题如下:

public abstract class A {}
public class B : A {
    public static IList<B> MyMethod(){ return new List<B>();}
}
public delegate IList<T> MyDelegate<T>() where T : A;

...
public static void CalledMethod<T>() where T : A{
    MyDelegate<T> del = B.MyMethod;  // This doesn't work
}

谁能解释一下让这个工作的最好方法?

谢谢你的帮助。

编辑修复示例

在c#中分配给泛型委托时遇到麻烦

为什么这行不通

public class C: A {}
CalledMethod<C>();

这意味着del将是MyDelegate<C>类型,这与B.MyMethod不工作,因为C不是B

你需要告诉编译器MyMethod是什么:

MyDelegate<T> del = B.MyMethod;

这不能按你编码的方式完成,因为你正试图使MyDelegate协变,但是返回的IList<T>接口不支持方差,因为它不能。

IList<B>IList<A>都不支持方差。这样想,List<SalariedEmployee>不能完全像List<Employee>一样处理,因为这会使您的Add(new HourlyEmployee)不正确。