C#强制构造函数#x27;s参数以接收特定值

C#强制构造函数#x27;s参数以接收特定值,c#,constructor,compilation,C#,Constructor,Compilation,如何强制构造函数的参数具有特定值? 在下面的例子中,我希望只有2-4名玩家 我希望在输入错误的值时出现编译错误。 另一种警告程序员不要以错误的方式使用构造函数的方法将是受欢迎的 public class Rules { public Rules(int _numOfPlayers) { numOfPlayers = _numOfPlayers; } public readonly int numOfPlayers; } 更复杂的情况是:

如何强制构造函数的参数具有特定值? 在下面的例子中,我希望只有2-4名玩家

我希望在输入错误的值时出现编译错误。 另一种警告程序员不要以错误的方式使用构造函数的方法将是受欢迎的

    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名球员,2000美元。 2名球员,1000美元。 3名球员,700美元。 4名球员,500美元


我怎么能保证这一点呢?

在C#中编译时没有实际的方法来约束这样的类型。我认为在你的例子中,你能做的最好的事情就是创建一个只有有效值的。如果使用这些值以外的任何值,那么代码将无法编译

enum PlayerCount {Two = 2, Three, Four};
那么您的构造函数将如下所示:

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

非常感谢。好主意。我如何在更复杂的情况下实现它,我刚刚在文章中添加了它?枚举是一个强烈的建议,但不强制执行基础类型以外的任何内容
新规则((PlayerCount)(-1))
如果(!Enum.IsDefined(typeof(PlayerCount),count))抛出新ArgumentOutOfRangeException(姓名(计数))执行此操作的常用方法是,如果玩家数量不可接受,则从构造函数中抛出
ArgumentOutOfRangeException
。这仅在运行时强制执行,而不是在编译时强制执行。为什么要将其作为编译错误?您必须创建一个具有所需限制的自定义类型。对restra的任何更改ints需要更改类型,或者添加更多类型。仅仅是为了获得编译错误就需要大量开销。如果金钱不是一个范围(玩家数量是这样的),那么您可以简单地将该属性设置为只读,并根据传入的玩家数在构造函数中设置它。