Domanda

Ho la domanda sotto LINQ che prende un campo di testo che può essere Y, N o DBNull e popola un valore booleano? parametro con True, False o nulla a seconda del valore 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 linea problematico è

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

Dopo aver letto ho trovato alcuni documenti in cui si afferma che il 2 ° e 3 ° argomenti della linea, se necessità di essere dello stesso tipo o la conversione implicita tra loro.

La mia domanda è: come faccio ad avere intorno a questa limitazione per raggiungere il mio risultato desiderato?

Sono relativamente nuovo per C # in modo da non conosco tutte le sue stranezze / capacità ancora.

È stato utile?

Soluzione

Il mio suggerimento sarebbe quello di sostituirlo con:

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

la ragione per cui il compilatore non è d'accordo, senza il cast è che anche se si memorizza in una struttura nullable, i ternari verifiche di funzionamento se i risultati sono compatibili attraverso una conversione implicita.

Risultati true e false sono trattati come letterali bool, non bool?, quindi non implicitamente convertibile in null. Casting entrambi risultati a bool? li renderà comparabili. Quello che ho suggerito ha una conversione implicita tra bool? e null, e questo funziona anche:

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

Il che è una conversione implicita tra un bool e bool?. Ho arbitraria preferisco il primo ..

Altri suggerimenti

È possibile convertire in modo esplicito una o più delle espressioni a un bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top