编辑#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”子句是什么意思吗?
我错过了什么?
答案 0 :(得分:1)
如何声明.Add方法?
好的,如果.Add方法需要TMetadata,那么你不能指望它采用IMetadataType,因为你说TMetadata是一个IMetadataType,而不是相反。
基本上,对于所有编译器都知道,您可以尝试添加与TMetadata完全不同的东西,并且实现公共接口的事实并不重要。
答案 1 :(得分:1)
where TMetadata : IMetadataType
是泛型类型参数TMetadata
的约束,表示它应来自IMetadataType
。由于oMetadata
只知道TMetadata
和TData
作为要使用的类型,因此您必须在方法体中使用它们。这应该有效:
private void FillMetadata<TMetadata, TData>(Metadata<TMetadata, TData> oMetadata)
where TMetadata : IMetadataType
{
TMetadata o;
oMetadata.Values.Add(o, (TData)(object)GetValue());
}