6

这是我的代码

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)和记录(框架返回的对象)之间进行转换。所以我想用它来做我的类特定转换

4

3 回答 3

9

您的接口有一个通用ToEntity<T>方法,您在实现类Gens中将其设为非通用方法ToEntity<MyOtherClass>. (泛型方法可以采用任何类型参数,可能会对T.GensToEntity MyOtherClass

在您的代码示例中,尚不清楚您的Gens类如何尝试使用该MyOtherClass类型;它当然不涉及 的逻辑ToEntity。我们需要更多信息才能进一步指导您。

为了说明,以下是您当前对ITranslator<E, R>接口的定义,用简单的英语:

“我提供了一种将任何类型记录转换为类型R实体的机制E这种机制依赖于任何用户指定的类型 T。”

Gens另一方面,你的类,它当前的设计方式,“实现”了上面的接口,如下所示:

“我可以将整数转换为字符串。我提供了允许用户指定一种类型来控制如何执行这种转换的错觉,但实际上没有类型的选择。MyOtherClass以某种方式涉及到类;这就是我所能说的。 "

从这两个描述中可以清楚地看出,Gens该类并没有真正做到ITranslator<E, R>接口所保证的。即,它不愿意为其ToEntity方法接受用户指定的类型。这就是为什么这段代码不会为你编译的原因。

于 2010-01-29T23:43:00.440 回答
2

您必须声明对泛型类型的约束。

public string ToEntity<T>(int record) where T : MyOtherClass
于 2010-01-29T23:43:08.453 回答
1

这在 LINQpad 中对我来说可以编译。也许你在某个地方有一个名为 E、R 或 T 的类型?

啊,我明白了您要做什么...您已将 MyOtherClass 定义为某处的类,但您正尝试将其用作 ToEntity 中的类型参数。您究竟希望 MyOtherClass 如何参与 ToEntity?

于 2010-01-29T23:42:06.607 回答