C#使用LINQ和Nullable布尔值

her*_*iod 7 c# nullable ternary-operator implicit-conversion

我有下面的linq查询,它接受一个文本字段,可能是Y,N或DBnull并填充一个布尔值?参数,无论是True,False还是null,具体取决于字段的值.

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
Run Code Online (Sandbox Code Playgroud)

有问题的路线是

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null)
Run Code Online (Sandbox Code Playgroud)

在阅读之后,我发现了一些文档,其中声明内联的第二个和第三个参数需要是相同类型的,或者可以隐式地相互转换.

我的问题是,如何绕过这个限制来实现我想要的结果?

我对C#比较新,所以我还不熟悉它的所有怪癖/功能.

Dyn*_*ard 6

我的建议是用以下代替:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
Run Code Online (Sandbox Code Playgroud)

编译器在没有强制转换的情况下不同意的原因是,即使将其存储为可空结构,三元操作也会检查结果是否通过隐式转换兼容.

结果true并被false视为bool文字,而不是bool?,因此不能隐含地转换为null.投射任何一个结果bool?都会使它们具有可比性.我建议的那个在bool?和之间隐含转换null,这也有效:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;
Run Code Online (Sandbox Code Playgroud)

这是一个bool和之间的隐式转换bool?.我随意喜欢第一个..

  • 这个标记看起来像ASP.NET,我最近一直在使用它.所以在黑暗中随机拍摄:将True替换为true? (2认同)