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

3
我正在使用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;
}

我有什么遗漏吗?

1个回答

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;

在旧版C#中需要使用的解决方法仍然可用:

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

很难猜测为什么第二个片段中的 () 括号是可以被接受的。看起来像一个 bug,游泳像一个 bug,嘎嘎叫像一个 bug,所以很可能是一个 bug。通过点击“新问题”按钮(New Issue button)告诉他们这个问题。我怀疑他们会修复它,但可能有更多问题超出你的想象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接