web-dev-qa-db-ja.com

値のデフォルトパラメータはコンパイル時定数でなければなりませんか?

これは私のメソッドシグネチャです。 endをオプションのパラメーターとして渡そうとすると、このエラーが発生します。これを解決するにはどうすればよいですか?なぜDateTime.MinValue定数?

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue,
                                          out string date, out string time)
48
Ankit

DateTime.MinValueconstではありません。言語がconstDateTimeを好まないためです。 1つのオプションは、代わりにDateTime?を使用することです。

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null,
     out string date, out string time)
{
    var effectiveEnd = end ?? DateTime.MinValue;
    // ...
}

ただし、デフォルト以外のパラメータafter default parametersの問題は引き続き発生します。デフォルトとして使用するためには、それらを並べ替える必要がある場合があります。

70
Marc Gravell

代わりに通常のメソッドオーバーロードを使用します。

_public static void DatesToPeriodConverter(DateTime start, out string date, out string time)
{
    DatesToPeriodConverter(start, DateTime.MinValue, out date, out time);  
}

public static void DatesToPeriodConverter(DateTime start, DateTime end, out string date, out string time) 
{ }
_

寛容に、default(DateTime)は_DateTime.MinValue_と同じであり、コンパイル時定数ですが、このスタイルを使用することを間違える傾向があります(将来的にdefault(DateTime)が等しくなるという保証はありません_DateTime.MinValue_):

_public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
_

または、Marcが示唆しているように、nullのデフォルト値を許可する_DateTime?_を使用します。

16

この方法で試してみることができます:

public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
    if(!end.HasValue){
        end = DateTime.MinValue;
    }
}
4

パラメーターの終わりのタイプをNullableに変更し、デフォルト値としてnullを使用します。

public static void DatesToPeriodConverter(DateTime start, DateTime? end = null, out string date, out string time)

または、デフォルト値としてdefault(DateTime)を使用します。

public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
3

あなたは正しいです。値のデフォルトのパラメーターはコンパイル時定数でなければなりません。コンパイラーは、オプションのパラメーターに対して動的に計算された値を受け入れません。この背後にある理由は、あなたが提供している動的な値が何らかの有効な値を与えるかどうかが明確ではないためかもしれません。

2
Adarsh Kumar

オプションのパラメーターは、パラメーターリストの最後に表示する必要があります。 outパラメーターは、パラメーターリストの最後にも表示する必要があります。オプションのパラメーターはoutパラメーターではありません。

さらに、リテラル定数といくつかの奇妙なコーナーケース以外のオプションのパラメーターにデフォルト値を使用することはできません。

すべての事実は、次の方向を指します。

  • セカンダリオーバーロードメソッドを作成します。
  • 初期メソッドにパラメーターを含めないようにする
  • セカンダリーにパラメーターを含める
  • より具体的なメソッドからより一般的なメソッド(1つwithパラメーター)を呼び出し、より一般的なメソッドでのみロジックを実装します
1
Eduard Dumitru