72

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

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

7 に答える 7

94

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

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

ただし、デフォルト パラメータの後にデフォルト以外のパラメータがあるという問題は依然としてあります。それをデフォルトとして使用するには、順序を変更する必要がある場合があります。

于 2013-09-11T11:54:01.590 に答える
24

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

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 が示唆するように、デフォルト値DateTime?を許可する which を使用します。null

于 2013-09-11T11:53:52.010 に答える
7

この方法で試すことができます:

public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
    if(!end.HasValue){
        end = DateTime.MinValue;
    }
}
于 2013-09-11T11:57:53.873 に答える
5

パラメータ end の型を 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)
于 2013-09-11T11:56:26.330 に答える
3

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

于 2013-09-11T11:56:24.480 に答える
2

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

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

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

  • 2 番目のオーバーロード メソッドを作成します。
  • 初期メソッドにパラメーターを含めないようにする
  • セカンダリにパラメータを含めます
  • より具体的なメソッドからより一般的なメソッド (パラメーターを持つメソッド) を呼び出し、より一般的なメソッドにのみロジックを実装します。
于 2013-09-11T11:56:39.040 に答える
-3

デフォルト値で CONSTANTS クラスを作成できます

public const int DEFAULTINT = -9999;

ビジネスデフォルトとして CONSTANTS.DEFAULTINT として使用します。

それが役に立てば幸い、

于 2013-12-03T15:45:28.277 に答える