2014-02-01 4 views
1

У меня есть функция вроде этого:Ошибка при вызове функции с int? в качестве входных данных

public int? calculateContractPrice(int? comid) 
    { 
     int? sum = 0; 
     var q = from i in dbconnect.tblMaterialGroups 
       where i.tenderId == _tenderId 
       select i.id; 
     foreach (int i in q) 
     { 
      var q2 = from g in dbconnect.tblMaterialTenderAnnouncePrices 
        where g.MaterialGroupId == i && g.companyId == comid 
        select g; 
      sum = q2.First().amount*q2.First().price + q2.First().amount*q2.First().PriceForElse + sum; 


     } 
     return sum+(from i in dbconnect.tblContracts where i.tender==_tenderId select i.tax).First(); 
    } 

Так что, когда я называю эту функцию:

int coid = Convert.ToInt32(gvcompanyInTender.CurrentRow.Cells[0].Value.ToString()); 

    objco.Tax =int.Parse((objco.calculateContractPrice(coid)) * (6/100)); 

Я получил эту ошибку: Я думаю, что проблема в том, что в междунар? что я определил, но я не знаю, как я могу это решить.

Error 19 The best overloaded method match for 'int.Parse(string)' has some invalid arguments 

ответ

0

Результат (objco.calculateContractPrice(coid)) * (6/100) является int? значение, а не string, так что вы не можете назвать int.Parse на ней, и не было бы никаких оснований.

Другая проблема заключается в том, что результат этого вычисления будет 0 если результат calculateContractPrice не равен нулю, так как 6/100 равно 0 под целочисленного деления.

В идеале, вы должны проверять, является ли нуль перед использованием его значение, так как это int?:

int? contrPrice = objco.calculateContractPrice(coid); 
if(contrPrice == null) 
{ 
    // error handling 
} 
else 
{ 
    objco.Tax = (int)(contrPrice * (6D/100)); 
} 
+0

objco.tax является атрибутом класса, и это целое – SSC

+0

Хорошо, но вам не нужна 'Int. Parse', чтобы преобразовать 'int' в' int'. Это уже «int». – JLRishe

+0

он работает .thanks – SSC

0

int.Parse принять string в качестве аргумента, вам нужно изменить:

objco.Tax =int.Parse((objco.calculateContractPrice(coid)) * (6/100)); 

:

objco.Tax =int.Parse(((objco.calculateContractPrice(coid)) * (6/100)).ToString()); 
0

Th е ошибки сводится к этому выражению

(objco.calculateContractPrice(coid)) * (6/100) 

Тип этой операции int? не String. Метод int.Parse ожидает String и, следовательно, ошибки, когда вы даете ему int?.

Для преобразования int? к значению int вам необходимо либо использовать Value или выбрать соответствующее значение по умолчанию для случая, когда оно null. Свойство Value выбросит, когда значение null поэтому я рекомендую использовать ?? и выбрать подходящее по умолчанию

objco.Tax = ((objco.calculateContractPrice(coid)) * (6/100)).Value; 
// Or 
objco.Tax = ((objco.calculateContractPrice(coid)) * (6/100)) ?? 0; 
Смежные вопросы