C# 4.0 - 为什么 C# 编译器在'yield return'和动态之前声明'use of an unassigned variable'?



编译器抱怨下面的代码中的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
        // ...
}

为什么这么说呢?

我尝试了该方法的不同版本,其中没有产量用法(例如,只是 return IEnumerable<IThing> ),但使用了动态参数,并且我尝试了不传入动态的方法版本(即我们在以前版本的 C# 中所做的)。这些编译。

我似乎是一个编译器错误(或限制,如果你愿意的话)。

我将最小失败案例减少为:

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

无警告

相关内容

  • 没有找到相关文章

最新更新