Dal momento che questo risolve il problema e non è ancora quel brutto come si sarebbe potuto pensare inizialmente, sto postando come una risposta (se uno ha idee migliori sono aperto per i suggerimenti però):
static public int Q()
{
var e = Enumerable.Range(0, 100)
.Select(i => i);
Contract.Assume(e.Any());
return e.First();
}
Quindi io non avrei dovuto dividere l'intera espressione, ma la parte che l'analizzatore statica temeva, e per quella parte ho potuto assicurare che che è "tutto bene, fidati di me, so quello che sto facendo" .
Una nota:
per qualche motivo non
Contract.Assert(e.Count() > 0);
o
Contract.Assert(e.Any());
lavoro.
Importante: come altre persone parlare, questo potrebbe non essere adatto per tutti i casi, dal momento che l'ulteriore e.Any()
chiamata sarebbe materializzarsi la raccolta, che può essere indesiderabile in alcuni casi (ad esempio: quando si tratta di un LINQ da un 3rd party fonte).
in questo codice, perché stai usando il metodo Select ... Questo metodo viene utilizzato quando si desidera trasformare in fonte di nuova forma – Viru
@Viru è un esempio minima vitale realizzato specificamente per dimostrare il problema. Nel codice reale ci sono più metodi LINQ incatenati di sicuro. – zerkms
@Szeki https://github.com/Microsoft/CodeContracts – zerkms