2011-05-18 12 views
5

Derleyici, aşağıdaki koddaki resultingThing'un atanmadan önce kullanıldığından şikayetçidir.Neden C# derleyicisi 'getiri dönüşü' ve dinamikten önce 'atanmamış bir değişken kullanması' iddiasında bulunuyor?

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 
     // ... 
} 

Neden bunu iddia ediyor?

I (örneğin sadece return IEnumerable<IThing>), fakat dinamik parametresi ile bir verim kullanımları var olan yöntemin başka bir versiyonunu çalıştılar ve dinamik olan yöntemin bir versiyonu çalıştık geçmedi (örneğin C# nin önceki sürümlerinde yaptığımız). Bu derleme.

+0

:

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) { } } 

o Derleme dava? – adrianbanks

+0

Hayır, 'result' içinde' result' kullanılmıyor. Ayrıca, 'null' olarak başlatılması, derleyici hatasını beklendiği gibi kurtarır. – Kit

+0

Gerçekten ideal değil, ama 'default' anahtar sözcüğünü kullanarak 'resultThing''i başlatmayı deneyin, yani varsayılan (IThing)'. Referans türleri için bu 'null' olmalıdır; Değer türleri için, varsayılan yapılandırılmış türün eşdeğeri olmalıdır. –

cevap

1

Derleyici bir hata (veya isterseniz sınırlama) olarak görünüyor. dinamiklerine üye araması, ne yineleyici blokları içeren olmadan, tanı aynı derleyici verir

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

:

ben minimal başarısız davayı düşürdü.

Başvuru için mono derleyici değil gezi o aşkın yapar: Eğer `else` içinde` resultingThing` kullanıyorsunuz

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

yok uyarıları

+0

Sürümünüzün Microsoft C# derleyicisi ile test edilip edilmediğini söylemediniz. Bu yüzden denedim ve aslında soru başlığında verilen hatayı üretiyor. –

+0

Evet, Microsoft derleyiciydi. Gerçekten bir böcek gibi görünüyor. – Kit

İlgili konular