操作员在不能应用'object'和& # 39;int # 39;

本文关键字:int 不能 应用 object 操作员 | 更新日期: 2023-09-27 18:06:08

    int i_cnt;    
    int i_row;
    i_cnt = 0;
    i_row = 0;
    foreach (DataRow dr_ledger in ds_main.Tables["PandL_New"].Rows) {
        if (((dr_ledger[4] == "SALES ACCOUNTS") 
                    || ((dr_ledger[4] == "PURCHASE ACCOUNTS") 
                    || ((dr_ledger[4] == "OPENING STOCK") 
                    || (dr_ledger[4] == "CLOSING STOCK"))))) {
               i_sum = (i_sum++(dr_ledger[(11) + (12)]));
        }
        if ((dr_ledger[4] == "PROFIT & LOSS A/C")) {
            i_row = i_cnt;
        }
        i_cnt = (i_cnt + 1);
    }
    if ((i_sum == 0)) {
        if ((ds_main.Tables["PandL_New"].Rows[i_row][11] + (ds_main.Tables["PandL_New"].Rows[i_row][12] > 0))) {
            ds_main.Tables["PandL_New"].Rows[i_row][4] = "EXCESS of INCOME OVER EXPENDITURE";
        }
        else {
            ds_main.Tables["PandL_New"].Rows[i_row][4] = "EXCESS OF EXPENDITURE OVER INCOME";
        }
    }

这是出现的两个错误,不允许我编译:

1号线;(i_sum + + (dr_ledger [(11) + (12)]));

第2行;(ds_main.Tables["PandL_New"。行[i_row][12]比;

0)))

1)。方法名称

2)。操作符'>'不能应用于'object'和'int'类型的操作数

最初是在VB中实现的。代码如下:

For Each dr_ledger In ds_main.Tables("PandL").Rows
    If
        dr_ledger.Item(2).tolower = "SALES ACCOUNTS".ToLower Or
        dr_ledger.Item(2).tolower = "PURCHASE ACCOUNTS".ToLower Or
        dr_ledger.Item(2).tolower = "OPENING STOCK".ToLower Or
        dr_ledger.Item(2).tolower = "CLOSING STOCK".ToLower
    Then
        i_sum = i_sum + dr_ledger.Item(7)
    End If
    If dr_ledger.Item(2).tolower = "PROFIT & LOSS A/C".ToLower
    Then
        i_row = i_cnt
    End
    If i_cnt = i_cnt + 1
        //...

实际上,从将此代码转换为c#....

操作员在不能应用'object'和& # 39;int # 39;

据我所知:

i_sum = (i_sum+(dr_ledger[(11) + (12)]));

Convert.ToInt32(ds_main.Tables["PandL_New"].Rows[i_row][12]) > 0

要在c#中应用><操作符,您要应用它们的对象必须实现IComparable Interface (https://msdn.microsoft.com/en-us/library/system.icomparable(v=vs.110).aspx)。

默认object不实现此接口,因此不能应用</>操作符。根据对象的类型,可以将其强制转换为IComparable,然后应用<>操作符。

public bool Compare(object a, object b)
{
    var compA = (IComparable)a;
    var compB = (IComparable)b;
    return compA > compB;
}

但是,如果a或b是不实现IComparable类型的对象,这将不起作用(并抛出异常)。

用你的代码,我猜ds_main.Tables["PandL_New"].Rows[i_row][12]的值返回一个DataRow.Item (https://msdn.microsoft.com/en-us/library/kwfe1t7z(v=vs.110).aspx),这是一个项目,不一定要实现icomable接口。如果您尝试将其强制转换为IComparable,那么应用>操作符应该可以工作:

((IComparable) ds_main.Tables["PandL_New"].Rows[i_row][12]) > 0

对于第一期,您期望(i_sum++(dr_ledger[(11) + (12)]));做什么?int类型的++操作符将迭代它(与说i = i + 1相同),并且不接受任何参数。

编辑:考虑到现在提供的VB,行:

 i_sum = (i_sum++(dr_ledger[(11) + (12)]));

应替换为:

 i_sum = i_sum + ((int) dr_ledger[7]);

----------原始答案

如果要将dr_ledger[(11) + (12)]的值添加到i_sum,则需要使用+=+运算符:

i_sum+=(dr_ledger[(11) + (12)]);
// or
i_sum = i_sum + (dr_ledger[(11) + (12)]);

然而,这里dr_ledger[(11) + (12)]将评估为dr_ledger[23],所以我不确定为什么你有(11)+ (12)?

相关文章: