2016-12-27 6 views
1

私は実際にどのようにフレーズを質問するのが最も良いか分かりませんが、私は何ができるかを見ていきます。ランタイムでのジェネリックとタイプの安全性

私は目標を持っていますが、どうすればいいのか、それとも実現できるかどうかはわかりません。

たとえば、タイプがSportであるとします。そしてTeam<Sport>Player<Sport>があります。私はチームとプレーヤーがメソッドを介してやりとりするときはいつでも、同じ<Sport>タイプを持っている場合にしかそうすることができないようにしたいと思います。

例:Team<Sport>.AddPlayer(Player<Sport> player) < - どのようにしてSportが同じタイプの場合にのみ呼び出すことができますか? Sportから新しいタイプを派生させなければならない場合、それはうまくいくかもしれませんが、実行時にインスタンスに基づいてそれを行うことを望んでいました。

私はコンパイラーが事前にインスタンスについて知っているわけではないことを知っていますので、タイプセーフティの魔法があればそれを作ってタイプを比較する必要はありません毎回自分。

答えて

3

C#で<>にインスタンスを配置することはできません。 「タイプセーフティ」を実現するには、Tennis,HockeyBadmintonなどと呼ばれる実際のタイプが必要です。それ以外の場合、コンパイラはスポーツを区別できません。

はどちらかあなたは、スポーツの種類は、実行時に同じであるかどうかを確認する、またはあなたがTennisBadmintonHockeyのように、Sportのサブクラスを作成します。コンパイル時に型の安全性が必要なので、後者の方法を使用する必要があります。

あなたが何か行うことができます。

var tennisTeam = new Team<Tennis>(); 
tennisTeam.AddPlayer(new Player<Tennis>()); 

Teamは次のように定義することができます

class Team<TSport> where TSport : Sport { 
    public void AddPlayer(Player<TSport> player) { 
     // ... 
    } 
    // ... 
} 
+0

ああ、当たり前、私は完全にその部分にブランク - もちろん、彼らはタイプする必要がなく、インスタンス。それは理にかなって、私が望んでいたことを成し遂げている、と私は思う。ありがとう! – twchapman

関連する問題