C#.net投射问题

jbe*_*ert 7 .net c#

我对以下内容感到有点困惑.

鉴于此类:

    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(x =>(string)x)来"绕"这个; (3认同)

her*_*ter 6

如果仅需要列表,则可以执行此操作

IEnumerable<string> results =
        someClassToBeCastedList.Select(itm => itm.ToString());
Run Code Online (Sandbox Code Playgroud)

代替.