C#互操作不可调用成员'Microsoft.Office.Interop.Excel.Range.End'不能像方法一样使用

Val*_*lip 3 c# excel interop

我正在使用 C# Interop 从工作表中获取一些值,但出现以下错误:

不可调用成员“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;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试如下,事情是有效的:

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

我错过了什么吗?

Han*_*ant 5

看起来您在 C# 编译器中发现了一个错误。该错误实际上存在于解决方法中,由于第一个片段没有的相同原因,它不应该编译。尽管很难确定这是一个错误,但 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;
Run Code Online (Sandbox Code Playgroud)

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

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

很难猜测为什么它在第二个片段中发现 () 括号是可接受的。长得像虫子,游得像虫子,叫起来像虫子,很可能是虫子。通过单击“新问题”按钮让他们知道。我怀疑他们会修复它,但可能有更多的错误。