【问题标题】:C# using LINQ and Nullable BooleanC# 使用 LINQ 和 Nullable Boolean
【发布时间】:2011-03-12 01:48:35
【问题描述】:

我有下面的 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

有问题的行是

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

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

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

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

【问题讨论】:

    标签: c# nullable ternary-operator implicit-conversion


    【解决方案1】:

    我的建议是将其替换为:

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

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

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

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

    这是boolbool? 之间的隐式转换。我任意喜欢第一个..

    【讨论】:

    • Dynami 效果很好。我现在遇到了一个问题,我试图在 DisplayTemplate 中使用以下代码中的值:" %> 这个想法是它会显示一个刻度图像为真,交叉图像为假,没有图像未定义(还没有完成那部分代码)。我收到错误消息“当前上下文中不存在名称 'True'”
    • 这个标记看起来像我最近经常使用的 ASP.NET。所以在黑暗中随机拍摄:将 True 替换为 true ?
    • 使用包含 Dynami 解决方案的静态方法 bool Parse(string s) 创建一个名为 BoolHelper 的静态类。然后用它来简化你的解析器。
    【解决方案2】:

    您可以将一个或多个表达式显式转换为bool?

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

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 2023-03-31
      • 2021-01-12
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多