gpt4 book ai didi

c# - 为什么 Visual Studio 认为我的 "yield return"方法返回动态对象?

转载 作者:太空宇宙 更新时间:2023-11-03 19:46:50 24 4
gpt4 key购买 nike

我写了一个返回 IEnumerable<T> 的方法使用 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 :

enter image description here

这是导致症状的相关代码:

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> .

为什么会发生这种情况,我该如何解决?

(请注意 Row 只是我写的一个类。它都是原始属性,没有动态)

关键更新:在改进上面的屏幕截图的过程中,我更改了 excelReader 的声明。来自 varIExcelDataReader . 这解决了我的问题

当我改回 var 时,我看到 excelReader 的推断类型确实具有传染性dynamic .

仍然希望解释为什么我的方法的动态输入参数会“感染”输出类型。

最佳答案

dynamiccontagion principle 操作.如果进入表达式的任何内容都是动态,那么编译器在编译时无法保证可能会出现什么——因此出现的内容也被认为是动态。当类型可能在运行时任意更改时,编译器可以执行的静态分析是有限制的。

因此,如果表达式的结果是 dynamic 而您没有将结果分配给明确的 dynamic 变量,那是因为 dynamic 一定是进来了。如果你没有给这个方法调用任何明确的 dynamic,那么你给它的东西一定已经在别处“感染”了。

上游的东西,方法的参数,调用方法的对象,或者表达式中的术语,是动态的。你需要找出什么。

一个明显的候选对象是 excelReader:它从哪里来,那个对象从哪里来?你给方法的参数(如果有的话)是什么,你从哪里得到的?

零号病人就在某处。

关于c# - 为什么 Visual Studio 认为我的 "yield return"方法返回动态对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44527712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com