Kodėl „C #“ kompiliatorius reikalauja „naudoti nepriskirtą kintamąjį“ prieš „grąžinimo grąžą“ ir dinamišką?

Kompiliatorius skundžiasi, kad resultingThing naudodamas žemiau esantį kodą, naudojamas prieš paskyrimą.

 private IEnumerable<IThing> FindThings(dynamic spec) { if (spec == null) yield break; IThing resultingThing; if (spec.Something > 0  dictionary.TryGetValue(spec.Something, out resultingThing)) yield return resultingThing; else // ... } 

Kodėl jis to reikalauja?

Bandžiau kitą metodo versiją, kurioje nėra derliaus (pvz., Tiesiog return IEnumerable<IThing> ), bet su dinaminiu parametru, ir bandžiau metodo versiją, kurioje dinamika nepriimama (tai yra, ką darėme ankstesnėse versijose Su #). Šie rinkiniai.

5
19 мая '11 в 1:19 2011-05-19 01:19 Komplektas nustatytas gegužės 19 d. 11 val. 1:19 2011-05-19 01:19
ответ 1 atsakymas

Man atrodo kompiliatoriaus klaida (arba apribojimas, jei norite).

Sumažinau minimalų trūkumą:

 static private IThing FindThings(dynamic spec) { IThing resultingThing; if ((null!=spec)  dictionary.TryGetValue(spec, out resultingThing)) return resultingThing; return null; } 

Tai suteikia tą pačią kompiliatoriaus diagnostiką, nedarant įtakos dalyvių paieškai pagal dinamiką, taip pat iteratoriaus blokus.

Nuoroda, monokompiliatorius tai neleidžia:

 using System; using System.Collections.Generic; public static class X { public interface IThing { } private static readonly IDictionary<string, IThing> dictionary = new Dictionary<string, IThing>(); static private IThing FindThings(dynamic spec) { IThing resultingThing; if ((null!=spec)  dictionary.TryGetValue(spec, out resultingThing)) return resultingThing; return null; } public static void Main(string[] s) { } } 

Kompiliavimas:

 dmcs -v -warnaserror -warn:4 t.cs 

Nėra įspėjimų

1
19 мая '11 в 1:34 2011-05-19 01:34 atsakymas pateikiamas gegužės 19 d., 11 d., 1:34 2011-05-19 01:34