通用虚方法 - 忽略覆盖方法

时间:2014-05-01 16:22:29

标签: c# generics mono

我正在尝试创建一个通用的虚方法,但由于某种原因,忽略了覆盖。相同的非泛型实现按预期工作

以下是相关代码的基本要点:

编辑:事实证明这可能比我预想的更加模糊 - 我使用的是Unity / Mono,它不能在那里工作,但它在VS中工作

编辑:添加内容以使其成为完整的程序

public interface IController
{
    void Set<T>() where T : class, IController;
    void Set(Type t);
}

public abstract class Controller : IController
{
    public IController parent;
    public virtual void Set<T>() where T : class, IController
    {
        Console.WriteLine(GetType());
        parent.Set<T>();
    }
    public virtual void Set(Type t)
    {
        Console.WriteLine(GetType());
        parent.Set(t);
    }
}

public class ControllerGroup : Controller
{
    public override void Set<T>()
    {
        Console.WriteLine("Success!");
    }
    public override void Set(Type t)
    {
        Console.WriteLine("Success!");
    }
}

static class Program
{
    static void Main()
    {
        IController obj = new ControllerGroup();
        obj.Set<Controller>();
    }
}

编辑/澄清:输出应该是“成功!”但它是“ControllerGroup”,当然是空引用异常

我通过IController接口访问此方法,该接口声明了这两种方法。不确定是否会影响任何事情

无论如何,问题是泛型方法的覆盖被忽略了。控制台输出显示对象类型确实是ControllerGroup,但这似乎没有效果。

1 个答案:

答案 0 :(得分:0)

发现问题。似乎在Unity / Mono中,如果接口具有泛型方法,则“callvirt”操作码不能正确遍历层次结构,只是采用它找到的第一个方法。所以这样做解决了这个问题:

void IController.Set<T>()
{
    Set<T>();
}

因为在该方法中,this是一个类而不是一个接口,所以该bug是可以解决的。