我有以下类和接口:
public interface IFieldFiller
{
string Content { get; set; }
Boolean Nullable { get; set; }
string Name { get; set; }
}
和
[DataContract]
public class FieldFiller : IFieldFiller
{
[DataMember]
public string Content { get; set; }
[DataMember]
public Boolean Nullable { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public StoredProcedure StoredProcedure { get; set; }
[DataMember]
public string NameSpace { get; set; }
}
然后我使用以下Linq语句来构建这些对象的列表:
Fields = temp.merged_fields.Select(f => new FieldFiller { Name = f.name, NameSpace = f.@namespace, StoredProcedure = new StoredProcedure { Name = f.sproc1.name, Parameters = f.field_params.ToDictionary(p => p.sprocParam.name, p=>p.value)}}).ToList()
我不断收到以下异常:
Error 1 Cannot implicitly convert type 'System.Collections.Generic.List<Services.Data.EmailTemplateAccess.Contracts.FieldFiller>' to 'System.Collections.Generic.List<Services.Data.EmailTemplateAccess.Contracts.IFieldFiller>'
当FieldFiller实现IFieldFiller时,我不明白为什么会出现此错误。我已经验证它们位于正确的命名空间中。任何帮助将不胜感激。
答案 0 :(得分:2)
FieldFiller
也是IFieldFiller
,但List<FieldFiller>
不是List<IFieldFiller>
,您可以相应地进行投射:
Fields = temp.merged_fields
.Select(f => (IFieldFiller)new FieldFiller { Name = f.name, NameSpace = f.@namespace, StoredProcedure = new StoredProcedure { Name = f.sproc1.name, Parameters = f.field_params.ToDictionary(p => p.sprocParam.name, p=>p.value)}})
.ToList()
或者,使用.NET 4,您可以使用它(参见:Covariance and Contravariance):
...
.Select(f => new FieldFiller { ... })
.ToList<IFieldFiller>();
为什么不安全: