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」パラメーターを変更しようとする拡張メソッドが(Value Typesで機能しないため).
追伸問題のバッドホールは古い友人です:)
拡張メソッドの作成はどうですか?
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");
成功を示すブール値もありませんが、入力テキストが常に有効であることを知っている状況では実用的です。