Dynamic 为什么C#编译器声称';使用未赋值变量';在'之前;收益率回报率';和动态?

Dynamic 为什么C#编译器声称';使用未赋值变量';在'之前;收益率回报率';和动态?,dynamic,c#-4.0,yield-keyword,out-parameters,Dynamic,C# 4.0,Yield Keyword,Out Parameters,编译器抱怨下面代码中的resultingThing在分配给之前被使用 private IEnumerable<IThing> FindThings(dynamic spec) { if (spec == null) yield break; IThing resultingThing; if (spec.Something > 0 && dictionary.TryGetValue(spec.Something, out

编译器抱怨下面代码中的
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
        // ...
}
private IEnumerable FindThings(动态规范)
{
如果(spec==null)
屈服断裂;
我认为结果是什么;
if(spec.Something>0&&dictionary.TryGetValue(spec.Something,out resultingThing))
收益结果物;
其他的
// ...
}
它为什么声称这一点


我尝试了一个不同版本的方法,其中没有yield用法(例如just
return IEnumerable
),但使用了dynamic参数,并且我尝试了一个版本的方法,其中dynamic没有传入(即我们在以前的C#版本中所做的)。这些都是可编译的。

I似乎是一个编译器错误(或者限制,如果您愿意的话)

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

static private IThing FindThings(dynamic spec)
{
    IThing resultingThing;
    if ((null!=spec) && dictionary.TryGetValue(spec, out resultingThing))
        return resultingThing;
return null;
}
它提供相同的编译器诊断,不涉及动态上的成员查找,也不涉及迭代器块

作为参考,mono编译器不会因以下原因而跳闸:

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

    }
}

没有警告

您是否在
其他
案例中使用了
结果事物
?没有在
其他
案例中使用
结果事物
。另外,将其初始化为
null
可以按预期消除编译器错误。这并不理想,但可以尝试使用
default
关键字初始化
resultingThing
,即
default(IThing)
。对于引用类型,这应该是
null
;对于值类型,它应该与默认构造类型等效。我减少了错误情况,迭代器块没有影响,尽管使用动态相关,请参阅我的更新答案。您没有说明您的版本是否使用Microsoft C#编译器进行过测试。所以我试过了,事实上,它确实产生了问题标题中给出的错误。是的,是微软的编译器。看起来它确实是一个bug。
dmcs -v -warnaserror -warn:4 t.cs