0

我有一个类有一个SearchResults需要的属性 (),我的搜索类之一在List<T>哪里T取决于一个条件

public class SearchGeneralResponse : ActionResponse
{
    public IList<ISearchRecord> SearchResults { get; set; }


    public SearchGeneralResponse(MbsObjectType searchType)
    {
        if(searchType == MbsObjectType.SourceRepo) SearchResults = new List<SearchRecord>();
        if(searchType == MbsObjectType.BuildConfiguration) SearchResults = new List<SearchRecordBuild>();
    }
}

我可以投新SearchRecordISearchRecord。但是当我用列表做的时候

this.SearchResults = new List<SearchRecord>();

我收到此错误:

无法将类型 System.Collections.Generic.List 'SearchRecord' 隐式转换为 System.Collections.Generic.List 'ISearchRecord'

这是我的界面:

public interface ISearchRecord 
{

}

以及派生类之一:

public class SearchRecord : ISearchRecord
{
    public string Name { get; set; }

    public string Summary { get; set; }

}

如何List<T>根据特定条件创建可以初始化为类列表的属性?

4

2 回答 2

2

向您的初始化程序添加强制转换:

this.SearchResults = new List<SearchRecord>().Cast<ISearchRecord>().ToList();
于 2019-08-01T17:20:43.120 回答
2

泛型提供编译时类型安全,但在这种情况下,您试图告诉编译器它应该相信您不会出现运行时问题。它的工作是不信任你:)

考虑如果允许此分配并且您这样做会发生什么:

IList<ISearchRecord> results;             // results is of type IList<ISearchRecord>
results = new List<SearchRecord>();       // but it holds a value of type List<SearchRecord>
results.Add(new SomeOtherSearchRecord()); // ERROR

由于该属性SearchResults是 type IList<ISearchRecord>,因此使用该属性的任何代码都可以将的任何实现分配给ISearchRecord该列表的元素。所以它需要始终ISearchRecord而不是更具体的实现类型。

退后一步,考虑一下你的代码需要做什么的语义。 应该 SearchResults支持ISearchRecord? 如果它总是要被分配,SearchRecord那么让它成为特定的类型:

public IList<SearchRecord> SearchResults { get; set; }

或者,如果它需要是一个列表ISearchRecord(因此它可以支持其他实现),那么您必须创建该类型的列表:

this.SearchResults = new List<ISearchRecord>();

编辑:另外,如果您new List<>()只是一个人为的示例,并且您实际上是从其他地方获取列表,您仍然需要创建一个新列表。幸运的是,该列表中的引用仍然可以指向相同的对象,但列表本身需要是正确的编译时类型。您可以通过以下方式实现:

this.SearchResults = someOtherList.Cast<ISearchRecord>().ToList();

这将创建一个正确类型的新列表对象,其中包含与someOtherList.

于 2019-08-01T17:21:33.647 回答