我已经写了返回IEnumerable<T>
yield return
的方法使用像这样:为什么Visual Studio认为我的“yield return”方法返回一个动态对象?
public IEnumerable<Row> ConvertExcelToRows(IExcelDataReader reader)
{
while (reader.Read())
{
var row = new Row();
// do some work. No dynamic objects here whatsoever
yield return row;
}
}
当我消费我的方法和使用LINQ扩展方法遵循它,Visual Studio中显示的返回值是dynamic
类型:
下面是相关的代码导致该症状:
dynamic data = JsonConvert.DeserializeObject(jsonContent);
using (var stream = await DownloadFile(data.docUrl.ToString()))
using (var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream))
{
var rows = ConvertExcelToRows(excelReader).ToList<Row>();
}
上面的屏幕快照中的rows
的类型是dynamic
,它应该是List<Row>
。
为什么会发生这种情况,我该如何解决?
(请注意:就是一个类我写了这一切基本属性,没有什么动态。)
密钥更新:在改善上面的截图中的过程中,我已经改变了的声明excelReader
从var
到IExcelDataReader
。 这解决了我的问题。
当我改回var
时,我看到推断出的excelReader
类型确实是具有传染性的dynamic
。
仍然喜欢解释为什么我的方法的动态输入参数会“感染”输出的类型。
'动态'由[某种令人毛骨悚然,地狱般的传染原理]操作(https://blogs.msdn.microsoft.com/ericlippert/2012/11/08/dynamic-contagion-part-two/)。任何步骤,或刷它,[成为](http://static.tvtropes.org/pmwiki/pub/images/invasion-of-the-body-snatchers-78_5124.jpg)。一旦你打开了一个门户网站进入后期绑定区,编译器就开始变得神经质和偏执狂。 –
您需要定义代码中的_everything_。告诉我们'rows'变量的类型,'excelReader'变量的类型,你的“做些什么工作”的代码与返回值有关。根据我们可以做出的假设,它应该可以正常工作,但是你没有给我们一个理由相信你。 –
上游的东西是'动态'。你需要找出什么。 –