12

Unity3dでC#を使用して数年になりますが、.NETプログラミングを始めたばかりです。エラーが発生します:

System.Collections.Generic.IEnumerable<URL>タイプ' 'を''に暗黙的に変換することはできませんSystem.Collections.Generic.List<URL>。明示的な変換が存在します(キャストがありませんか?)

これが私のコードです:

namespace TestBrowserHistory
{
    public class Test1
    {
        public Test1()
        {

        }
          static void Main()
    {
        InternetExplorer myClass = new InternetExplorer();
        List<URL> calledList = myClass.GetHistory();
        Console.WriteLine("Hello!");
        Console.WriteLine(calledList[1]);
        Console.ReadLine();
    }
    }
}

public class InternetExplorer
{
    // List of URL objects
    public List<URL> URLs { get; set; }
    public IEnumerable<URL> GetHistory()
    {
        // Initiate main object
        UrlHistoryWrapperClass urlhistory = new UrlHistoryWrapperClass();

        // Enumerate URLs in History
        UrlHistoryWrapperClass.STATURLEnumerator enumerator =
                                           urlhistory.GetEnumerator();

        // Iterate through the enumeration
        while (enumerator.MoveNext())
        {
            // Obtain URL and Title
            string url = enumerator.Current.URL.Replace('\'', ' ');
            // In the title, eliminate single quotes to avoid confusion
            string title = string.IsNullOrEmpty(enumerator.Current.Title)
                      ? enumerator.Current.Title.Replace('\'', ' ') : "";

            // Create new entry
            URL U = new URL(url, title, "Internet Explorer");

            // Add entry to list
            URLs.Add(U);
        }

        // Optional
        enumerator.Reset();

        // Clear URL History
        urlhistory.ClearHistory();

        return URLs;
    }

}

助けてくれてありがとう!

4

8 に答える 8

19

myClass.GetHistory();が返されるためIEnumerable<URL>、このエラーが発生します。List<URL>これは、実際にList<URL>は実行時ですが、コンパイル時とは異なります。メソッドのシグネチャを変更して返すようList<URL>にします。すでにそうしているからです。

public List<URL> GetHistory()

その他の回避策は、メソッド呼び出しの結果をにキャストすることです。List<URL>

List<URL> calledList = (List<URL>)myClass.GetHistory();

または、結果から新しいリストを作成します

List<URL> calledList = new List<URL>(myClass.GetHistory());

リスト機能が必要ない場合はcalledList、IEnumerableとして定義できます。

var calledList = myClass.GetHistory();
于 2012-06-26T12:11:36.587 に答える
3

メソッドの定義はGetHistoryIEnumerableを返し、それをIListに割り当てます。定義または使用法を変更してください。

コレクションを変更する必要がない場合は、GetHistoryの定義をIEnumerableに変更します。

于 2012-06-26T12:08:50.600 に答える
3

リストはIEnumerableですが、その逆は当てはまりません。

リスト操作が必要な場合は、IEnumerableではなくIList<>を返すようにメソッドを変更する必要があります。または、戻り値をリストではなくIEnumerable変数に割り当てる必要があります。これにより、(さらに操作することなく)IEnumerableメソッドに制限されます(foreachを実行して、.FirstなどのLINQを使用できますが、特定の位置で参照することはできません)。これは、最終的に必要なものには十分かもしれません。

于 2012-06-26T12:13:09.480 に答える
1

動作させるには、GetHistory()メソッドのreturnタイプをに変更する必要がありますList<URL>

リストをIEnumerableに型キャストすることはできますが、その逆はできません。コンパイラは、GetHistoryがIEnumerableを返すことを通知され、リストであってもそれ認識しません。

于 2012-06-26T12:10:47.133 に答える
1

これがエラーです

List<URL> calledList = myClass.GetHistory(); 

GetHistoryメソッドが戻るのでIEnumerable<URL>

public IEnumerable<URL> GetHistory()

編集:

解決策GetHistory():メソッドの戻り値をに変更するだけですIList<T>

于 2012-06-26T12:08:53.000 に答える
1

他の人が言ったことの代わりに、あなたは単に次のことができます:

GetHistory();
List<URL> calledList = URLs;

とにかくその副作用としてをGetHistory変更するので、それから結果を返す目的はほとんどありません。URLsそれに加えて、明示的にGetHistory呼び出す必要があるかどうかを検討するかもしれません-おそらく、ゲッターが最初に呼び出されたときに同等のコードを暗黙的に実行する必要がありますか?URLs

また、なぜ使っていないのですforeachか?

于 2012-06-26T12:18:37.217 に答える
1

Linq lamdaが提供するtolist()を使用して、IEnumerableからListに変換できます。

using System.Linq;

List<URL> calledList = myClass.GetHistory().ToList();
于 2018-10-23T04:45:55.780 に答える
0

追加するだけ

yield return U;

whileの終わりをブロックして削除します

 return URLs;

その後の機能はこんな感じ

public IEnumerable<URL> GetHistory()
{
    // Initiate main object
    UrlHistoryWrapperClass urlhistory = new UrlHistoryWrapperClass();

    // Enumerate URLs in History
    UrlHistoryWrapperClass.STATURLEnumerator enumerator =
                                       urlhistory.GetEnumerator();

    // Iterate through the enumeration
    while (enumerator.MoveNext())
    {
        // Obtain URL and Title
        string url = enumerator.Current.URL.Replace('\'', ' ');
        // In the title, eliminate single quotes to avoid confusion
        string title = string.IsNullOrEmpty(enumerator.Current.Title)
                  ? enumerator.Current.Title.Replace('\'', ' ') : "";

        // Create new entry
        URL U = new URL(url, title, "Internet Explorer");

        // Add entry to list
        URLs.Add(U);
        yield return U;
    }

    // Optional
    enumerator.Reset();

    // Clear URL History
    urlhistory.ClearHistory();


}
于 2012-06-26T12:17:56.827 に答える