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