4

if()で.HasValueをチェックしてから、DateTimeUtcNow.Valueなどの値を追加するのではなく、このエラーを回避するエレガントな方法はありますか?

// Compare nullable date time entity.End with utcnow but only compare up to minute precision
// for time.
//
if ((int)(entity.End - DateTime.UtcNow).TotalMinutes < 0) 
{
   // ASSERT: entity.End < UTCNow (i.e. 12/4/2012 3:56 PM < 12/4/2012 3:57 PM) 
}

エラー:System.Nullable'には'TotalMinutes'の定義が含まれていません

4

2 に答える 2

6

個人的には次のように書きます。

if (entity.End > DateTime.Now.AddMinutes(1))
{
    ...
}

entity.Endnullの場合、その条件は false になります。

ある日付/時刻を別の日付/時刻と比較してTimeSpan(または使用している任意の型) と比較するよりも、下限または上限を計算し、それを変数の日付/時刻と比較する方が明確であることがよくあります。この場合、確かにきれいに機能します。

編集: さて、質問が少し明確になったので、これを次のように書きます。

DateTime now = DateTime.UtcNow;
DateTime lowerBound = new DateTime(now.Year, now.Month, now.Hour, now.Minute,
                                   0, 0, DateTimeKind.Utc);
DateTime upperBound = now.AddMinutes(1);
if (entity.End >= lowerBound && entity.End < upperBound)
{
    ...
}

まだ誤解されている可能性もあると思いますが…

于 2012-12-04T21:33:24.823 に答える
2

1 つのオプションは、nullable の値にアクセスして null を伝播する拡張メソッドを作成することです。

public static TOut? Select<T, TOut>(this T? nullable, Func<T, TOut> func) 
    where T : struct 
    where TOut : struct
{
    return nullable.HasValue ? (TOut?)func(nullable.Value) : null;
}

次に、次のことができます。

if ((entity.End - DateTime.UtcNow).Select(t => t.TotalMinutes) > 1)
{
}
于 2012-12-04T21:59:09.720 に答える