Почему компилятор C # требует «использования неназначенной переменной» перед «yield return» и динамическим? - PullRequest
5 голосов
/ 19 мая 2011

Компилятор жалуется, что 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>), но с параметром dynamic , и я попробовал версию метода, в котором динамический не передается (то есть, что мы делали в предыдущих версиях C #). Эти компиляции.

1 Ответ

1 голос
/ 19 мая 2011

I представляется ошибкой компилятора (или ограничением, если вы предпочитаете).

Я уменьшил минимальный сбойный случай до:

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

Нет предупреждений

...