为什么我得到,"Cannot implicitly convert type 'void' to 'object'"这个代码(EPPlus)?



我使用以下代码在电子表格中使用EPPlus填充一个单元格:

using (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL])
{
    footerMonth1Cell.Value = monthsTruncatedYears[0];
    footerMonth1Cell.Style.Font.Size = DATA_FONT_SIZE;
    footerMonth1Cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
}

我认为它工作得很好,但是一个用户抱怨它在单元格中产生"绿色三角形"。"monthsTruncatedYears"是一个泛型字符串列表。

所以我添加了这个辅助函数:
public static void SetValueIntOrStr(this ExcelRangeBase range, object value)
{
    string strVal = value.ToString();
    if (!String.IsNullOrEmpty(strVal))
    {
        double dVal;
        int iVal;
        if (double.TryParse(strVal, out dVal))
            range.Value = dVal;
        else if (Int32.TryParse(strVal, out iVal))
            range.Value = iVal;
        else
            range.Value = strVal;
    }
    else
        range.Value = null;
}

…我从这里得到的,然后尝试重构原始代码,像这样调用辅助函数:

using (var footerMonth1Cell = prodUsageWorksheet.Cells[columnFooterRow, MONTH1_COL])
{
    footerMonth1Cell.Value = SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);
    footerMonth1Cell.Style.Font.Size = DATA_FONT_SIZE;
    footerMonth1Cell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
}

然而,它不会编译,告诉我,"不能隐式地将类型'void'转换为'object'"

由于传递给SetValueIntOrStr()的第二个参数,即"value",是对象类型,我认为这就是问题所在。那么,为什么编译器明显地将monthsTruncatedYears[0]视为无效呢?在遗留代码中,我将其分配为单元格的值,当时它不是无效的,所以…?!?

我尝试将第二个参数转换为对象,如下所示:

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueIntOrStr(footerMonth1Cell, object(monthsTruncatedYears[0]));

…但是对于"Invalid expression term 'object'"

,也不能计算。

…这个类似的尝试:

footerMonth1Cell.Value = ReportRunnerConstsAndUtils.SetValueDoubleOrIntOrStr(footerMonth1Cell, monthsTruncatedYears[0] as object);

…引发,"不能隐式地将类型'void'转换为'object'"

请注意,helper方法在借来的代码中实际上是错误命名的;而不是"SetValueIntOrStr"它应该是"SetValueDoubleOrIntOrStr"

问题出在

footerMonth1Cell.Value = SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);

SetValueIntOrStr不返回任何值(void),因此不能用于给footerMonth1Cell.Value赋值。

这将是有效的代码,因为Value属性已经在函数内部改变了:

SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);

相关内容

  • 没有找到相关文章

最新更新