2013-05-15 30 views
9

List.Sort( kullanarak nesnelerin listesini sıralamaya çalışıyorum, ancak çalışma zamanında dizideki öğeleri karşılaştıramadığını söyler.Neden ataşe sınıfında IComparable <T> kullanamaz ve alt sınıfları karşılaştırılamıyor?

public abstract class Parent : IComparable<Parent> { 
    public string Title; 
    public Parent(string title){this.Title = title;} 

    public int CompareTo(Parent other){ 
     return this.Title.CompareTo(other.Title); 
    } 
} 

public class Child : Parent { 
    public Child(string title):base(title){} 
} 

List<Child> children = GetChildren(); 
children.Sort(); //Fails with "Failed to compare two elements in the array." 

Neden IComparable<T> uygulayan bir baz alt sınıflarını karşılaştırma olamaz:

dizide

Sınıf yapısını iki öğe karşılaştırmak için başarısız oldu? Muhtemelen bir şeyleri özlüyorum ama neden buna izin verilmemesi gerektiğini göremiyorum.

Düzenleme: (SharePoint 2010)

Edit2 .NET 3.5 hedefliyorsam olduğunu açıklamak olmalı: .NET 3.5 sorundur (aşağıya cevap bakınız).

+2

Bu, çalışma zamanı istisnası gibi görünüyor, belki de çocuklarınızdan birinin "Başlık" değeri null? Ya da listenizde boş bir yer var mı? – nvoigt

+0

http://stackoverflow.com/questions/1658661/failed-to-compare-two-elements-in-the-array –

+3

.NET 4 ile çalışıyorum ama [** ideone ** değil] (http: //ideone.com/rZ0rVL), hangi .NET sürümünü kullanıyorsunuz? –

cevap

11

Bunun .NET 4.0'dan önce bir .NET sürümü olduğunu varsayalım; .NET 4.0 sonra IComparable<in T> olduğunu ve birçok durumda Tamam çalışması gerekir - ama bu liste List<Child> olduğunu 4,0

yılında varyans değişiklikler gerektirir - ancak bunların hiçbiri - öyle çok IComparable<Child> veya IComparable ya kullanmaya çalışacaktır sıralama uygulamıştır. Belki de, Parent seviyesinde IComparable uygulayabileceği: object aracılığıyla aynı mantık geçerli olacaktır

public abstract class Parent : IComparable<Parent>, IComparable { 
    public string Title; 
    public Parent(string title){this.Title = title;} 

    int IComparable.CompareTo(object other) { 
     return CompareTo((Parent)other); 
    } 
    public int CompareTo(Parent other){ 
     return this.Title.CompareTo(other.Title); 
    } 
} 

.

+0

IComparable'ı kullanabileceğimi biliyorum, ancak gerçekten yalnızca Ebeveyn'ten türeyen iki sınıfı karşılaştırmayı desteklemek istiyorum. Çocuk her şeyden sonra burada bir ebeveyn var, bu yüzden neden yukarıdaki gibi başaramadığımı anlamıyorum. – Thomas

+0

Evet, ancak neden ana sınıfı karşılaştırıcı kullanmak mümkün değil? Eğer ayrı bir statik fonksiyon olsaydı, bu mümkün olurdu. Derleyici taban sınıfı karşılaştırıcılarını aramamalıdır mı? Bu mümkün olabilir, ama muhtemelen uygulanmadı ... –

+0

Aslında, kod benim için çalışıyor ve doğru sıralar. 'IComparable ' uygulaması kaldırılmışsa, elbette işe yaramaz. * Güncelleme *: Kesinlikle .NET 4'ten kaynaklanıyor. – Jon