编译器抱怨下面的代码中的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
无警告