有没有办法通过替换部分或全部类型参数来覆盖虚拟泛型方法?

时间:2011-04-19 18:47:16

标签: c#

有没有办法通过用实际类型参数替换部分或全部类型参数来覆盖虚拟泛型方法?

class A1
{
    public virtual void Generic<T, U>(T t, U u) { }
}

class A2 : A1
{
    public override void Generic<T,int>(T t, int u) { } //error
}

感谢名单

3 个答案:

答案 0 :(得分:7)

尝试将通用参数移动到类。

    class A1<T,U>
    {
        public virtual void Generic(T t, U u) { }
    }

    class A2<T> : A1<T , int>
    {      
        public override void  Generic(T t, int u) { }
    }

答案 1 :(得分:5)

你的例子有点......通用。我确信这些类具有某种意义,因此以下架构是有道理的:

class A1<U> 
{
    public virtual void Generic<T>(T t, U u) { }
}

class A2 : A1<int>
{
    public override void Generic<T>(T t, int u) { } // no error
}

答案 2 :(得分:1)

正如其他答案所示,如果函数的类型参数对应于类的类型参数,则可以这样做。

如果它们不对应,则不可能,因为您的示例会违反类型安全性。请考虑以下示例:

A1 a = new A2();
...
a.Generic<string, string>("", "");

这是一个合法的电话,因为A1提供Generic<T, U>(T t, U u)。但是在运行时,我们遇到了一个问题,因为a的动态类型是A2,而A2中的版本只支持int作为第二个参数。