126

DateTime.TryParse メソッドを使用して、文字列の日時値を Nullable に取得したいと考えています。しかし、これを試すと:

DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);

コンパイラが教えてくれる

'out' 引数は変数として分類されていません

ここで何をする必要があるのか​​わからない。私も試しました:

out (DateTime)d.Value 

それもうまくいきません。何か案は?

4

9 に答える 9

175

Jason が言うように、適切な型の変数を作成して渡すことができます。独自の方法でカプセル化することもできます。

public static DateTime? TryParse(string text)
{
    DateTime date;
    if (DateTime.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}

... または、条件演算子が好きな場合:

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}

または C# 7 の場合:

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
于 2008-10-10T16:35:32.077 に答える
133
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;

(もっと洗練された解決策があるかもしれませんが、単純に上記のようにしてみませんか?)

于 2008-10-10T16:27:38.897 に答える
22

ジェイソンが提案したものの少し簡潔な版はここにあります:

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
于 2008-10-31T21:41:14.310 に答える
18

Nullable<DateTime>は とはタイプが異なるため、できませんDateTime。それを行うには、独自の関数を作成する必要があります。

public bool TryParse(string text, out Nullable<DateTime> nDate)
{
    DateTime date;
    bool isParsed = DateTime.TryParse(text, out date);
    if (isParsed)
        nDate = new Nullable<DateTime>(date);
    else
        nDate = new Nullable<DateTime>();
    return isParsed;
}

お役に立てれば :)

編集:( 明らかに)不適切にテストされた拡張メソッドを削除しました。これは、(いくつかの悪意によって指摘されたように)「this」パラメーターを変更しようとする拡張メソッドは値の型では機能しないためです。

PS問題のBad Hoorは古くからの友人です:)

于 2008-10-10T16:46:25.223 に答える
4

拡張メソッドの作成についてはどうですか?

public static class NullableExtensions
{
    public static bool TryParse(this DateTime? dateTime, string dateString, out DateTime? result)
    {
        DateTime tempDate;
        if(! DateTime.TryParse(dateString,out tempDate))
        {
            result = null;
            return false;
        }

        result = tempDate;
        return true;

    }
}
于 2012-06-24T22:06:36.690 に答える
1

マイクロソフトがこれを処理しなかった理由がわかりません。これに対処するためのスマートで小さなユーティリティ メソッド (int に問題がありましたが、int を DateTime に置き換えると同じ効果が得られます。

    public static bool NullableValueTryParse(string text, out int? nInt)
    {
        int value;
        if (int.TryParse(text, out value))
        {
            nInt = value;
            return true;
        }
        else
        {
            nInt = null;
            return false;
        }
    }
于 2009-10-12T18:20:09.057 に答える