2012-02-01 26 views
5

Ben şu sınıf adı imza oluşturmak çalışılıyor:Sınıf kısıt başka kısıtlamalar önce gelmelidir

public class MyClass<T> where T : struct, MyBase 

Ben hatayı

alıyorum

(Ben numaralamalar için sınırlamak için yapı kullanıyorum)

The class type constraint 'MyBase' must come before any other constraints 

Mesajı anlıyorum, ancak kodu yeniden düzenleyemiyorum veya başka bir sözdizimi hatası alıyorum. Bu çizgiyi nasıl giderebilirim?

Gerekirse, struct'u kaldıracağım.

Sen <T> iki farklı türde tanımlarken

+0

Farklı seçenekleriniz için farklı seçenekleriniz nedeniyle hepinize teşekkür ederim. –

+1

Kötü haber yavaş hareket ediyor, System.Enum'a bir tür argümanını kısıtlayamıyorsunuz. Tarih, hitap etmemek için iyi bir şey değildi, uygulama türleri için farklı boyutlara sahip olarak yapısal olarak uyumsuzlar. C dilinde çok fazla optimizasyon, birlikte çalışma nedeniyle C# 'ye sıkıştı. –

cevap

7

Bunu mu demek istediniz: class MyClass<T> : MyBase where T : struct?

+1

Teşekkürler. Buna benzer bir şeyi denediğimde, bir virgül ekliyordum. "Işık yeşil, tuzak temiz." –

1

teşekkür ederiz. struct, MyBase'un referans türüne başvuran bir sınıf olduğu bir değer türüdür. Değiştirilebilen bir şey değil.

Bu durumda ya olacaktır:

public class MyClass<T> where T : struct

veya

public class MyClass<T> where T : MyBase

Here jenerik ve nasıl kullanılacakları hakkında daha çok bilgi sahibi olduğunu.

0

Tstruct olması gerekiyorsa, başka türden devralınamaz ... Değer türleri devralmayı desteklemez.

16

Kısıtlamalar "ve-" birlikte; tüm kısıtlamaların karşılanması gerekir.

hangi koşullarda veya T olabilir null olmayan bir değer türü ve kimlik, boks veya referans dönüşüm ile sınıf MyBase örtük dönüştürülebilir?

Böyle bir durum yoktur, dolayısıyla T'nin kısıtlamalarını karşılayacak olası bir tür bağımsız değişken yoktur. Karşılanamayan bir dizi kısıt tanımlamanıza izin vermektense, derleyici buna izin vermez. Hem struct kısıtlaması hem de class type kısıtlaması gerektirdiğini belirtebilirsiniz. Benim noktayı gösterir

Enums için sınırlamak için yapı kullanıyorum

. MyBase'dan gelen hiçbir enum olmadığından, kısıtlamanın karşılanması mümkün değildi.

Bunun benim için ne anlama geldiğini düşündüğünüzü tarif edebilir misiniz? Örneğin, "MyBase'e dönüştürülebilen herhangi bir tür null olmayan veya türü" anlamına geldiğini düşündünüz mü? İnsanların neden C# hakkında yanlış şeylere inandığını öğrenmek için ilgileniyorum, böylece onu geliştirmeye çalışıyorum.

GÜNCELLEME: Ah, bkz. - MyBase'intemel sınıfı değil, MyClass<T> temel sınıfı olması amaçlanmıştır. C#, bu gider:

class [class name] < [generic type parameters] > 
    : [base classes and interfaces] 
    where [type parameter] : [constraints] 

Sen kısıtlamaları önce taban sınıflar ve arabirimler koymak zorunda, aksi derleyici onlar kısıtlamalar olduğunu düşünüyor.

0

Değil% 100 bu konuda emin değilim ama MSDN hızlı bir onay bu where (generic type constraint) (C# Reference) ile geliyor:

public class MyClass<T, U> where T : MyBase where U : struct 

bu olsa aradığınızı var emin değilim.

+1

Bu, biri diğerinden bağımsız iki ayrı paraterize tipe ihtiyaç duyduğuna dair bir işaret varsa geçerli olacaktır, ancak şu anda böyle bir gösterge yoktur. Tek tipli bir parametre için kısıtlamalarla ilgili olarak sadece rakip arzuları varmış gibi görünüyor. –

+0

@AnthonyPegram - Bu geçerli bir nokta, soruyu farklı bir şekilde okudum. OP'in başarmaya çalıştığı şey tam olarak açık değil (bana göre), bu yüzden uyarıyı en sonunda verdim. – Tim

İlgili konular