传递实现相同界面的不同内容

Arm*_*est 3 c# polymorphism interface covariance linq-to-sql

我有多个Linq2Sql类,如"Article""NewsItem""Product".

他们都有一个标题,他们都有一个唯一的ID,他们都有一个摘要.

所以,我创建了一个名为的接口 IContent

public interface IContent {
    int Id { get; set; }
    String Title { get; set; }
    String Summary { get; set; }
    String HyperLink { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我试图传递一个List<T>实现IContent,然后使用我在项目中的每个部分类中实现的那些公共属性.

所以,只是澄清一下

Article是Linq实体.我创建了一个部分类并实现了IContent以下是Article.cs的片段:

   #region IContent Members

    public int Id {
        get {
            return this.ArticleID;
        }
        set {
            this.ArticleID = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

很简单.在我的代码中,我正在尝试这个,但我不知道我哪里出错了:

List<IContent> items;

MyDataContext cms = new MyDataContext();

items = cms.GetArticles();  
// ERROR: Can not implicitly convert List<Article> to List<IContent>
Run Code Online (Sandbox Code Playgroud)

如果我的Article班级实施IContent为什么我不能通过文章?我不知道将要传递的对象是什么.

我知道我可以通过继承基类来实现这一点,但是使用LinqToSQL不会使用常规对象.

我确信这很简单,我很想念.

Luc*_*ero 7

这是因为List类和接口不是协变的.如果您使用的是.NET 4.0和C#4.0,则实际上可以在IEnumerable<>接口上使用协方差,这对LINQ应用程序来说应该没问题.

有一个很好的常见问题解答涵盖这些主题.