如何在 system.array - C# 中保留 null?
Posted
技术标签:
【中文标题】如何在 system.array - C# 中保留 null?【英文标题】:How to preserve null in system.array - C#? 【发布时间】: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。 【参考方案1】:看看你在做什么Cast
会比OfType
更合适。
List<object> Array = myvalues.Cast<object>().ToList();
这应该做你想做的,基本上只是告诉它所有对象都应该被转换为类型对象。这将保留 null。
差异的原因是OfType
在返回转换对象之前检查current is TResult
,当然null is object
将返回false,因此它被丢弃。这样的推论当然是Cast
可以在滥用时抛出异常(例如,上面示例中的Cast<int>
会抛出InvalidCastException
而OfType<int>
只会返回可以转换为整数的项目。
发件人: CAST AND OFTYPE
有一个重要的案例需要考虑 Cast 将在哪里成功 返回一个值,OfType 将忽略它:空引用(带有 可空返回类型)。在普通代码中,您可以强制转换空引用 到任何可为空的类型(无论是引用类型还是可为空的 值类型)。但是,如果您使用带有 null 的“is”C# 运算符 值,它将始终返回 false。 Cast 和 OfType 遵循相同的 基本上是规则。
【讨论】:
但如果object
是System.Object
他也可以使用OfType
,因为一切都继承自它。好吧,not quite everything.
@TimSchmelter 除了null
的类型在使用OfType
时无法确定,因此省略。
@TimSchmelter:但重点是 OfType
正在删除他的 null 而 Cast
没有...
@Chris:我不知道。学到了一些新东西:) 为什么会这样?
@TimSchmelter:在注释中添加。基本上Cast
不会在强制转换之前检查类型(所以如果你不小心会返回强制转换异常),而OfType
会检查 null 不同意的类型。当我能教一个拥有超过 180,000 名代表的人时,它总是很好。 ;-)以上是关于如何在 system.array - C# 中保留 null?的主要内容,如果未能解决你的问题,请参考以下文章