Da dies das Problem löst und ist immer noch nicht so hässlich wie man zunächst vielleicht gedacht haben, ich es als Antwort bin Entsendung (wenn man bessere Ideen hat Ich bin offen für Ihre Anregungen obwohl):
static public int Q()
{
var e = Enumerable.Range(0, 100)
.Select(i => i);
Contract.Assume(e.Any());
return e.First();
}
Also ich sollte nicht den ganzen Ausdruck teilen müssen, aber der Teil, für den der statische Analysator Angst hatte, und für diesen Teil konnte ich versichern, dass es "alles in Ordnung ist, vertraue mir, ich weiß, was ich tue" .
Eine Anmerkung:
aus irgendeinem Grund weder
Contract.Assert(e.Count() > 0);
oder
Contract.Assert(e.Any());
Arbeit.
Wichtige: wie andere Leute erwähnen, könnte dies für alle Fälle nicht geeignet, da der zusätzliche e.Any()
Aufruf die Sammlung materialisieren würde, was in einigen Fällen unerwünscht sein kann (zB: wenn es eine LINQ aus einer 3rd-Party Quelle).
in diesem Code, warum Sie, wenn Sie Quelle in neue Form – Viru
@Viru es ist ein Minimum tragfähige Beispiel speziell um das Problem zu demonstrieren, in Handarbeit verwandeln wollen verwenden wird Select-Methode ... Diese Methode verwendet. In realem Code sind mehr LINQ-Methoden sicher verkettet. – zerkms
@Szeki https://github.com/Microsoft/CodeContracts – zerkms