C# 为什么VisualStudio认为我的;“收益率回报”;方法返回动态对象?

C# 为什么VisualStudio认为我的;“收益率回报”;方法返回动态对象?,c#,visual-studio,linq,yield-return,C#,Visual Studio,Linq,Yield Return,我编写了一个方法,使用yield return返回IEnumerable,如下所示: public IEnumerable<Row> ConvertExcelToRows(IExcelDataReader reader) { while (reader.Read()) { var row = new Row(); // do some work. No dynamic objects here whatsoever yi

我编写了一个方法,使用
yield return
返回
IEnumerable
,如下所示:

public IEnumerable<Row> ConvertExcelToRows(IExcelDataReader reader)
{
    while (reader.Read())
    {
        var row = new Row();
        // do some work. No dynamic objects here whatsoever
        yield return row;
    }
}
上面屏幕截图中的
类型应为
列表
时为
动态

为什么会发生这种情况?我如何修复它

(请注意,
只是我编写的一个类。它都是基本属性,没有动态)

关键更新:在改进上述屏幕截图的过程中,我已将
excelReader
的声明从
var
更改为
IExcelDataReader
这解决了我的问题

当我切换回
var
时,我发现
excelReader
的推断类型确实是传染性
动态


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

dynamic
由。如果表达式中的任何内容都是动态的,那么编译器在编译时不能保证可能产生的内容,因此产生的内容也被认为是动态的。当类型在运行时可以任意更改时,编译器可以进行的静态分析是有限的

因此,如果从表达式中得到的是
dynamic
,并且没有显式地将结果赋给
dynamic
变量,那么这是因为肯定有
dynamic
的内容。如果您没有显式地给这个方法调用任何东西
dynamic
,那么您给它的东西一定是在别处被“感染”了

上游的东西、方法的参数、调用方法的对象或表达式中的术语都是
动态的
。你需要知道是什么

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


零号病人就在外面某个地方

动态
由。如果表达式中的任何内容都是动态的,那么编译器在编译时不能保证可能产生的内容,因此产生的内容也被认为是动态的。当类型在运行时可以任意更改时,编译器可以进行的静态分析是有限的

因此,如果从表达式中得到的是
dynamic
,并且没有显式地将结果赋给
dynamic
变量,那么这是因为肯定有
dynamic
的内容。如果您没有显式地给这个方法调用任何东西
dynamic
,那么您给它的东西一定是在别处被“感染”了

上游的东西、方法的参数、调用方法的对象或表达式中的术语都是
动态的
。你需要知道是什么

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


零号病人就在外面某个地方

动态
通过以下方式操作。任何踩到它的东西,或刷到它上面的东西。一旦你打开一个进入后期绑定区的门户,编译器就会开始变得紧张和偏执。你需要定义代码中的所有内容。向我们展示
变量的类型,
excelReader
变量的类型,以及与返回值相关的“do some work”代码的作用。根据我们可以做出的假设,它应该可以正常工作,但你没有给我们一个相信你的理由。上游的东西是动态的。你需要找出什么。要重申Ed的链接是关于什么的,如果表达式的任何部分是
动态的
,整个表达式将是
动态的
。您认为,
ConvertExcelToRows(excelReader).ToList()是
动态的
,因此该表达式的任何部分都可能是
动态的
,很可能是
excelReader
。如果
excelReader
dynamic
,则
ExcelReaderFactory.CreateOpenXmlReader(stream)
必须是
dynamic
。假设该方法没有返回
动态
,则它必须意味着
是动态的。。您需要遵循变量声明链来查看这个
dynamic
的来源。它不会凭空而来。
dynamic
由。任何踩到它的东西,或刷到它上面的东西。一旦你打开一个进入后期绑定区的门户,编译器就会开始变得紧张和偏执。你需要定义代码中的所有内容。向我们展示
变量的类型,
excelReader
变量的类型,以及与返回值相关的“do some work”代码的作用。根据我们可以做出的假设,它应该可以正常工作,但你没有给我们一个相信你的理由。上游的东西是动态的。你需要找出什么。要重申Ed的链接是关于什么的,如果表达式的任何部分是
动态的
,整个表达式将是
动态的
。您认为,
ConvertExcelToRows(excelReader).ToList()是
动态的
,因此该表达式的任何部分都可能是
动态的
,很可能是
excelReader
。如果
excelReader
dynamic
,则
ExcelReaderFactory.CreateOpenXmlReader(stream)
必须是
dynamic
。假设该方法没有返回
动态
,则它必须意味着
是动态的。。您需要遵循变量声明链来查看这个
dynamic
的来源。它不会无缘无故地来的,就在眼前。患者零是
data.docUr
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>();
}