我需要一个具有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参数?
答案 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转换为BigInteger
会involve 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
,而从int
到BigInteger
的隐式转换不是“身份或可以为空的转换”。
如果您希望默认参数为0以外的任何其他参数,则有几个选项:
BigInteger?
,默认为null
,并在方法开头检查。如果参数为null
,请将其设置为默认值。int
指定了默认参数。此方法依次调用没有默认参数的BigInteger
重载。这假定默认值适合int
,但我认为大多数时候应该是这种情况。