2014-04-21 81 views
0

我有有這個簽名Matrix類:無法施展我的矩陣類型的IEnumerable <IEnumerable的<float>>

public partial struct Matrix : IEnumerable<Vector>, IEquatable<Matrix> { ... } 

然後,同樣,我有一個Vector類像這樣:

public partial struct Vector : IEnumerable<float>, IEquatable<Vector> { ... } 

因此,在代碼別的地方,我有:

Matrix matrix = new Matrix(); 
IEnumerable<IEnumerable<float>> floatEnumerationEnumeration = matrix; 

但它無法編譯,稱它無法轉換MatrixIEnumerable<IEnumerable<float>>

但我看不出爲什麼不呢?

+2

我認爲這是一個類似的問題,涵蓋http://stackoverflow.com/a/9688362 – Alex

回答

1

Matrix implements IEnumerable<Vector>但不是IEnumerable<IEnumerable<float>>。要麼讓它實現IEnumerable<IEnumerable<float>>以及或將它轉換爲正確的類型:

IEnumerable<IEnumerable<float>> floatEnumerationEnumeration = 
    matrix.Cast<IEnumerable<float>>(); 

注意,如果BA派生那麼這並不意味着T<B>T<A>派生。事實上,T<A>T<B>被認爲是兩個不同的不相關類型。

這是不容易明白爲什麼,但讓我們再舉一個例子:

class Person 
{ 
    public string Name { get; set; } 
} 

class Student : Person 
{ 
    public char Grade { get; set; } 
} 

現在讓我們假設,這是不允許的:

List<Student> students = new List<Student>(); 

List<Person> persons = students; 
persons.Add(new Person()); // Oops! 

的基礎列表仍然是一個學生名單,它不允許你添加Person類型的對象!

好的你的例子是不同的,它應該工作,如果你知道如何實現類型。但是C#只能看到抽象的語法結構,並且確實知道類型真正打算做什麼。編譯器不能說:「好吧IEnumerable<T>沒有Add方法,因此這個問題不會發生」。因此泛型不能自動共同或逆轉。

相關問題