在我创建的某个库中,我必须使用以下强制转换:
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
发生了。很遗憾,我无法访问此应用程序。所以这是我的问题:
修改
当然,在投射之前我总是执行检查以避免uintsList
为空或空
编辑2
好的,问题解决了,我使用ConvertAll
方法更改了演员,但我仍然不明白它是怎么发生的?
所以这个问题仍困扰着我:代码的相同部分如何在我的计算机上正常运行,并在另一个代码中抛出异常?不同的编译器/环境版本?一些具体的设置?任何人都可以告诉我,我应该在哪里寻找这种情况的原因,以避免将来出现这种情况?
答案 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);