2010-01-14 81 views
7

我对以下几点感到困惑。C#.net铸造问题

鉴于这种类:

public class SomeClassToBeCasted 
    { 
     public static implicit operator string(SomeClassToBeCasted rightSide) 
     { 
      return rightSide.ToString(); 
     } 
    } 

当我尝试做以下为什么一个InvalidCastException抛出?

IList<SomeClassToBeCasted> someClassToBeCastedList 
    = new List<SomeClassToBeCasted> {new SomeClassToBeCasted()}; 
IEnumerable<string> results = someClassToBeCastedList.Cast<string>(); 

foreach (var item in results) 
{ 
    Console.WriteLine(item.GetType()); 
} 

回答

16

由于Cast()不与用户指定的类型转换处理 - 仅引用转换(即,正常排序的基准的转化向上或向下的继承层次结构)和拳击/拆箱转换。这与演员在源代码中所做的不一样。不幸的是,这是没有明确记载:(

编辑:只是把杰森的评论进入后,就可以解决这个很容易用投影:

IEnumerable<string> results = originalList.Select(x => (string) x); 
+3

而且,添加,就可以得到 “绕” 这跟'的IEnumerable 结果= someClassToBeCastedList.Select(X =>(串)X);' – jason 2010-01-14 16:14:12

6

如果只需要列表,你可以做

IEnumerable<string> results = 
     someClassToBeCastedList.Select(itm => itm.ToString()); 

代替。

+1

这甚至不使用用户定义的演员,其中OP定义。 – jason 2010-01-14 16:22:21

+0

是的,这就是我的意思。这取决于在其他地方是否需要投射操作员功能。 – herzmeister 2010-01-14 17:23:03

-1

您可以使用此我得了类似的问题,它会帮助你

IEnumerable results = originalList.Select(x =>(string)x);