2008-12-01 16 views

Respuesta

207

El problema no es que no se pueda asignar nulo a un int ?. El problema es que ambos valores devueltos por el operador ternario deben ser del mismo tipo, o uno debe ser implícitamente convertible al otro. En este caso, null no se puede convertir implícitamente en int ni vice-versus, por lo que se necesita un lanzamiento explícito. Tal vez puedas probar:

int? accom = (accomStr == "noval" ? (int?)null : Convert.ToInt32(accomStr)); 
+3

Es interesante - que en realidad no necesita el elenco de Convert.ToInt32 ... –

+1

es porque System.Int32 = System.Nullable

+1

Por qué hace mucho tiempo! ? trabajar sin el elenco? –

36

Qué dice Harry S es exactamente correcto, pero

int? accom = (accomStr == "noval" ? null : (int?)Convert.ToInt32(accomStr)); 

también haría el truco. (Nos ReSharper los usuarios siempre pueden detectar uno al otro en las multitudes ...)

+1

Ahora que es bueno, ¡eso es solo una diferencia sutil pero muy simple! ¿Podría +2 si pudiera (a pesar de ser algo tan pequeño) =) – Coops

5

Otra opción es utilizar

int? accom = (accomStr == "noval" ? Convert.DBNull : Convert.ToInt32(accomStr); 

que éste más me gusta.

+0

¿De verdad lo intentó? Debería dar el error "No se puede convertir implícitamente el tipo 'objeto' a 'int' '. Existe una conversión explícita (¿falta un molde?) –

1

mismo modo que lo hizo por mucho tiempo:

myLongVariable = (!string.IsNullOrEmpty(cbLong.SelectedItem.Value)) ? Convert.ToInt64(cbLong.SelectedItem.Value) : (long?)null; 
Cuestiones relacionadas