我有多个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; }
}
在我的代码中,我试图传递一个实现List<T>
的{{1}},然后使用我在项目中每个部分类中实现的公共属性。
所以,只是为了澄清
IContent
是Linq实体。
我创建了一个部分类并实现了Article
这里是Article.cs的片段:
IContent
非常简单。在我的代码中,我正在尝试这个,但我不知道我哪里出错:
#region IContent Members
public int Id {
get {
return this.ArticleID;
}
set {
this.ArticleID = value;
}
}
如果我的List<IContent> items;
MyDataContext cms = new MyDataContext();
items = cms.GetArticles();
// ERROR: Can not implicitly convert List<Article> to List<IContent>
类实现Article
,为什么我不能传入文章?我不知道将要传递的对象是什么。
我知道我可以通过继承基类来实现这一点,但是使用LinqToSQL不会使用常规对象。
我确信这很简单,我很想念。
答案 0 :(得分:7)
这是因为List类和接口不是协变的。如果你使用的是.NET 4.0和C#4.0,你实际上可以在IEnumerable<>
接口上使用协方差,这对LINQ应用程序来说应该没问题。
答案 1 :(得分:1)
你试过吗
items = cms.GetArticles().Cast<IContent>().ToList();
答案 2 :(得分:1)
这是在C#4.0中要求协方差的经典案例。您只需将List<Article>
更改为IEnumerable<Article>
即可使此工作正常工作:
IEnumerable<IContent> articles = myContext.GetArticles();
如果你坚持使用.NET 3.5,你可以使用Linq Cast<T>()
:
IEnumerable<IContent> articles = myContext.GetArticles().Cast<IContent>();