我在奇怪的情况下玩弄泛型,我遇到了一个奇怪的情况,其“解决方案”,我不希望工作。这里是有问题的代码...C#铸造奇怪
static TournamentGame<T, Y> make16Game<T, Y>(int gameId, int seed1, int seed2, List<Y> teams)
where T : TournamentTeam<Y>
where Y : Team
{
/*
* bunch of code removed for clarity
*/
// return that bad boy
return new TournamentGame<T, Y>(gameId,
(T)(new TournamentTeam<Y>(seed1, teams[seed1 - 1])),
(T)(new TournamentTeam<Y>(seed2, teams[seed2 - 1])));
}
看着这个,我看不到编译器如何允许这样做。我的直觉是,如果我曾经用T
以外的TournamentTeam
来调用它,我会得到一个运行时错误。如果我没有放入演员阵容,我会收到一个编译错误。我的直觉是否正确?我想要做的是强制约束,T
必须有一个构造函数,需要String
和Y
参数,但这是另一个问题。我想我也可以使用反射来获得T
的构造函数,但其中的乐趣在哪里?
无论如何,想法?
编辑 的TournamentGame
如下所示:
public class TournamentGame<T, Y> : Game<T>
where T : TournamentTeam<Y>
where Y : Team
{
public TournamentGame(int id, T t1, T t2, Region<T, Y> region = null)
: base(id, t1, t2)
{
// do your thang
}
}
public class Game<T>
where T : Team
{
private T mTeam1 = null;
private Game(int id)
{
// do your thang
}
public Game(int id, T t1, T t2)
: this(id)
{
// do your thang
}
public T Team1
{
get
{
// do your thang
}
}
}
对不起,离开了这一点。
也许我错了,可是我什么也看不到一般在这种方法中,只是一个非常使用常规类型的尴尬的方式。\ – 2012-03-11 05:06:05
好吧,我的使用泛型的很多原因在此代码示例中是隐藏的,因为泛型将用于正在使用的对象类型中,而不是在此特定代码中。该函数是另一个需要泛型的静态函数的辅助函数。但是,我更多地在回归声明中询问演员,如果这是一个好的或不好的主意。 – aaronburro 2012-03-11 05:36:02
尽管如此,你是对的。这个问题与泛型没有任何关系,我意识到在我点击提交按钮之前,实际上改变了标题,但忘了删除泛型标记。现在删除该标签。 – aaronburro 2012-03-11 05:40:00