【问题标题】:How to preserve null in system.array - C#?如何在 system.array - C# 中保留 null?
【发布时间】:2015-01-22 04:45:58
【问题描述】:

我得到了带有以下代码的 Excel 工作表的第一行。

Excel.Range firstRow = ws.UsedRange.Rows[1];
var row = (System.Array) firstRow.Cells.Value;
List<object> Array = row.OfType<object>().ToList();

row 由空值组成。

例如。

问题是转换成list的时候,所有的null值都丢失了。 (在此声明之后)

 List<object> Array = row.OfType<object>().ToList();

例如。

任何想法如何防止这种情况发生?

【问题讨论】:

  • @TimSchmelter:为清晰起见已更新 :)
  • @Chris:已更新为正确的 code-sn-p。

标签: c# .net excel system.array


【解决方案1】:

看看你在做什么Cast会比OfType更合适。

List<object> Array = myvalues.Cast<object>().ToList();

这应该做你想做的,基本上只是告诉它所有对象都应该被转换为类型对象。这将保留 null。

差异的原因是OfType 在返回转换对象之前检查current is TResult,当然null is object 将返回false,因此它被丢弃。这样的推论当然是Cast 可以在滥用时抛出异常(例如,上面示例中的Cast&lt;int&gt; 会抛出InvalidCastExceptionOfType&lt;int&gt; 只会返回可以转换为整数的项目。

发件人: CAST AND OFTYPE

有一个重要的案例需要考虑 Cast 将在哪里成功 返回一个值,OfType 将忽略它:空引用(带有 可空返回类型)。在普通代码中,您可以强制转换空引用 到任何可为空的类型(无论是引用类型还是可为空的 值类型)。但是,如果您使用带有 null 的“is”C# 运算符 值,它将始终返回 false。 Cast 和 OfType 遵循相同的 基本上是规则。

【讨论】:

  • 但如果objectSystem.Object 他也可以使用OfType,因为一切都继承自它。好吧,not quite everything.
  • @TimSchmelter 除了null的类型在使用OfType时无法确定,因此省略。
  • @TimSchmelter:但重点是 OfType 正在删除他的 null 而 Cast 没有...
  • @Chris:我不知道。学到了一些新东西:) 为什么会这样?
  • @TimSchmelter:在注释中添加。基本上Cast 不会在强制转换之前检查类型(所以如果你不小心会返回强制转换异常),而OfType 会检查 null 不同意的类型。当我能教一个拥有超过 180,000 名代表的人时,它总是很好。 ;-)
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 2011-02-08
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多