2017-04-13 12 views
2

C#4.0の答えはもう働きません。 < - (申し訳ありません、これは間違っています)省略可能なパラメータとしてTimeSpanをデフォルト値で使用できますか?

省略可能なパラメータとしてTimeSpanをデフォルト値で使用するにはどうすればよいですか?このコードでは

public static Foo(string myString, TimeSpan maxWait = TimeSpan.FromSeconds(1)) 
{ 
    // do something 
} 

私はエラーを取得する:

default parameter must be a compile-time constant

+0

@パトリックなぜあなたはタイトルの「C#7.0」を削除しますか? – kame

+1

タグであるため、タグはタイトルの一部であってはいけません。 –

+1

「C#4の答えはもう役に立たない」とはどういう意味ですか? – Evk

答えて

9

これは、任意のC#バージョンで働いたことがありません。デフォルト値は定数でなければなりません。値をデフォルトにするためにオーバーロードを作成するか、または値をnullにするとデフォルト値にする必要があります。

オプション1:

public static Foo(string myString) 
{ 
    Foo(myString, TimeSpan.FromSeconds(1)); 
} 

public static Foo(string myString, TimeSpan maxWait) 
{ 
    // do something 
} 

はオプション2:クラスTimeSpanがあることを意味する(任意のコンパイル時定数のメンバーを宣言していないので、あなたは、オプションのパラメータとしてTimeSpanを使用することはできません

public static Foo(string myString, TimeSpan? maxWait = null) 
{ 
    TimeSpan maxWaitNotNull = maxWait ?? TimeSpan.FromSeconds(1); 
    // do something 
} 
1

のようなメンバーは、ハードコーディングされていませんが、評価する必要があります(コンパイル時には実行できません)。まったく定数として使用することはできません。

以下はあなたのために働く可能性がある場合は試してみてください。また、C#7.0のために働く必要があり

void Foo(TimeSpan? span = null) 
{  
    if (span == null) { span = TimeSpan.FromSeconds(2); }  
    ...  
} 

から取られたC# 4.0: Can I use a TimeSpan as an optional parameter with a default value?

+2

オプションパラメータとして 'default(TimeSpan)'をいつでも持つことができます。 –

+0

@PatrickHofmanはい、あなたが正しいと言いました、それは間違っていると言いました、私は 'TimeSpan.Zero'のようなメンバーがデフォルト値として使用できるコンパイル時定数メンバではないことを意味しています –

+1

' TimeSpan'コンパイル時の定数は宣言しません。実際には 'TimeSpan'型の定数を宣言することはできません。 – Evk

関連する問題