【问题标题】:?? operator returns null when both values are not null??当两个值都不为 null 时,运算符返回 null
【发布时间】:2014-03-04 07:38:33
【问题描述】:
class ResultType 
{
    public string Value{ get; set; }
    public int Count{ get; set; }
}
var someList = new List<ResultType>(){new ResultType(){Value = "A"},new ResultType(){Value = "B"}};

ResultType z = someList.FirstOrDefault(x => x.Value == "A") ?? 
        someList.FirstOrDefault(x => x.Value == "B");

z 应该获取 Value 为 A 的项目的值(它的项目的值为 A 和 B,它们不为空!)但我收到 null,为什么会发生这种情况?

 if(someList.FirstOrDefault(x => x.Value == "A")!=null) z= someList.FirstOrDefault(x => x.Value == "A");

这行得通。

当我这样做时

someList.FirstOrDefault(x => x.Value == "A") 

someList.FirstOrDefault(x => x.Value == "B")

保存到变量中,然后用作

z = a ?? b 

这个也可以

请注意,这两个值都不为空!

截图 https://www.dropbox.com/s/ogq89shme1mhg44/Untitled.png

【问题讨论】:

  • someList 的类型是什么? (即可以是值类型)
  • 可能很小a?不是大写?或Value 属性可能是Object 类型
  • 尝试创建一个 for 并打印所有值以检查里面有什么。
  • 类型是一些自定义结构,包含一个字符串(值)和 int
  • 尝试 someList.FirstOrDefault(x => x.Value.Equals("A"));只是为了确保您不会比较对象引用。

标签: c# linq


【解决方案1】:

为什么会这样?

答案很简单——既不存在值等于“A”的项目,也不存在值等于“B”的项目。请记住 - 值应该完全是“A”和“B” - 没有任何空格的大写字符串。

更新:您的示例代码运行良好。如上所述 - 如果你得到 null,那么你搜索的值都不存在于集合中。

【讨论】:

  • 这可能发生,即使它存在但Value 的类型为Object
  • @SriramSakthivel 不,如果Valueobject,实际上是string,那么比较将毫无问题
  • 完全相同的值,请参见下面的代码,无需 ??
  • 你错了;您忘记了这样一个事实:如果您使用 == 运算符将 Objectstring 进行比较,那么它将作为 reference 比较而不是 value 比较进行比较。跨度>
  • @atikot 你能提供重现你的问题的代码吗? IE。从您的应用程序中复制粘贴期间值
【解决方案2】:

因为您的两个 linq 查询的结果都可能为空。换句话说

someList.FirstOrDefault(x => x.Value == "A")

返回 null 和

someList.FirstOrDefault(x => x.Value == "B")

返回空值。因此你得到 ​​p>

z=null

【讨论】:

    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/ms173224.aspx

    ??运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。

    如果除了 null 没有其他选择,你希望它返回什么?

    【讨论】:

    • 这些值不为空,请参阅我添加的代码,没有 ??运算符
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2012-08-23
    • 2016-12-11
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多