回答:
DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
(もっとエレガントな解決策があるかもしれませんが、なぜあなたは上記のように単に何かしませんか?)
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;
Parse
返さDateTime
れて例外がスローされることを期待していましたか?しかし、はい、あなたはあなたがやりたいことを何でもすることができます...そして野田タイムでは、Parse
代わりに関連するメソッドに名前を付けました。
else
エンドポイントので、キーワードは(あなたの最初の例では)不要であるif
ブロックに到達することはできません。
Jasonが提案したものの少し簡潔な版は次のとおりです。
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 hoorパラメータを変更しようとする拡張メソッドが値型では機能しないためです(いくつかの悪いhoorによって指摘されています)。
PS問題のBad Hoorは古い友達です:)
拡張メソッドの作成についてはどうですか?
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;
}
}
dateTime
ですか?使用されることはありません。
DateTime? TryParse(this string dateString)
。この実装は奇妙です。
(DateTime?).TryParse( ... )
Nullable<DateTime>.TryParse( ... )
マイクロソフトがこれを処理しなかった理由はわかりません。これに対処するためのスマートな小さなユーティリティメソッド(私は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つのライナーです:
DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;
これを適切なTryParse疑似拡張メソッドにしたい場合は、次のようにします。
public static bool TryParse(string text, out DateTime? dt)
{
if (DateTime.TryParse(text, out DateTime date))
{
dt = date;
return true;
}
else
{
dt = null;
return false;
}
}
これが単一行のソリューションです。
DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;
または、発生する可能性のある例外に関心がない場合は、ParseのTryParseを変更できます。
DateTime? d = DateTime.Parse("some valid text");
成功を示すブール値もありませんが、入力テキストが常に有効であることがわかっている状況では実用的です。