如何将默认参数值设置为BigInteger类型?

时间:2011-09-24 19:38:40

标签: c# biginteger

我需要一个具有BigInteger类型的构造函数的类。我想用这段代码将默认值设置为0,但是我遇到了编译错误。

public class Hello
{
    BigInteger X {get; set;}
    public Hello(BigInteger x = 0)
    {
        X = x;
    }
}

public class MyClass
{
    public static void RunSnippet()
    {
        var h = new Hello(); // Error <-- 

怎么了?有没有办法将默认值设置为BigInteger参数?

4 个答案:

答案 0 :(得分:6)

默认参数仅适用于编译时常量(以及参数可以为default(ValType)new ValType()的值类型),因此不适用于BigInteger。对于你的情况,你也许可以这样做;提供构造函数重载,它接受int,并使其具有默认参数:

public Hello(int x = 0) : this(new BigInteger(x)) {}
public Hello(BigInteger x) 
{
    X = x;
}

如果您想知道,x = 0在类型为BigInteger时不会计为常量,因为将0转换为BigIntegerinvolve invoking the implicit conversion operator for int to BigInteger。< / p>

答案 1 :(得分:2)

使用重载的构造函数

public class Hello
{
    BigInteger X {get; set;}
    public Hello(BigInteger x)
    {
        X = x;
    }
    public Hello()
    {
        X = new BigInteger(0);
    }
}

答案 2 :(得分:2)

在这种特殊情况下,由于您想要的默认值为零,因此可以使用默认的BigInteger构造函数,因为BigInteger是值类型:

public class Hello
{
    BigInteger X { get; set; }

    public Hello(BigInteger x = new BigInteger())
    {
        X = x;
    }
}

这不适用于零以外的值,因为表达式必须是compile time constant

  

每个可选参数都有一个默认值作为其定义的一部分。如果没有为该参数发送参数,则使用默认值。默认值必须是以下类型的表达式之一:

     
      
  • 一个恒定的表达;
  •   
  • 新形式ValType()的表达式,其中ValType是值类型,例如枚举或结构;
  •   
  • 表单default(ValType)的表达式,其中ValType是值类型。
  •   

答案 3 :(得分:0)

来自C#4规范的§10.6.1:

  

default-argument 中的表达式必须是以下之一:

     
      
  • 一个常量表达式
  •   
  • new S()形式的表达式,其中S是值类型
  •   
  • default(S)形式的表达式,其中S是值类型
  •   
     

表达式必须通过标识或可空转换隐式转换为参数类型。

这对BigInteger的意义在于,默认参数的唯一选项是使用0,表示为new BigInteger()default(BigInteger)

BigInteger x = 0不起作用,因为0的类型为int,而从intBigInteger的隐式转换不是“身份或可以为空的转换”。

如果您希望默认参数为0以外的任何其他参数,则有几个选项:

  • 使用BigInteger?,默认为null,并在方法开头检查。如果参数为null,请将其设置为默认值。
  • 创建另一个方法的重载,例如int指定了默认参数。此方法依次调用没有默认参数的BigInteger重载。这假定默认值适合int,但我认为大多数时候应该是这种情况。