我对以下内容感到有点困惑.
鉴于此类:
public class SomeClassToBeCasted
{
public static implicit operator string(SomeClassToBeCasted rightSide)
{
return rightSide.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试执行以下操作时,为什么会抛出InvalidCastException?
IList<SomeClassToBeCasted> someClassToBeCastedList
= new List<SomeClassToBeCasted> {new SomeClassToBeCasted()};
IEnumerable<string> results = someClassToBeCastedList.Cast<string>();
foreach (var item in results)
{
Console.WriteLine(item.GetType());
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 16
因为Cast()不处理用户指定的强制转换 - 仅引用转换(即继承层次结构中向上或向下的引用的正常转换)和装箱/取消装箱转换.这与演员在源代码中的作用不同.不幸的是,这没有明确记录:(
编辑:只是为了将Jason的评论带入帖子中,您可以通过投影轻松解决这个问题:
IEnumerable<string> results = originalList.Select(x => (string) x);
Run Code Online (Sandbox Code Playgroud)
如果仅需要列表,则可以执行此操作
IEnumerable<string> results =
someClassToBeCastedList.Select(itm => itm.ToString());
Run Code Online (Sandbox Code Playgroud)
代替.