通用接口

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是做什么的?我正在多个表/类之间转换实体(POCOs等效于Entity Framework)和记录(框架返回的对象)。因此,我想使用它来进行我的类特定转换。

2
@Ram,你需要告诉我们:MyOtherClass在你的方法Gens.ToEntity中应该如何参与?从代码上看一点也不清楚。如果我们知道你的意图,可能会提供更有用的反馈。 - Dan Tao
3个回答

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
非常好的清晰答案。这个类没有真正实现接口。因此会出错。 - ram

2

您必须在泛型类型上声明约束。

public string ToEntity<T>(int record) where T : MyOtherClass

1

在LINQpad中编译OK。也许你的某个类型名为E、R或T?

啊,我明白你想做什么了...你已经定义了一个名为MyOtherClass的类,但你尝试在ToEntity中使用它作为类型参数。你希望如何涉及到MyOtherClass以便用于ToEntity?


2
你粘贴的那段代码本身是有效的,并且可以编译通过。但我不太确定你在示例中想要如何使用MyOtherClass。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接