2010-11-19 7 views
4
sadece işe jenerik işlevini sınırlama

aşağıdaki genel işlevi var:numaralamalar

public SomeType SomeFunction<T>(T value) where T : System.Enum 
{ 
} 
: bu yüzden aşağıdaki çalıştı

public SomeType SomeFunction<T>(T value) 
{ 
} 

Ben şimdi sadece Enum ile çalışmak için bu jenerik işlevi kısıtlamak istiyoruz s

Ama bu sonuçlanmıştır:

hata CS0702: Kısıtlama s olamaz pecial sınıfı 'System.Enum'

Bu tür bir kısıtlamaya izin verilmemesinin nedenini bilen herkes bir merakı ve merakı var mı?

+0

bir istisna atmadan önce bunu biraz daraltabilir Ani'nin bahsettiği dupe'de. Bu C# dilinin bir kısıtlamasıdır, CLR değil (örneğin, F # içinde enum 'ile sınırlamak mümkündür). Kısıtlanmamış Melodi kitaplığı, C# 'nin kendisinde' enum 'kısıtlamalarına izin vermek için bir geçici çözüm sunar: http://code.google.com/p/unconstrained-melody/ – LukeH

cevap

5

Yapamazsınız. Bunu değer türleriyle sınırlayabilirsiniz, ancak hepsi bu. çeteleler bunu sınırlandırılması sadece çalışma zamanı denetimi kullanılarak yapılabilir:

public SomeType SomeFunction<T>(T value) where T : struct 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new NotSupportedException("Only enums are supported."); 
    } 
} 
+1

+1. Ayrıca System.Enum'un bir numara olmadığını da belirtmek gerekir. –

+0

Sorun şu ki, "SomeFunction" işlevine yapılan tüm çağrılar, jenerik sürüme yönlendirildiğinden, şu anda çağrılmayan bir başka, jenerik olmayan işleve sahip olduğumdur! –

+0

Aslında kısıtlamayı biraz daha sıkı hale getirebilirsiniz, gerçekten çok fazla yardımcı olmaz: 'Burada T: struct, IComparable, IConvertible, IFormattable' – LukeH

1

Steven doğrudur, ama sen sen kabul edilen yanıt bakmak gerekir

public SomeType SomeFunction<T>(T value) where T : struct 
+2

Bu Steven'ın söylediklerinden daha az. -1 –

+1

-1 değeri hak edilmedi, çünkü cevabımı daha sonra "T: struct" ifadesini eklemek üzere düzenledim. Bu düzenleme muhtemelen bu gönderiyi geçti. – Steven

+0

Tamam, ama (SO zamanına göre) Steven'dan 5 dakika sonra cevapladın. Cevabınızın bir noktada Steven'ınkinden daha fazla bilgi aldığını söylerseniz, her ikiniz de ninja düzenlemeleri yapmış olmanız gerekir, çünkü cevaplamak için herhangi bir düzenleme göremiyorum. Üzgünüm, durum buysa. –