2

動作しているように見えるこのジェネレーターがありますが、生成された値を確認すると、null 値が選択されることはありません。null値を選択するジェネレーターをどのように書き込みますか。このコードは、「終了」日の null 値を選択しません。

public static Gen<DateTime?> NullableDateTimeGen()
    {
        var list = new List<DateTime?>();

        if (list.Any() == false)
        {
            var endDate = DateTime.Now.AddDays(5);
            var startDate = DateTime.Now.AddDays(-10);

            list.AddRange(Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
                .Select(offset => startDate.AddDays(offset))
                .Cast<DateTime?>()
                .ToList());

            list.Add(null);
            list.Insert(0, null);
        }

        return from i in Gen.Choose(0, list.Count - 1)
               select list[i];
    }

    public static Arbitrary<Tuple<DateRange, DateTime>> TestTuple()
    {
        return (from s in NullableDateTimeGen().Where(x => x != null)
                from e in NullableDateTimeGen()
                from p in NullableDateTimeGen().Where(x => x != null)
                where s <= e
                select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value))
                .ToArbitrary();
    }
4

1 に答える 1

1

この問題は FsCheck とは関係なく、次のステートメントに含まれています。

from s in NullableDateTimeGen().Where(x => x != null)
            from e in NullableDateTimeGen()
            from p in NullableDateTimeGen().Where(x => x != null)
            where s <= e
            select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value))

sとから null をフィルタリングするpため、null になることはないことに注意してください。の場合に null になることができる唯一のものe。しかし、あなたはそうします

where s <= e

enull と比較されるものは常に false であるため、この比較は nullの場合は true にはなりません。したがって、ヌル値も除外しますe

修正するには、その条件をシナリオに適したものに置き換えます。

where e == null || s <= e
于 2017-03-13T20:36:07.297 に答える