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

C# Interop Non-invocable member 'Microsoft.Office.Interop.Excel.Range.End' cannot be used like a method

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

Non-invocable member 'Microsoft.Office.Interop.Excel.Range.End' cannot be used like a method.

这是我的代码:

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# 编译器中发现了错误。该错误实际上存在于解决方法中,它 应该 不能编译,原因与第一个代码段没有编译的原因相同。尽管很难确定这是一个错误,但 C# 语言规范并未描述在这种情况下可接受的内容。

Range.End 属性 是一个 索引 属性。 C# 不正式支持此类属性,该语言仅允许 class 索引器(又名 this[])成为 class 的唯一索引 属性。但在 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;

很难猜出为什么它在第二个代码段中发现 () 括号是可接受的。它长得像虫子,游起来像虫子,叫声也像虫子,所以它很可能是虫子。单击 New Issue button 让他们知道。我怀疑他们会修复它,但问题可能比看起来更多。