【发布时间】:2016-05-31 18:25:02
【问题描述】:
我有一些代码接受一个值(对象类型)并尝试将其转换为整数和 uint 的 IEnumerable,如下所示:
var idList = value as IEnumerable<int>;
var uintList = value as IEnumerable<uint>;
当值以这种方式初始化时:
uint number = 1;
object value = new []{ number };
idList 和 uintList 都有值,但调用 idList.ToList() 会导致 ArrayTypeMismatchException。但是,当使用new List<uint>{ number } 生成该值时,idList 如预期的那样为空。
此外,在 VS 2015 的即时窗口中调用 var idList = value as IEnumerable<int>; 会返回 null,正如我所料,即使该值是使用集合初始化程序生成的。
.Net fiddle reproducing the error here.
这是怎么回事?
【问题讨论】:
-
你可以看看这个堆栈溢出帖子:stackoverflow.com/questions/7173266/…
-
如果我像你一样初始化
value,那么var idList = value as IEnumerable<int>;行会给我一个编译时错误,而不是运行时异常 -
嗯,这里没有编译错误,但我意识到在简化代码路径时我遗漏了该值已被强制转换为对象类型,然后再被强制转换回 IEnumerable。将相应地添加到问题中,谢谢。
-
我认为部分问题在于您正试图进行从
IEnumerable<uint>到IEnumerable<int>的隐式转换。因为这些是 IEnumerables,所以我认为它们正在被懒惰地评估。当您致电ToList时,您会强制评估对象。另请注意,没有从 uint 到 int 的隐式转换。 uint.MaxValue 是 int.MaxValue 的两倍。 uint.MinValue 当然是零。