【问题标题】:Why am I getting, "Cannot implicitly convert type 'void' to 'object'" with this code (EPPlus)?为什么我会得到“无法使用此代码 (EPPlus) 将类型 'void' 隐式转换为 'object'”?
【发布时间】:2017-03-25 06:10:18
【问题描述】:

我使用此代码使用 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;
}

...我从here 得到的,然后尝试重构原始代码以调用该辅助函数,如下所示:

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() 的第二个参数,即“值”,是对象类型,我认为这就是问题所在。那么为什么编译器显然认为monthsTruncatedYears[0] 是无效的呢?在遗留代码中,我将它作为值分配给单元格,当时它不是无效的,所以...?!?

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

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

...但这也不会计算“无效的表达式术语'object'”

...以及类似的尝试:

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

...引出,“不能将类型 'void' 隐式转换为 'object'”

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

【问题讨论】:

    标签: excel epplus epplus-4


    【解决方案1】:

    问题是线

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

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

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

    SetValueIntOrStr(footerMonth1Cell, monthsTruncatedYears[0]);
    

    【讨论】:

    • 当然/我应该意识到这一点。
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2020-07-31
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2016-02-17
    相关资源
    最近更新 更多