【问题标题】:Lambda expression with valueof an generic IEnumerable具有通用 IEnumerable 值的 Lambda 表达式
【发布时间】:2016-04-07 14:54:11
【问题描述】:

我有如下声明:

AnotherClass temp = myCustomList
    .Where(x => x.bTyp != null && x.bTyp is IEnumerable<T>)
    .FirstOrDefault();`

上面的声明说tempnull,但它不应该是。

TMyCustomClass 的通用List 作为一个值,例如List&lt;MyCustomClass&gt;

x.bTyp 的值为 typeof(IEnumerable&lt;MyCustomClass&gt;))

调试器给了我myCustomList 这样的东西:

bTyp = {System.Collections.Generic.IEnumerable1[...MyCustomClass]}`

我应该如何重写temp不是null并将返回结果的语句?

【问题讨论】:

  • 你能检查对象本身是否为空而不是类型吗?
  • 是的,但它有 8 个元素(List&lt;MyCustomClass&gt;),所以它不是null
  • @willaien 实际上x.bTyp 有一个动态数据类型(它是一个属性),但它的值此时类似于typeof(IEnumerable&lt;MyCustomClass&gt;))
  • 如果去掉x.bTyp is IEnumerable&lt;T&gt;条件temp还是null?

标签: c# linq generics lambda


【解决方案1】:

Temp 为空,因为 Where() 调用返回 0 个结果,而 FirstOrDefault() 返回默认值(即为空)。

要进行调试,请将光标放在 lambda 表达式中并添加断点(默认值:F9)。运行程序。

当调试器遇到断点时,将布尔表达式(x.bTyp != null 且 x.bTyp 为 IEnumerable)放在监视窗口中以验证所需的结果。您可能在这里遗漏了一些东西。

【讨论】:

  • 好的,但是在该语句之前、期间和之后的当前上下文中不存在名称“x”,因为它是一个 lambda 表达式...
  • 你确定断点在 lambda 表达式的 inside 中吗?你在使用 Visual Studio 吗?如果是,是什么版本?我添加了一张图片以供澄清。
  • 感谢您对调试器的提示。当我输入 x.bTyp 时,我得到(缩短){System.Collections.Generic.IEnumerable'1[...MyCustomClass}....IsGenericType: true...UnderlyingSystemType: {Name = "IEnumerable'1" FullName = "System.Collections.Generic.IEnumerable'1[[...MyCustomClass}TSystem.Collections.Generic.List&lt;...MyCustomClass&gt; 希望这会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多