2010-06-08 35 views
2

我不理解有關方式的一些東西.Cast的作品。我有一個明確的(雖然隱含也失敗)轉換定義,這似乎工作時,我經常使用它,但不是當我嘗試使用.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 – 2010-06-08 22:56:46

回答

6

Cast<T>功能適用於IEnumerable,不IEnumerable<T>。因此,它將實例視爲System.Object,而不是您的特定類型。顯式轉換不存在於對象上,因此失敗。

爲了你的方法,你應該使用選擇()代替:

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

這非常有意義,謝謝你! – 2010-06-08 22:30:49

+0

@Martin:很高興幫助Bellingham的本地同胞;) – 2010-06-08 22:32:48