[英]How can I set default parameter value to BigInteger type?
我需要一個具有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參數?
默認參數僅適用於編譯時常量(以及參數可以是default(ValType)
或new ValType()
)的值類型,因此不適用於BigInteger。 對於你的情況,你也許可以這樣做; 提供一個帶有int的構造函數重載,並使其具有一個默認參數:
public Hello(int x = 0) : this(new BigInteger(x)) {}
public Hello(BigInteger x)
{
X = x;
}
如果您想知道,當類型是BigInteger
時, x = 0
不計為常量,因為將0轉換為BigInteger
將涉及調用int到BigInteger的隱式轉換運算符 。
使用重載的構造函數
public class Hello
{
BigInteger X {get; set;}
public Hello(BigInteger x)
{
X = x;
}
public Hello()
{
X = new BigInteger(0);
}
}
在這種特殊情況下,由於您想要的默認值為零,因此您可以使用默認的BigInteger
構造函數,因為BigInteger
是一個值類型:
public class Hello
{
BigInteger X { get; set; }
public Hello(BigInteger x = new BigInteger())
{
X = x;
}
}
這不適用於除零之外的值,因為表達式必須是編譯時常量 :
每個可選參數都有一個默認值作為其定義的一部分。 如果沒有為該參數發送參數,則使用默認值。 默認值必須是以下類型的表達式之一:
- 一個恆定的表達;
- 表達式為新的ValType(),其中ValType是值類型,例如枚舉或結構;
- 形式為default(ValType)的表達式,其中ValType是值類型。
從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
,但我認為大多數情況下應該是這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.