我在奇怪的情況下玩弄泛型,我遇到了一個奇怪的情況,其「解決方案」,我不希望工作。這裏是有問題的代碼...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