0
4

2 に答える 2

1

C# 4 では、B が A から継承されIEnumerable<B>ている場合に変換できます。は T と共変であるため可能です (ただし、Tとは反変です)。List<> の代わりに IEnumerable<> を使用できるかもしれませんIEnumerable<A>IEnumerable<T>List<T>

于 2013-07-12T16:49:51.653 に答える
0

AList<BallisticProjectile>は として使用できませんList<Projectile>。理由を簡単に確認するには、 a に a を追加できますが、 anew Projectile()に a を追加しList<Projectile>ても意味がありませんList<BallisticProjectile>

このアプローチにより、発射体のタイプを一般的な方法で設定でき、問題を解決できる可能性があります(pswgが提案したのと同じ):

public class ProjectileList<T> where T : Projectile
{
    List<T> Projectiles;
}

更新:あなたの場合、それは次のようになります:

public abstract class Weapon<T> : MonoBehaviour where T : Projectile {
    public virtual IList<T> Projectiles { get; set; }
}

その後:

public class Crossbow : Weapon<BallisticProjectile> {
    // if you needed to override the implementation, you'd start with this:
    // public override IList<BallisticProjectile> Projectiles { get { } set { } }
}

ここでの問題は、C# ではオーバーライド時にプロパティ (または他のメンバー) の型を変更できないことです。型が何らかの形で互換性があるかどうかは問題ではなく、同じ型で宣言する必要があります。このように、ジェネリックは、仮想プロパティを に変更する方法BallisticPropertyです。

于 2013-07-12T17:20:06.950 に答える