2

私はいくつかの衝突検出を実装した小さなゲームを持っています。現在の「エンティティ」オブジェクトと衝突している、特定のタイプのすべてのアイテムのリストを取得したいと考えています。私はこのようなことをしたい:

    public List<T> GetCollidingObjects<T>() where T : Entity
    {
        return this.Game.World.Entities
            .AsParallel()
            .Where(e => e.IsColliding(this))
            .Where(e => e is T)
            .ToList<T>();
    }

次のエラーが表示されます。

Instance argument: cannot convert from "System.Linq.ParallelQuery<GameName.GameObjects.Entity>" to "System.Collections.Generic.IEnumerable<T>"

なぜこれが起こるのか、誰でも説明できますか?

ありがとうございました!

4

2 に答える 2

8

そんな使い方はできませんToList()。指定するジェネリック パラメーター (指定する場合) は、シーケンスの型と一致する必要があります。EntityではなくのシーケンスですT

とにかく、OfType()フィルタリングを行うために使用する必要があります。それがその目的です。

public List<T> GetCollidingObjects<T>() where T : Entity
{
    return this.Game.World.Entities
        .OfType<T>()
        .AsParallel()
        .Where(e => e.IsColliding(this))
        .ToList();
}
于 2011-07-08T23:33:49.443 に答える
0

Jeff Mercado の答えは正しいですが、もっとわかりやすく言えます。

.Where(e => e is T)

この への呼び出しは(ソースのフィルタリングされたバージョン、つまり) をEnumerable.Where<Entity>返します。呼び出しは を返しません。IEnumerable<Entity>IEnumerable<Entity>IEnumerable<T>

Enumerable.Select<TSource, TResult>ソースとEnumerable.OfType<TResult>は異なるタイプの IEnumerable を返すことができます。

.Where(e => e is T)
.Select(e => e as T)

また

.Select(e => e as T)
.Where(e => e != null)

また

 .OfType<T>()
于 2011-07-08T23:57:00.180 に答える