c# - 通用虚拟方法 - 忽略重写方法

标签 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 接口(interface)访问此方法,该接口(interface)声明了这两种方法。不确定这是否会影响任何东西

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

最佳答案

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

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

因为在该方法中,this 是一个类而不是接口(interface),所以该错误已解决。

关于c# - 通用虚拟方法 - 忽略重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411865/

相关文章:

c# - 如何提高 Mono 中 winforms 应用程序的性能?

c# - Windows 窗体设计器和通用窗体

generics - Swift 泛型和 CMutableVoidPointer

c# - .NET Core 3.1 - Linux 容器 : Clean Shutdown 中的 Worker 服务

c# - 如何在此处应用 C# 中的 "template"或 "skeleton"代码?

c# - 方法和约束的唯一性

linux - xbuild:任务 GenerateResource FAILED,认为不存在的文件比源文件更新

macos - 在 OS X 上从单声道打印

c# - 如何在 C# 中有效地设置/获取位模式

c# - 我应该为我的 GUI 应用程序使用异步 "all the way"吗?