2011-09-24 84 views
3

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

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参数?

回答

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

+0

默认参数不适用于整型。你可以做一些像'string s = null'的东西。 – svick

+0

@svick,你是对的,修好了。 – driis

2

使用一个重载的构造

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

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

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

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

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

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

  • 常量表达式;
  • 表单形式ValType(),其中ValType是一个值类型,如枚举或结构;
  • 默认形式(ValType)的表达式,其中ValType是一个值类型。
+0

但是像'42' *是一个编译时常量。 – svick

+0

@svick:但不幸的是'42'不能转换为'BigInteger',所以它是一个编译时常量,但由于不同的原因是非法的。 –

+0

但'42'可转换为'BigInteger'。 [有从'int'到'BigInteger'的隐式转换。](http://msdn.microsoft.com/zh-cn/library/dd268348.aspx) – svick

0

从C#4规范的§10.6.1:在默认参数的

表达必须是下列之一:

  • 一个恒定表达式
  • 表达式f ORM new S()其中S是值类型
  • 其中S是值类型

表达形式default(S)的表达必须通过一个标识或可空转化为参数的类型隐式转换。

这意味着什么,BigInteger是,默认参数的唯一选择是使用0,表示无论是作为new BigInteger()default(BigInteger)

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

如果你想在默认参数比0别的其他的,你有几种选择:

  • 使用BigInteger?,让默认是null,并在该方法检查的开始。如果参数是null,请将其设置为默认值。
  • 创造了另一种超负荷的方法, int与指定的默认参数。该方法依次调用BigInteger没有默认参数的重载。这假定默认值适合于int,但我认为大部分时间应该是这种情况。
相关问题