与えられたコードは空ではありません。契約は</p> <pre><code>static public int Q() { return Enumerable.Range(0, 100) .Select(i => i) .First(); } </code></pre> <p>は、次の警告を発し
しかし、正確に私が.Ensure
に必要なものは、cccheck
が満足するように私には分かりません。
与えられたコードは空ではありません。契約は</p> <pre><code>static public int Q() { return Enumerable.Range(0, 100) .Select(i => i) .First(); } </code></pre> <p>は、次の警告を発し
しかし、正確に私が.Ensure
に必要なものは、cccheck
が満足するように私には分かりません。
このコードでの警告を回避できますか?このコードで
var res = Enumerable.Range(0, 100).Select(i => i).Take(1); //execute one query with TOP1 and store in memory
Contract.Assume(res.Any()); //or res.Count() > 0 //query already in memory
return res.First(); //query already in memory
これは間違いなく私の答えの改善です( '.Any()'を使うのが望ましくないかもしれません)。 – zerkms
これが問題を解決し、1が最初に思ったかもしれないとまだその醜いではないので、私の答え(1がより良いアイデアを持っている場合、私はしかし、あなたの提案を開いている)としてそれを掲示しています:
static public int Q()
{
var e = Enumerable.Range(0, 100)
.Select(i => i);
Contract.Assume(e.Any());
return e.First();
}
スタティックアナライザーが恐れていた部分は、全体を分割する必要はありませんでした。その部分については、「すべてうまく、信頼しています、私がやっていることを知っています」 。
注:何らかの理由で
どちら
Contract.Assert(e.Count() > 0);
または
Contract.Assert(e.Any());
作品。
重要:他の人が言及して追加のe.Any()
呼び出しは(いくつかのケースでは望ましくないことがあるコレクションを、マテリアライズであろうから、これは、すべての場合に適していないかもしれません例えば:それはサードパーティからLINQのだときソース)。
、なぜあなたはSelectメソッドを使用している新しいフォーム – Viru
@Viruにソースを変換したいとき...この方法は、それが問題を実証するために特別に作られた最小の実行可能な例を示します使用されています。実際のコードでは、より多くのLINQメソッドが確実にチェーンされています。 – zerkms
@Szeki https://github.com/Microsoft/CodeContracts – zerkms