6
MonoBehavior[] list; // This is from Unity3d but think of it as Object, 
                     // all classes inherit from it.

リストには多くの項目が含まれており、アルファ クラスのアルファもあれば、他のクラスのアルファもあります。

foreach(Alpha a in list) // Alpha is a script. 
  a.doSomething();

foreach は次のように機能すると想定していました。リストにある Foreach Alpha スクリプトは何かを実行し、他のすべてのコンポーネントを無視します。

これはキャスティングの問題だと思います。キャスト/ポリモーフィズムをよりよく理解するのを手伝ってください。

実行中に次のエラーが表示されます: ソース タイプから宛先タイプにキャストできません

4

7 に答える 7

15

ポリモーフィズムは間違った方向に進んでいます。Alphaは派生型ですが、MonoBehavior型のリストにある他のすべてのオブジェクトがそうであるわけではありません。したがって、foreachが実行している暗黙の型キャストに失敗するものもあります。ご使用の環境で使用可能な場合は、「OfType()」拡張機能を使用できます。

foreach(Alpha a in list.OfType<Alpha>())
于 2013-03-15T11:34:00.740 に答える
13

次のようなものを試すことができます:

foreach(Alpha a in list.Where(x => x is Alpha)) // Alpha is a script. 
  a.doSomething();
于 2013-03-15T11:33:03.713 に答える
2

これは私がそれを行う方法であり、Unity3dでコンパイルされることは確かです。ちなみに、OfTypeはUnityにはありませんが、TypeOfはありますが、taras.roshkoが言ったように使用するis方が良いです。

MonoBehavior[] list;

foreach(MonoBehavior current in list) // Search the whole list for MonoBehaviors.
    if (current  is Alpha)            // Check if current is an Alpha type.
        current.doSomething();        // current is a valid Alpha type script.

foreachリスト上のすべての要素を変換しようとします。AlphaはMonoBehaviorですが、MonoBehaviorはAlphaではないため、正しく実行できません。したがって、currentがAlphaであるかどうかを確認し、それが使用されているかどうかを好きなように確認します。

于 2013-03-16T04:51:57.480 に答える
2

ループをAlpha型のみで動作させる場合は、次のように書き直す必要があります。

foreach (var item in list)
{
  if (item is Alpha)
  {
    ((Alpha) item).doSomething();
  }
}

編集:マールテンの答えは、より簡潔なLINQを使用しているので、それをお勧めします。

于 2013-03-15T11:33:48.210 に答える
2

OfTypeを使用して、指定された型の要素のみを反復処理します

于 2013-03-15T11:32:52.330 に答える
0

あなたのforeachステートメントは、そこにあるすべてのオブジェクトを にキャストしようとしますAlpha。共通のスーパークラスがある場合はそれを使用できますが、それ以外の場合はそのObjectクラスを使用します。

于 2013-03-15T11:24:18.827 に答える
0

リストに基本タイプのリストが含まれていて、各要素を取得しているだけで、それが違法であるよりもタイプ Alpha であると考えようとしている場合は、以下を試してください

foreach(Unity3d a in list) // Alpha is a script. 
     a.doSomething();

doSomething() が Unity3d で定義されていると仮定します

于 2013-03-15T11:36:57.527 に答える