2012-03-20 69 views
5

可能重复:
IEnumerable.Cast<>使用Cast转换int []为double [] <T>?

人们可以从int翻一番隐式转换。 为什么“指定的转换无效”。这里提出异常吗?

double[] a = Enumerable.Range(0, 7).Cast<double>().ToArray(); 

我试过了它的几个“版本”。

P.S.我知道可能的解决方案,如:

double[] a = Enumerable.Range(0, 7).Select(x => (double)x).ToArray(); 

但我很好奇铸造工作=>为什么它不起作用在这个例子看起来如此明显。

回答

4

Cast用于将IEnumerable(无类型)变成IEnumerable<T>(一般键入)。它实际上并不会对任何成员造成不同的影响。

this answer

好了,你有演员的不正确的期待,这一切 - 它的意思 处理装箱/拆箱,参考和身份转换, 这一切。这是不幸的文件是不是明确的,因为 它可能是

所以,你坚持.Select()

+0

有鉴于此,“铸造”int x = 42; double d =(double)x;'工作? – 2012-03-20 21:47:12

+3

难道我把这个问题作为一个重复而不是提供你所链接问题的接受答案是更合适的吗? – 2012-03-20 21:49:19

+0

+1 Btw:选择比Cast更快,测试多次。 – 2012-03-20 21:52:49

3

失败的原因是因为基本上你这样做:

 int x = 10; 
     object f = x; 
     double d = (double) f; 

int是越来越盒装入对象,当你去拆箱它,你想它拆箱到双。

更具体地说,这里的演员的实现:

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) 
{ 
    IEnumerable<TResult> enumerable = source as IEnumerable<TResult>; 
    if (enumerable != null) 
    { 
     return enumerable; 
    } 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return Enumerable.CastIterator<TResult>(source); 
} 

private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source) 
{ 
    foreach (object current in source) 
    { 
     yield return (TResult)current; 
    } 
    yield break; 
} 

正如你可以看到,它的循环通过IEnumerable和拳击源的每个元素。然后它会试图解开你炸毁的那一点。