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>();
}