C#具有inerited类语法错误的泛型类定义

时间:2016-10-13 19:39:55

标签: c# generics inheritance syntax constructor

我已经查看了一些与定义继承基类的泛型类相关的问题,但没有看到这种情况。 (对不起,如果我错过了。)

我的班级是通用班级。它继承了一个具体的基类。基类的构造函数接受参数。

如果我删除了通用规范,我可以使类定义工作,如下所示:

public class DataItemType : DataItem 
{
    public DataItemType(string sNameArg, string sAddressArg, bool nWriteAllowedArg)
        : base(sNameArg, sAddressArg, nWriteAllowedArg)
    {
    }
}

以下是通用规范的定义。

public class DataItemType<TValue> : DataItem where TValue : struct
{
    public DataItemType<TValue>(string sNameArg, string sAddressArg, bool nWriteAllowedArg)
        : base(sNameArg, sAddressArg, nWriteAllowedArg)
    {
    }
}

在类定义行中,IDE抱怨没有给出对应于基类所需的形式参数sNameArg的参数。 IDE提供了创建构造函数的功能。但是当它发生时,语法失败。 (插入的构造函数似乎也没有任何意义,因为它的价值。)

1 个答案:

答案 0 :(得分:4)

只需从泛型类中的构造函数行中删除<TValue>

public class DataItem
{
    public DataItem(string sNameArg, string sAddressArg, bool nWriteAllowedArg) {}
}

public class DataItemType<TValue> : DataItem where TValue : struct
{
    public DataItemType(string sNameArg, string sAddressArg, bool nWriteAllowedArg) 
        : base(sNameArg, sAddressArg, nWriteAllowedArg)
    {
    }
}

泛型类中TValue的使用是针对传递给函数或返回值的参数。但不是构造函数。

在功能之后添加<>会让您感到困惑。在那里添加意味着函数本身是通用的,并且可以接收不同的类型。

例如,如果您想在构造函数中接收来自泛型类型的参数:

public class DataItemType<TValue> : DataItem where TValue : struct
{
    public DataItemType(TValue someParameter, string sNameArg, string sAddressArg, bool nWriteAllowedArg)
        : base(sNameArg, sAddressArg, nWriteAllowedArg)
    {
    }

    //Note that as in the constructor you can use this generic type for the function
    public void SomeFunction(TValue value) { }

    //Or define a new generic type which will be only in the scope of this function
    public void SomeOtherFunction<TValue2>(TValue2 value2) { }
}