无法将Item转换为其接口异常

时间:2013-08-12 23:26:12

标签: c# exception interface

我有以下类和接口:

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时,我不明白为什么会出现此错误。我已经验证它们位于正确的命名空间中。任何帮助将不胜感激。

1 个答案:

答案 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>();

为什么不安全: