类型参数声明必须是标识符

时间:2014-02-13 13:07:12

标签: c#

interface IRepository<TEntity,Tid> where TEntity :class 
{
    int Insert(TEntity entity);
    int Delete(TEntity entity);
    TEntity GetById(Tid id);
    TEntity GetByFilters(TEntity entity);
    int Update(TEntity entity);        
}

尝试实施

internal class Repository<XYZClass, string> : IRepository<XYZCLass, string> 
{    
    //...All interface methods    
}

获得以下错误:

  

类型参数声明必须是标识符而不是类型

任何建议..

4 个答案:

答案 0 :(得分:1)

如果您希望Repository是非通用的,则需要指定两种类型:

internal class Repository : IRepository<XYZClass, string> { ... }

如果您希望Repository是通用的,但指定TIdstring则可以使用

internal class Repository<TEntity> : IRepository<TEntity, string> where TEntity : class
{    
    //...All interface methods    
}

string是一种类型,而不是泛型类型参数。

答案 1 :(得分:1)

声明应仅包含那些对使用该类的人通用的类型参数。

换句话说,如果您实现IRepository将TEntity参数设置为XYZClass并将TID参数设置为字符串(即具体的类定义),那么您应该具有:

internal class Repository : IRepository<XYZCLass, string> 
{    
    //...All interface methods    
}

如果您希望定义一种类型并保留另一种类型,那么:

internal class Repository<TEntity> : IRepository<TEntity, string> 
{    
    //...All interface methods    
}

否则,两种类型仍应保持打开状态:

internal class Repository<TEntity,TID> : IRepository<TEntity, TID> 
{    
    //...All interface methods    
}

答案 2 :(得分:1)

也许你想要一个基类约束?

internal class Repository<TYourEntity> : IRepository<TYourEntity, string>
    where TYourEntity : XyzClass
{    
    //...All interface methods    
}

请注意,此约束意味着满足接口约束(引用类型约束TEntity : class)。


为了完整起见,对你的意思的其他“合法”解释(也已在其他答案中)是:

// don't constrain generic parameter, just name it TXyz (TXyz is "declared" here)

internal class Repository<TXyz> : IRepository<TXyz, string>
    where TXyz : class
{    
    //...All interface methods    
}

// make class non-generic (the type XyzClass exists and is declared elsewhere)

internal class Repository : IRepository<XyzClass, string>
{    
    //...All interface methods    
}

答案 3 :(得分:0)

此存储库不是通用的(它是使用具体类参数化的存储库接口的实现):

internal class Repository : IRepository<XYZCLass, string>