簡體   English   中英

如何將默認參數值設置為BigInteger類型?

[英]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 ,而從intBigInteger的隱式轉換不是“標識或可空轉換”。

如果您希望默認參數為除0以外的任何其他參數,則可以使用以下幾個選項:

  • 使用BigInteger? ,讓默認null並在方法的開頭檢查。 如果參數為null ,請將其設置為默認值。
  • 創建方法的另一個重載,例如使用指定的默認參數的int 此方法依次調用沒有默認參數的BigInteger重載。 這假設默認值適合int ,但我認為大多數情況下應該是這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM