0

新しいクラスに次のコードがあります。

Object[] temp_arr = new Object[5];
                temp_arr[0] = csFiles;
                temp_arr[1] = mainUrl;
                temp_arr[2] = levels;
                temp_arr[3] = currentCrawlingSite;
                temp_arr[4] = sitesToCrawl;

変数 csFiles と currentCrawlingSite はどちらも List<string> です。

次に、下部で次のことを行いました。

public class WebCrawlerProgressEventHandler : EventArgs
{
    public List<string> csFiles { get; set; }
    public string mainUrl { get; set; }
    public int levels { get; set; }
    public List<string> currentCrawlingSite { get; set; }
}

protected void OnProgressEvent( Object[] some_params)
{
    if (ProgressEvent != null)
        ProgressEvent(this,
                      new WebCrawlerProgressEventHandler()
                      {
                          csFiles = some_params[0],
                          mainUrl = some_params[1],
                          levels = some_params[2],
                          currentCrawlingSite = some_params[3]
                      });
}

今、各行の新しいWebCrawlerProgressEventHandler()同じエラー内のすべての行でエラーが発生しています:

エラー 2 型 'object' を 'System.Collections.Generic.List' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

public List<string> currentCrawlingSite { get; set; }しかし、行:と行: を削除すると、currentCrawlingSite = some_params[3]エラーは発生しません。

理解できません。csFilescurrentCrawlingSiteはどちらもList<string>型変数です。を追加するとcurrentCrawlingSite、エラーが発生するのはなぜですか?

4

5 に答える 5

2

コンパイラはObject-array の最初と 4 番目の要素がたまたまList<string>.

それに応じてキャストする必要があります。

csFiles = (List<String>)some_params[0]

Object可能であれば、単純な配列の代わりに適切な型を使用してデータを渡します。

于 2013-03-28T07:58:15.850 に答える
1

ここでのポイントはOnProgressEvent、配列を送信しているため、その「原因」行で型変数を割り当てようとしているということです。これにより、キャスト操作が暗黙的に呼び出されますObject。問題を解決するには、実際に明示的なキャストを行う必要があります。ObjectList<string>

C# の新しい優先構文は次のとおりです。

csFiles = some_params[0] as List<String>;
于 2013-03-28T07:58:49.833 に答える
0

割り当てているデータが List<string> であると仮定すると、次のタイプにキャストする必要があります。

new WebCrawlerProgressEventHandler()
{
    csFiles = (List<string>)some_params[0],
    mainUrl = some_params[1],
    levels = some_params[2],
    currentCrawlingSite = (List<string>)some_params[3]
});
于 2013-03-28T07:58:30.977 に答える
0

強力なタイピング保護です。List<string>コンパイル時に異なる型を混同しないように、オブジェクトを明示的にキャストする必要があります

csFiles = (List<string>)some_params[0]

mainUrl = some_params[1]すべてのオブジェクトにはToString()メソッドがあり、デフォルトの動作は暗黙的な型変換のためにこのメソッドを呼び出すため、エラーは発生しません。

J. リヒターは著書の中で次のように書いています。

たとえば、C# では、基本型へのキャストは安全な暗黙的な変換と見なされるため、オブジェクトをその基本型にキャストするための特別な構文は必要ありません。ただし、C# では、開発者がオブジェクトをその派生型のいずれかに明示的にキャストする必要があります。そのようなキャストは実行時に失敗する可能性があるためです。

于 2013-03-28T07:58:49.593 に答える
0

currentCrawlingSiteは のインスタンスList<string>some_paramsobject配列のインスタンスです。

これら 2 つの型を暗黙的に変換することはできません。明示的な会話を使用する必要があります。次のように使用できます。

currentCrawlingSite = (List<string>)some_params[3];

も等しい

currentCrawlingSite = some_params[3] as List<string>;

からさらに多くの詳細を読むことができますCasting and Type Conversions (C# Programming Guide)

于 2013-03-28T07:59:57.110 に答える