2010-06-08 2 views
2

나는 길에 대해 뭔가를 이해하지 못하고 있습니다. 캐스트가 작동합니다. 명시 적 (암시 적으로 실패 함에도 불구하고) 캐스팅이 정의되어 있는데,이 캐스팅은 "정기적으로"사용할 때 작동하지만, .Cast를 사용하려고 할 때는 작동하지 않는 것으로 보입니다. 왜? 여기 내 문제를 보여주는 컴파일 가능한 코드가있다.IEnumerable.Cast가 캐스트 오버로드를 호출하지 않습니다.

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(); 
} 
+0

관련 (중복되지 않은 경우) : http://stackoverflow.com/questions/445471/puzzling-enumerable-cast- invalidcastexception –

답변

6

Cast<T> 기능은 IEnumerable하지 IEnumerable<T>에서 작동합니다. 따라서 특정 유형이 아닌 System.Object으로 인스턴스를 처리합니다. 명시 적 변환은 객체에 존재하지 않으므로 실패합니다.

, 대신) 선택 (사용해야 당신이 방법을 수행하려면 :

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

그것은 완벽하게 이해됩니다. 감사합니다! –

+0

@Martin : 동료 벨 링햄 출신을 돕기에 기쁘다;) –

관련 문제