5

resultingThingコンパイラは、以下のコードで割り当てられる前に使用されていると文句を言います。

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

なぜそれがこれを主張するのですか?

私は、yieldの使用法がない(たとえば、だけreturn IEnumerable<IThing>)が動的パラメーターを使用する別のバージョンのメソッドを試しました。また、動的が渡されないバージョンのメソッド(つまり、私たちが行ったこと)を試しました。以前のバージョンのC#)。これらはコンパイルします。

4

1 に答える 1

1

私はコンパイラのバグのようです(または、必要に応じて制限があります)。

最小の失敗ケースを次のように減らしました。

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

これにより、ダイナミクスのメンバールックアップやイテレーターブロックを使用せずに、同じコンパイラ診断が可能になります。

参考までに、モノラルコンパイラはそれを乗り越えません:

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

    }
}

それをコンパイルする:

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

警告なし

于 2011-05-18T22:34:27.740 に答える