2011-07-31 27 views
9

Genel bir sınıf var MyClass<T>Tyalnızca karşılaştırılabilir türleri olabilir.C# içinde genel türleri sınırlama #

Bu ilişkisel operatörler için yöntemler tanımlanmıştır yalnızca sayısal türleri ve sınıfları anlamına gelecektir. Bunu nasıl yaparım ?

cevap

10

Operatörleri kısıtlayamazsınız, ancak arabirimleri kısıtlayabilirsiniz. Bu nedenle, >=, <=, == kullanmak isteyen dışarı, ama CompareTo, Equals kullanabilirsiniz.

where T : IComparable<T> 

Interface documentation

Bu arayüzü (vs, daha az, daha fazla) ilişkisel sipariş için yararlıdır CompareTo yöntemini getirmektedir. Primitifler ve dizeler bunu zaten uygular, ancak bunu kendi özel türleriniz için uygulamanız gerekir. Sen object sanal yöntem olarak varsayılan olsun bu

void SomeMethod<T>(T alpha, T beta) where T : IComparable<T> 
{ 
    if (alpha.CompareTo(beta) > 0) 
    { 
     // alpha is greater than beta, replaces alpha > beta 
    } 
    else if (alpha.CompareTo(beta) < 0) 
    { 
     // alpha is less than beta, replaces alpha < beta 
    } 
    else 
    { 
     // CompareTo returns 0, alpha equals beta 
    } 
} 

Equals gibi kullanmak. Referans yöntemiyle eşitlikten başka bir şey kullanmak istiyorsanız, bu yöntemi kendi özel türlerinizde geçersiz kılmak istersiniz. (Aynı zamanda kuvvetli aynı anda GetHashCode geçersiz kılmak için önerilir.)

+0

ıcomparable Eşittir yöntemi yoktur ... şüphe IEquatable –

+0

@nathan şu, sen Equals' sanal yöntemdir 'doğru, ama varsayılan olarak nesneler üzerinde, bu yüzden cevapta arayüzden bahsetmedim. Açıklık için güncellenir. –

+0

Öyle yaptım ama şimdi hata 'operatörü rohit89

3

Sen nerede düzenleyici kullanmak IComparable arabirimini tek sınıflara genel tür sınırlayabilir.

public class MyClass<K> where K : IComparable 
{ 
    .... 
} 
3

Eğer karşılaştırılabilir şeyler bunu sınırlamak isterseniz, gibi şeyler yapabilirsiniz: Hız alaka ise

public class MyClass<T> where T:IComparable 
-1

Önerilen yöntemleri kullanarak size performansta büyük bir kayıp verecektir. Değilse, önerilen tüm şeyler iyi çalışır.

Bu

C# ilkel veri türleri bir "Sayısal" veri türü olarak genellikle önerilen ve burada başkaları tarafından talep olmadığı için çok sık ele almak zorunda bir konudur.

Belki C# sonraki sürümü ona sahip olacak, ama

+0

Performansın neden düştüğünü düşünüyorsunuz? Buradaki sayısal veri türünden neden bahsettiğinizden pek emin değilim. Hangi sayısal tür olmasını istersiniz? – oleksii

+0

Son zamanlarda pek çok test yaptım, çünkü çerçevemizde çok esnek bir sisteme ihtiyacımız var. Farklı ilkel veri türlerinden oluşan genel bir diziniz olduğunu varsayalım. Bir diziden nasıl geçersiniz? Genel bir dizinin karşılaştırmasını nasıl yaparsınız? Genel bir genel veri türü üzerinde tanımlanmış işlemler olduğundan, bu dizide matematik işlemlerini nasıl yaparsınız. Bu sayısal veri türü kısıtlamasına sahip olmanın bir nedenidir. Belki bu durumumu açıklamak için biraz az metin var, ama buradaki problemi gösteren birçok iş parçacığı var. – msedi

İlgili konular