web-dev-qa-db-ja.com

Nullable <DateTime>でDateTime.TryParseを使用するにはどうすればよいですか?

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

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

コンパイラは私に言います

「out」引数は変数として分類されません

ここで何をする必要があるかわかりません。私も試しました:

out (DateTime)d.Value 

それも機能しません。何か案は?

108
Brian Sullivan
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;

(もっとエレガントなソリューションがあるかもしれませんが、なぜあなたは上記のようなことをしないのですか?)

119
Jason Kealey

ジェイソンが言うように、正しい型の変数を作成して渡すことができます。独自のメソッドでカプセル化することもできます。

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;
152
Jon Skeet

以下は、ジェイソンが提案した内容の少し簡潔な版です。

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
19
Sonny

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」パラメーターを変更しようとする拡張メソッドが(Value Typesで機能しないため).

追伸問題のバッドホールは古い友人です:)

19
Binary Worrier

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

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;

    }
}
4
user2687864

マイクロソフトがこれを処理しなかった理由がわかりません。これに対処するためのスマートな小さなユーティリティメソッド(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;
        }
    }
1
JStrahl

または、発生する可能性のある例外に関心がない場合は、TryParse for Parseを変更できます。

DateTime? d = DateTime.Parse("some valid text");

成功を示すブール値もありませんが、入力テキストが常に有効であることを知っている状況では実用的です。

0
monsieurgutix