代码之家  ›  专栏  ›  技术社区  ›  Marty Neal

IEnumerable.Cast不调用Cast重载

  •  2
  • Marty Neal  · 技术社区  · 16 年前

    public class Class1
    {
        public string prop1 { get; set; }
        public int prop2 { get; set; }
    
        public static explicit operator Class2(Class1 c1)
        {
            return new Class2() { prop1 = c1.prop1, prop2 = c1.prop2 };
        }
    }
    
    public class Class2
    {
        public string prop1 { get; set; }
        public int prop2 { get; set; }
    }
    
    void Main()
    {
        Class1[] c1 = new Class1[] { new Class1() {prop1 = "asdf",prop2 = 1}};
    
        //works
        Class2 c2 = (Class2)c1[0];
    
        //doesn't work: Compiles, but throws at run-time
        //InvalidCastException: Unable to cast object of type 'Class1' to type 'Class2'.
        Class2 c3 = c1.Cast<Class2>().First();
    }
    
    1 回复  |  直到 16 年前
        1
  •  8
  •   Reed Copsey    16 年前

    这个 Cast<T> 函数作用于 IEnumerable ,不是 IEnumerable<T> . 因此,它将实例视为 System.Object

    要执行此方法,应改用Select():

    Class2 c3 = c1.Select(c => (Class2)c).First();