2

this is my code :

int? BankName_dd = 
int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ? 
int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) : null;

but I don't understand why this error is being raised any suggestions ?

bash.d
  • 13,029
  • 3
  • 29
  • 42
Sora
  • 2,465
  • 18
  • 73
  • 146

3 Answers3

2

it happens because compiler tries to evaluate the right hand side first.

int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) is int and not nullable so there is a mismatch between parameters i.e int and null

Even this would be fine if you do it. this now wakes the first parameter as nullable int

int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ? (int?)int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue):null;

SO already answered Link

Community
  • 1
  • 1
Anand
  • 14,545
  • 8
  • 32
  • 44
1

do it like this

int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ? int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue):(int?)null;

Your code can be refactored though

int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue);

if(BankName_dd.Value == -1)
   BankName_dd = null;

Reason. The relevant section of the C# 3.0 spec is 7.13, the conditional operator:

The second and third operands of the ?: operator control the type of the conditional expression. Let X and Y be the types of the second and third operands. Then,

If X and Y are the same type, then this is the type of the conditional Otherwise, if an implicit conversion (§6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression. Otherwise, if an implicit conversion (§6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression. Otherwise, no expression type can be determined, and a compile-time error occurs.

Ehsan
  • 31,833
  • 6
  • 56
  • 65
1

result = expression1 ? expression2 : expression3;

Both expression2 and expression3 must be of the same type. And null is not a valid int, so if expression2 is an int, null is not allowed for expression3. You could use int? as type for both by casting null to it and using the implicit conversion of int to int? on the left side.

Your expression doesn't make a lot of sense though. You are doing all the work twice.

var result = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue); 

int? BankName_dd = null;

if(result != -1) BankName_dd = result;
nvoigt
  • 75,013
  • 26
  • 93
  • 142