Question

J'ai la requête ci-dessous LINQ qui prend un champ de texte qui peut être Y, N ou DBNull et Remplit un booléen? paramètre soit vrai, faux ou nulle en fonction de la valeur du champ.

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 ligne est problématique

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

Après avoir lu je l'ai trouvé une documentation qui précise que les 2e et 3e arguments de la ligne si besoin d'être du même type ou être implicitement convertible en un autre.

Ma question est, comment puis-je contourner cette limitation pour atteindre mon résultat désiré?

Je suis relativement nouveau à C # alors je ne suis pas familier avec tous encore ses bizarreries / capacités.

Était-ce utile?

La solution

Ma suggestion serait de le remplacer par:

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

la raison pour laquelle le compilateur ne sont pas d'accord sans le casting est que même si vous stockez dans une structure annulable, les contrôles de fonctionnement ternaires si les résultats sont compatibles grâce à une conversion implicite.

Résultats true et false sont traités comme littérales bool, pas bool?, convertible donc pas implicitement null. Soit coulée résultats à bool? va les rendre comparables. Celui que je suggère a une convertion implicite entre bool? et null, et cela fonctionne aussi:

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

Ce qui est une conversion implicite entre un bool et bool?. Je préfère arbitraire le premier ..

Autres conseils

Vous pouvez convertir explicitement un ou plusieurs des expressions à un bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top