泛型专业化基础构造函数调用错误的方法

时间:2014-01-30 10:10:05

标签: c# generics

class Base<T1, T2>
{
    protected Base(T1 type1, T2 type2)
    {
    }
}

public class Derived<T> : Base<T, int>
{
    public Derived(T type1, int i)
        : base(type1, i)
    {
    }
}

public class Derived<T> : Base<T, double>
{
    public Derived(T type1, double d)
        :base(type1, d)
    {
    }
}

上面的代码无法编译,因为Visual Studio将第二个派生类型的构造函数的基本调用标记为'MyBase.MyBase(T,int)',我希望这实际上是调用'MyBase.MyBase(T,double) ”。

删除或重命名(即DerivedInt)第一个派生类型允许第二个派生类型正确编译。

我的问题是,为什么会发生这种情况? 我真的不确定导致这种行为的原因是什么?一阶导数类型如何与第二类导致冲突? 除了前面提到的重命名之外,还有一种解决方法吗?或者也许是解决这个问题的更好方法。

干杯

2 个答案:

答案 0 :(得分:1)

在同一名称空间中有两种名为Derived<T>的类型。这是不允许的。

他们有不同的基类这一事实并不意味着他们有不同的名称。

如果你要写typeof(Derived<string>)你会选哪一个?

答案 1 :(得分:0)

嗯,你不能在同一名称空间下有两个同名的类型(即Derived<T>)。这就是重命名其中一个使其有效的原因。