这是我的代码
public interface ITranslator<E, R>
{
E ToEntity<T>(R record);
}
class Gens : ITranslator<string, int>
{
#region ITranslator<string,int> Members
public string ToEntity<MyOtherClass>(int record)
{
return record.ToString();
}
#endregion
}
编译时,我收到错误Type parameter declaration must be an identifier not a type
为什么我不能拥有ToEntity<MyOtherClass>
但只能拥有ToEntity<T>
??
编辑:MyOtherClass
在做什么?我在多个表/类之间转换实体(相当于实体框架的POCO)和记录(框架返回的对象)。所以我想用它来进行我的类特定转换
答案 0 :(得分:9)
您的界面有一个通用的ToEntity<T>
方法,您在实现类Gens
中将其作为ToEntity<MyOtherClass>
的非通用方法。T
。 (泛型方法可以使用任何类型参数,可能在Gens
上给出某些约束。您的ToEntity
类正在尝试为MyOtherClass
提供定义仅适用于类型参数Gens
,这违背了泛型的目的。)
在您的代码示例中,不清楚您的MyOtherClass
类是如何尝试使用ToEntity
类型的;它当然没有参与ITranslator<E, R>
的逻辑。我们需要更多信息才能为您提供更多指导。
为了说明,这是您当前对R
界面的定义所提供的内容,用简单的英语:
“我提供了翻译机制 任何类型
E
的记录到实体中 类型为T
,此机制为 取决于任何用户指定的类型Gens
强>“。
另一方面,你的MyOtherClass
课程,它的设计方式,“实现”上述界面,如下所示:
“我可以将整数转换为字符串。 我提供允许的幻觉 用户指定要控制的类型 如何执行此翻译,但是 实际上没有类型的选择。 涉及
Gens
课程 不知何故;这就是我能说的全部。“
从这两个描述中可以清楚地看出ITranslator<E, R>
类并没有真正做ToEntity
接口保证。也就是说,它不愿意为其{{1}}方法接受用户指定的类型。这就是为什么这段代码不会为你编译的原因。
答案 1 :(得分:2)
您必须对泛型类型声明约束。
public string ToEntity<T>(int record) where T : MyOtherClass
答案 2 :(得分:1)
在LINQpad中为我编译好。也许你在某个地方有一个名为E,R或T的类型?
啊,我看到你要做的事情......你把MyOtherClass定义为一个类,但是你试图将它作为ToEntity中的一个类型参数。您希望MyOtherClass如何参与ToEntity?