C# 使用 LINQ 和 Nullable Boolean

标签 c# nullable ternary-operator implicit-conversion

我有下面的 linq 查询,它接受一个可能是 Y、N 或 DBnull 的文本字段并填充一个 bool 值?参数为 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

有问题的行是

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

阅读后我发现了一些文档,其中指出内联的第二个和第三个参数需要是同一类型或可以隐式转换为另一个。

我的问题是,如何绕过这个限制以达到我想要的结果?

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

最佳答案

我的建议是将其替换为:

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

编译器在没有转换的情况下不同意的原因是,即使您将其存储到可空结构中,三元运算也会通过隐式转换检查结果是否兼容。

结果 truefalse 被视为 bool 文字,而不是 bool?,因此不能隐式转换为。将任一结果转换为 bool? 将使它们具有可比性。我建议的那个在 bool?null 之间有一个隐式转换,这也有效:

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

哪个是 boolbool? 之间的隐式转换。我更喜欢第一个..

关于C# 使用 LINQ 和 Nullable Boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182374/

相关文章:

c# - 我应该在这里实现 IDisposable 吗?

c# null for System.drawing.PointT

javascript - 如果 Ramda ifElse 抽象了一个三元运算,那么它是一个有效的模式吗

c++ - 三元运算符中为什么不能使用braced-init-list?

c# - 匹配 2 个具有相同实例名称的不同对象

c# - 报表查看器字体仅在 WIndows 服务器计算机上变长

c# - 如何获取 Nullable<T> 实例的类型

c# - 反射 - 检查所有可为空的属性是否有值

c++ - 与运行时相比,为什么三元运算符在编译时的工作方式不同?

c# - "Using"语句如何从 C# 转换为 VB?