1

コード例:

public Interface IArticle
{
    int cid{get;set;}
    string Name{get;set;}
    string Content{get;set;}
    ...
}
public Class Article:IArticle
{
   public int cid{get;set;}
   public string Name{get;set;}
   public string Content{get;set;}
   public string Extension{get;set;}
    ...
}

/*
ArticleBiz.GetArticles(int cid) is select some items from database,return type:List<Article>
*/
List<IArticle> articleList=ArticleBiz.GetArticles(2).FindAll(p=>p.cid==cid)

例外:

Error   1   Cannot implicitly convert type 
    'System.Collections.Generic.List<Zm.Models.Article>'
to
    'System.Collections.Generic.IList<Zm.Models.IArticle>'.
An explicit conversion exists (are you missing a cast?)

List<IArticle>質問: メソッドで戻り値の型を変更したくありませんGetArticles(..)List<Article>コードを変更してList<IArticle>正常に変換するにはどうすればよいですか?

4

6 に答える 6

2

ここに私のアプローチがあります:

IList<IArticle> articles = new List<Article>().Cast<IArticle>().ToList();
于 2012-09-22T09:32:04.170 に答える
1

LINQを使用できます:

List<IArticle> articleList = ArticleBiz
    .GetArticles(2)
    .Where(p => p.cid == cid)
    .Cast<IArticle>()
    .ToList();
于 2012-09-22T09:25:25.130 に答える
1

どうですか

List<IArticle> articleList = ArticleBiz.GetArticles(2).Where(p => p.cid == cid) 
                                       .Select(x => (IArticle)x).ToList();
于 2012-09-22T09:26:47.153 に答える
1

独自の暗黙のキャストを作成できます。

public static implicit operator IArticle(Article article)
{
    return article;
}

別の解決策は、明示的なキャスト演算子を記述することです

///No need for an explicit cast though.
public static explicit operator IArticle(Article article)
{
    return (IArticle)article;
}

しかし、IArticle オブジェクトではなく、データベースから記事を返す理由を教えていただけますか?

于 2012-09-22T09:29:59.590 に答える
0

リストへのリストの割り当てが機能しない理由は、次のことができるためです。

class CrazyArticle : IArticle { ... }

List<Article> articles = ...
List<IArticle> iarticles = articles; // this is not actually legal

iarticles.Add(new CrazyArticle());
// now either things should crash because we tried to add CrazyArticle to a List<Article>,
// or we have violated type safety because the List<Article> has a CrazyArticle in it!

ここには少なくとも 2 つのオプションがあります。

(1) LINQ Cast<> 演算子を使用して、タイプ IArticle の新しいリストを作成できます。

var iarticles = articles.Cast<IArticle>().ToList();

(2) IEnumerable を返すように変更できます。

// this is legal because IEnumerable<T> is declared as IEnumerable<out T>
IEnumerable<IArticle> iarticles = articles;
于 2012-09-22T14:08:59.503 に答える
0

Select がお役に立てば幸いです。

List<IArticle> articleList = ArticleBiz.GetArticles(2).FindAll(p => p.cid == cid)
                                       .Select(x => x as IArticle).ToList()
于 2012-09-22T09:19:34.810 に答える