2017-10-21 121 views
1

如何強制構造函數的參數具有特定值? 在下面的例子中,我想只有2-4名玩家。C#強制構造函數的參數接收特定值

我想輸入一個錯誤的_numOfPlayers值時出現編譯錯誤。 另一種警告編碼器錯誤地使用構造函數的方法將受到歡迎。

public class Rules 
{ 
    public Rules(int _numOfPlayers) 
    { 

     numOfPlayers = _numOfPlayers; 
    } 
public readonly int numOfPlayers; 

} 

更復雜的情況:

public class Rules 
{ 
    public Rules(int _numOfPlayers, int _money) 
    { 

     numOfPlayers = _numOfPlayers; 
     money = _money; 
    } 
public readonly int numOfPlayers; 
public readonly int money; 

} 

在這裏,我想只有特定的組合: 2個玩家,兩千塊錢。 2名球員,1000塊錢。 3名球員,700塊錢。 4名球員,500塊錢。

我該如何承諾?

+0

一種常見的方式做,這是從構造函數中拋出'ArgumentOutOfRangeException',如果玩家的數量是不能接受的。這隻在運行時執行,而不是在編譯時執行。 –

+0

爲什麼你想要這個編譯錯誤?你將不得不創建一個有你需要的限制的自定義類型。對限制的任何改變都需要改變類型,或者增加更多的類型。很多開銷只是爲了得到編譯錯誤。如果錢不是範圍(如玩家數量),那麼您可以簡單地將該屬性設置爲只讀並根據傳入玩家的數量將其設置在構造函數內。 –

回答

2

沒有實用的方法來在C#編譯時限制類似這樣的類型。我認爲在你的例子中你能做的最好的可能是創建一個只有有效值的enum。然後,如果您使用除這些值之外的任何內容,則代碼將不會編譯

enum PlayerCount {Two = 2, Three, Four}; 

然後你的構造是這樣的:

public Rules(PlayerCount count) 
{ 
    numOfPlayers = (int)count; 
} 
+0

謝謝!好想法。我怎麼才能用更復雜的情況來實現它,我剛剛添加到這個帖子中? – Ofirster

+3

枚舉是一個強烈的建議,但不強制超越基礎類型'new Rules((PlayerCount)( - 1))'這應該仍然由'備份if!! ))拋出新的ArgumentOutOfRangeException(nameof(count));' –