【发布时间】:2014-12-03 15:09:10
【问题描述】:
我使用带有三元运算符的IEnumerable<string> 和Select 语句有一个奇怪的行为。
我有两个包含不同对象的列表。一个列表包含Enums,另一个列表包含对象。这些对象确实具有String 属性。
如果一个列表是 null 或 empty 我想获取另一个列表的值。
这是一些代码:
public class ExportItem
{
public string Type;
...
}
public enum ExportType
{
ExportType1,
ExportType2,
...
}
List<ExportItem> 始终由配置文件填充。如果提供了命令行参数,则填充 List<ExportType>。因此,如果List<ExportType> 已填满,我想使用它们,否则我想使用配置文件中的那些。
所以我的代码是这样的:
IEnumerable<string> exportTypes = MyListOfExportTypes != null &&
MyListOfExportTypes.Any() ? MyListOfExportTypes.Select(x => x.ToString()) :
MyListOfExportItems.Select(x => x.Type);
问题是 exportTypes 是 null 但我不明白...
当我使用if-else 执行此操作时,一切都按预期工作。此外,如果exportTypes 是List<string> 类型,我在Select 语句之后调用ToList(),一切正常。
使用 var a = MyListOfExportTypes.Select(x => x.ToString()); 和 var b = MyListOfExportItems.Select(x => x.Type); 确实可以按预期工作。
必须是三元运算符和/或IEnumerable。但是什么?
或者我错过了什么?有什么建议?
编辑:
我现在有截图...
请注意,foreach 上面的代码仍然有效...
【问题讨论】:
-
你怎么知道 exportTypes 为空?
-
通过调试代码。
-
如果你打电话给
exportTypes.ToList,你会得到 NullReferenceException 吗? -
它对我来说绝对没问题。你确定
MyListOfExportTypes和MyListOfExportItems都不为空吗?实际上,这可能会产生不同的问题。 -
@Selman22 所以这真的很奇怪。不,我没有!在执行
Select语句并将鼠标悬停在exportTypes上之后,调试器会显示null,但我可以调用ToList(),一切都按预期进行。某种 VS 2010 的错误?
标签: c# linq ienumerable ternary-operator