2009-06-23 12 views
5

jenerik ile C# boks numaralandırma hatası ...: 'TestApp.TestVal' jenerik tip tip parametresi 'T' olarak kullanılamaz tipi veya metot 'TestApp.SomeClass<T>'. 'TestApp.TestVal''dan 'System.IComparable<TestApp.TestVal>''a kadar bir boks dönüşümü yoktur. enum varsayılan bir int ve bir hata olmamalı gibi en görünüyor IComparable<int> arabirimini uygulamak int yana ....aşağıdaki hata var</p> <p>Burada neler olduğunu anlamıyorum

public enum TestVal 
{ 
    First, 
    Second, 
    Third 
} 

public class SomeClass<T> 
    where T : IComparable<T> 
{ 
    public T Stored 
    { 
     get 
     { 
      return storedval; 
     } 
     set 
     { 
      storedval = value; 
     } 
    } 
    private T storedval; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Error is on the next line 
     SomeClass<TestVal> t = new SomeClass<TestVal>(); 
    } 
} 

:

Bu hata şu kodu olur

+0

int en ıcomparable uygulamak ama bu RandomEnumType IComprable uygulayan anlamına gelmez. – AakashM

cevap

8

Öncelikle, IComparable<T> numaranın enum ... IEquatable<T> ile uyumlu olup olmadığından emin değilsiniz, ama - karşılaştırma?

Daha güvenli bir alternatif olarak; Genel kısıtlama ile IComparable<T>'u yetkilendirmek yerine, belki de sınıfın içinde Comparer<T>.Default kullanın. Bu, IComparable<T> ve IComparable'u destekleme avantajına sahiptir - ve bu, yayılması için daha az kısıtlamanız olduğu anlamına gelir. Örneğin

:

public class SomeClass<T> { // note no constraint 
    public int ExampleCompareTo(T other) { 
     return Comparer<T>.Default.Compare(Stored, other); 
    } 
    ... [snip] 
} 

Bu enum ile çalışıyor:

SomeClass<TestVal> t = new SomeClass<TestVal>(); 
t.Stored = TestVal.First; 
int i = t.ExampleCompareTo(TestVal.Second); // -1 
+0

Sorunuma olası alternatif çözüm için teşekkürler. Gerçek kod, hemen hemen her tür test verisinin ele alınması gereken bir test çerçevesinde çok derindir. Daha fazla araştırma yapmak zorunda kalacağım ama kodunuzun genel nesnelerimde karşılaştırmak için daha iyi bir yol olabileceği düşünülüyor .... –

+0

Cool trick thanks! –

0

C# enums içinde, IComparable öğesini uygulayın, ancak jenerik IComparable<T>'u değil. Bunun neden böyle olduğundan emin değilim, ama belki de sizin yanınızdaki genel olmayan IComparable'a geçebilirsiniz.

5

Enumlar, System.Int32s türetilmiş değil - onlar IComparable<int> (ancak, IComparable uygulamak, ancak) uygulanmayan System.Enum türetilmiştir.

Bir enum'un temel değeri varsayılan olarak bir int olsa da, enum'un kendisi yoktur. Böylece, ikisi arasında dönüşüm yoktur.

+0

(İşaretlemeyi düzelttim - ve sonra çıldırdı ve cevabımı kendi başıma yerine düzenledim! Şimdi düzeltildi, üzgünüm ...) –

+0

Açıklama için teşekkürler. Bu yardımcı olur. Ayrıca, yapılarla aynı türde bir problemim olup olmayacağını merak ediyor. –

0

Enum IComparable<T> uygulamıyor ama IComparable uygulamak gelmez. Yani bir enum T in olabilir fıkra gibi nerede:

where T : IComparable 

ama bu bir hata veriyor:

where T : IComparable<T> 

Sonra da karşılaştırılabilir olmasını SomeClass istediğinizi varsayalım. Bunu yapmak için IComparable'ın kendisini uygulamak zorunda kalacaktı.

İşte (kod basit tutmak için bir kamu elemanı kullanarak) hem bir örnek:

public class SomeClass<T> 
    : IComparable<SomeClass<T>> 
    where T : IComparable 
{ 
    public T storedval; 

    public int CompareTo(SomeClass<T> other) 
    { 
     return storedval.CompareTo(other.storedval); 
    } 
} 
İlgili konular