Pregunta

Tengo la consulta a continuación linq que tiene un campo de texto que puede ser Y, N o DBNull y rellena un booleano? parámetro, ya sea verdadera, falsa o nula dependiendo del valor del campo.

var dset = from i in tbdc.Talkbacks
       where i.talkback_id == id
       select new Talkback(
               i.talkback_id, i.acad_period, i.reference,
               i.staff_member, i.date_received, i.no_talkers,
               i.gender_id, i.names, i.type_id,
               i.method_id, i.area_id, i.site_id,
               i.category_id, i.date_closed, i.expenddate,
               i.acknowledgementtarget,
               (i.targetmet == "Y") ? true : 
                   ((i.targetmet == "N") ? false : null),
                   (i.acknowledgementtargetmet != "N") ? true : false

La línea problemático es

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null)

Después de leer hasta que se encontró algún tipo de documentación que establece que las 2ª y 3ª argumentos de la línea Cuando la necesidad de ser del mismo tipo o implícitamente convertibles entre sí.

Mi pregunta es, ¿cómo consigo alrededor de esta limitación para lograr el resultado deseado?

Yo soy relativamente nuevo en C #, así que no estoy familiarizado con todas sus peculiaridades / capacidades todavía.

¿Fue útil?

Solución

Mi sugerencia sería sustituir con:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;

la razón por la que el compilador no está de acuerdo, sin el elenco es que incluso si lo guarda en una estructura anulable, las comprobaciones de funcionamiento ternarios si los resultados son compatibles a través de una conversión implícita.

Resultados true y false son tratados como literales bool, no bool?, por tanto, no implícitamente convertible a null. Fundición cause a bool? será hacerlos comparables. El que yo sugerí tiene una conversión implícita entre bool? y null, y esto funciona también:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;

¿Qué es una conversión implícita entre un bool y bool?. Yo prefiero arbitraria el primero ..

Otros consejos

Puede convertir explícitamente una o más de las expresiones a un bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top