C#Interop非可调用成员“Microsoft.Office.Interop.Excel.Range.End”不能像方法一样使用

我正在使用C#互操作从工作表中获取一些值,我得到以下错误:

非可调用成员“Microsoft.Office.Interop.Excel.Range.End”不能像方法一样使用。

这是我的代码:

var wb = (Excel.Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; var wsEvars = wb.Sheets["Evars"]; var wsProps = wb.Sheets["Props"]; var wsEvents = wb.Sheets["Events"]; var wsListVars = wb.Sheets["List Vars"]; var sheetList = new Excel.Worksheet[] { wsEvars, wsProps, wsEvents, wsListVars }; for (var i = 0; i < sheetList.Length; i++) { // I get the error on the line below var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count].End(Excel.XlDirection.xlUp).Row; } 

事情是这样的,如果我尝试如下:

 for (var i = 0; i < sheetList.Length; i++) { var rowLast = wsEvars .Range["I" + wsEvars .Rows.Count].End(Excel.XlDirection.xlUp).Row; } 

我错过了什么吗?

看起来你在C#编译器中发现了一个bug。 该错误实际上是在解决方法中出现的,它不应该由于第一个片段没有的相同原因而编译。 尽pipe很难确定这是一个bug,但是C#语言规范并没有描述在这种情况下可以接受的东西。

Range.End属性是一个索引属性。 这些属性在C#中没有正式的支持,语言只允许类索引器(又名this[] )成为类的唯一索引属性。 但是这个限制在C#版本4中得到了解决,特别是与COM服务器的交互更加容易。 像Excel一样,索引属性在COM对象模型中非常常见。

和普通的索引器一样,你必须使用方括号。 固定:

  var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count] .End[Excel.XlDirection.xlUp].Row; 

您必须在较旧的C#版本中使用的解决方法仍然可用:

  var rowLast = sheetList[i].Range["I" + sheetList[i].Rows.Count] .get_End(Excel.XlDirection.xlUp).Row; 

很难猜测为什么它发现()括号在第二个片段中可以接受。 它看起来像一个bug,像一个bug游泳,像一个bug一样呱呱叫,所以这可能是一个错误。 让他们通过单击新问题button来了解它。 我怀疑他们会解决这个问题,但是可能会有更多的错误而不是眼前的问题。