私はこのようになりますクラスを持っている:この契約アサーションを証明できないのはなぜですか?
class Foo
{
private IEnumerable<Bar> bars;
...
private void DoSomething()
{
Contract.Requires(bars != null);
Contract.Requires(bars.Any());
Bar result = bars.FirstOrDefault(b => SomePredicate) ?? bars.First();
Contract.Assert(result != null); // This asserts fails the static checker as "cannot be proven"
}
}
私の知る限り、契約それはresult
がnullでないことを知るために必要なすべての情報を持っています。 bars
には少なくとも1つの要素があります。これらの要素のいずれかがSomePredicate
に一致する場合は、result
が最初の要素になります。そうでない場合、result
はbars
の最初の要素になります。
なぜアサーションが失敗するのですか?
または 'Contract.Requires(bars.Any(X => X = NULL)!)' – leppie
@leppie:それらのどちらかフォームが優先されますか?私がユーザのドキュメントで見つけることができるのは、 "Contract.Exists'の代わりに拡張メソッド' System.Linq.Enumerable.Any'を使うことも可能です。 " –
@Matthew:ヌル要素が存在しない場合は、 'ForAll'を実行してください。そうでなければ' Any'が動作します。 'Any'を使うときは、コードの後半に' First(x => x!= null) 'をつけなければなりません。小さく微妙な違い。 – leppie