铸造uint - >双重无效?

时间:2010-02-28 17:28:02

标签: c# generics

在我创建的某个库中,我必须使用以下强制转换:

public void Foo(IList<uint> uintsList) // I need to use uint in the interface for this method
{
    List<double> doublesList = uintsList.Cast<double>().ToList();
    // Do something with the doublesList
}

我认为演员uint - &gt; double应始终有效,在我的测试期间,它始终正常。

但是在使用此方法的应用程序中InvalidCastException发生了。很遗憾,我无法访问此应用程序。所以这是我的问题:

  • 可能导致此异常的原因是什么?铸造uint-&gt; double是否始终有效?
  • 如何保护我的算法以避免此异常?

修改
当然,在投射之前我总是执行检查以避免uintsList为空或空

时的情况

编辑2 好的,问题解决了,我使用ConvertAll方法更改了演员,但我仍然不明白它是怎么发生的?
所以这个问题仍困扰着我:代码的相同部分如何在我的计算机上正常运行,并在另一个代码中抛出异常?不同的编译器/环境版本?一些具体的设置?任何人都可以告诉我,我应该在哪里寻找这种情况的原因,以避免将来出现这种情况?

2 个答案:

答案 0 :(得分:5)

.Cast方法并不意味着执行类似的转换。它只是在继承层次结构中执行转换。

此行为的原因是扩展方法签名采用IEnumerable而非IEnumerable<T>。因此,获取枚举器的Current属性会向object方法返回Cast。当然,您不能直接将一种类型的值类型拆分为另一种类型。基本上,Cast会执行以下操作:

int i = 42;
object o = i;
double d = (double)o; // fails.

答案 1 :(得分:4)

请参阅:C# Converting List<int> to List<double>

演员uint - &gt; double有效,但您正在将一个uints列表转换为双精度列表。在大多数体系结构中,列表的大小甚至不同(以字节为单位) - 您需要创建一个全新的列表并单独转换每个元素。我会使用ConvertAll

List<double> doublesList = uintsList.ConvertAll(x => (double)x);