C#.net铸造问题
我对以下几点感到困惑。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());
}
由于Cast()
不与用户指定的类型转换处理 - 仅引用转换(即,正常排序的基准的转化向上或向下的继承层次结构)和拳击/拆箱转换。这与演员在源代码中所做的不一样。不幸的是,这是没有明确记载:(
编辑:只是把杰森的评论进入后,就可以解决这个很容易用投影:
IEnumerable<string> results = originalList.Select(x => (string) x);
如果只需要列表,你可以做
IEnumerable<string> results =
someClassToBeCastedList.Select(itm => itm.ToString());
代替。
这甚至不使用用户定义的演员,其中OP定义。 – jason 2010-01-14 16:22:21
是的,这就是我的意思。这取决于在其他地方是否需要投射操作员功能。 – herzmeister 2010-01-14 17:23:03
您可以使用此我得了类似的问题,它会帮助你
IEnumerable results = originalList.Select(x =>(string)x);
而且,添加,就可以得到 “绕” 这跟'的IEnumerable结果= someClassToBeCastedList.Select(X =>(串)X);' –
jason
2010-01-14 16:14:12