在C#中使用通用方法编译错误

时间:2008-12-11 16:18:36

标签: c# generics

编辑:我发现如果我将IMetadataType对象转换为TMetadata类型,我可以编译它。为什么我需要这样做?

编辑#2:“Values”属性是类型为< TMetadata,TData>的.NET字典。

我有这种通用方法:

private void FillMetadata<TMetadata, TData>
    (Metadata<TMetadata, TData> oMetadata) where TMetadata : IMetadataType
{
    IMetadataType o;
    oMetadata.Values.Add(o, (TData)(object)GetValue());
}

我已经剥离了实现以简化它(我实际上使用的是真实对象,而不是此处声明的IMetadataType)。

我的问题是,为什么不编译?编译错误在Add()方法上:“无法从'IMetadataType'转换为'TMetadata'。”那不就是方法中的“where”子句是什么意思吗?

我错过了什么?

2 个答案:

答案 0 :(得分:1)

如何声明.Add方法?

好的,如果.Add方法需要TMetadata,那么你不能指望它采用IMetadataType,因为你说TMetadata是一个IMetadataType,而不是相反。

基本上,对于所有编译器都知道,您可以尝试添加与TMetadata完全不同的东西,并且实现公共接口的事实并不重要。

答案 1 :(得分:1)

where TMetadata : IMetadataType是泛型类型参数TMetadata的约束,表示它应来自IMetadataType。由于oMetadata只知道TMetadataTData作为要使用的类型,因此您必须在方法体中使用它们。这应该有效:

private void FillMetadata<TMetadata, TData>(Metadata<TMetadata, TData> oMetadata) 
    where TMetadata : IMetadataType
{
    TMetadata o;
    oMetadata.Values.Add(o, (TData)(object)GetValue());
}