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

StackOverflow https://stackoverflow.com/questions/192121

  •  08-07-2019
  •  | 
  •  

質問

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

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

コンパイラが教えてくれます

  

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

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

out (DateTime)d.Value 

そしてそれも機能しません。アイデアはありますか?

役に立ちましたか?

解決

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

(より洗練されたソリューションがあるかもしれませんが、なぜあなたは上記のようなことを単純にしないのですか?)

他のヒント

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

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;

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

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

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問題のバッドホールは古い友人です:)

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

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;

    }
}

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top