2011-06-07 11 views

cevap

8

, örneğin birkaç şartlara uyması gerekir verilen jenerik tipi, anlamına gelen bir kısıtlamayı ekleyebilirsiniz:

  • where T : new() - T bir kamu parametresiz yapıcı olması gerekir (veya bir struct olmak)
  • where T : class - başka T bir değer tipi olmalıdır (- T referans tipi (class/interface/delegate)
  • where T : struct olmalıdır
  • where T : SomeBaseType) Nullable<TSomethingElse> daha - - TSomeBaseType (veya SomeBaseType kendisi) tarafından erişilebilir olmalıdır
  • where T : ISomeInterfaceT örneğin ISomeInterface

uygulamalıdır:

public void SomeGenericMethod<T>(T data) where T : IEnumerable { 
    foreach(var obj in data) { 
     .... 
    } 
} 

bu SomeBaseType ve ISomeInterface olduğu Burada ilginçtir, çünkü onlar (ve kullanım) Bu türler üzerinde tanımlanmış olan - örneğin, where T : IList, Add(...) vb. erişim sağlar. HOWEVER!basitçe: gibi şeyler için böyle bir mekanizma yoktur: parametrelerle

  • yapıcıları
  • statik yöntemler
  • keyfi yöntemler baz tipi veya arayüz
yoluyla tanımlanmayan/dönüşümler
  • operatörler

    Yani: Onlara talep edemezsiniz ve bunları kullanamazsınız (yansıma dışında). Ancak bunlardan bazıları için dynamic kullanılabilir. Bir programda,

    interface IWithStatic 
    { 
        void DoIt(); // non-static 
        static void DoItStatic(); // static 
    } 
    
    class C1 : IWithStatic 
    { 
        void DoIt() {} // non-static 
        static void DoItStatic(){} // static 
    } 
    
    class C2 : IWithStatic 
    { 
        void DoIt() {} // non-static 
        static void DoItStatic(){} // static 
    
    } 
    

    Ve:

  • +0

    iyi bir açıklama. – Idrees

    1

    O olması mümkün değildir:/yöntem olmasının sınıfları uygulama sınırlamak mümkün izin verilmez çünkü

    public interface IInterface { 
        static void Method(); 
    } 
    

    budur statik. temelde bu yüzden

    +0

    Ancak bu, "Bu öğe için statik 'değiştirici' bu öğe için geçerli değil" –

    +0

    @James Wiseman, "Olması mümkün değil:" hata iletisini oluşturur. – Lucero

    +0

    @Lucero - It Muhtemelen biraz açık değildi, ama amacım, bunun sorulan kişiye farklı bir mesaj oluşturmasıydı. Cevap ayrıca orijinal sorudaki genel kısıtlamaların çıkarımını da eklemez. :-) –

    6

    :

    public class A{} 
    
    public class B{ 
        public static void Foo() {} 
    } 
    

    You T için genel bir sınırlama yazamam: Sadece A veya B varlığı olan veya olmayan dayanarak kabul kısıtlamak olduğunu

    public class C<T> {} 
    

    Böyle Statik yöntemin Foo() görülmesi.

    jenerik ile
    +0

    Cevabınızın ilk kısmı sadece mükemmel. İkinci bölüm sadece kafa karıştırıcı. Eğer orada değilse, açıklamayın. – Idrees

    +0

    @ Ortaklar - adil nokta; Kurtulmak var :) –

    3

    aşağıdaki çalışmıyor kodu düşünün

    IWithStatic.DoItStatic(); // Not knowing which type to use 
    
    :
    IWithStatic myObj = GetWithAnyMethod(); // Return a C1 or C2 instance 
    
    myObj.DoIt(); // working, as the runtime type is used (either C1 or C2); 
    

    ancak statik ile

    ... nasıl derleyici bu yorumlayabilir

    Şimdi sorunun ne olduğunu görüyor musunuz?

    +0

    Gerçekten değil, üzgünüm. – Idrees

    +0

    Bir arabirim, bir sınıfın saygı duyması gereken bir sözleşmeyi tanımlar. Bu sözleşme, sınıftaki tüketicilere, gerçek uygulama değil, arayüz türü ile bildirilen değişkenlerle çalışma olanağı tanır. Gerçek uygulama çalışma zamanında belirlenir. Tüketici kodunun aranan yönteme sahip olması garanti edilir. Tüm bunlar çalışabilir, çünkü çalışma zamanı üzerinde çalışılacak bir örnek vardır. Statik yöntemlerle çalışırsanız, türü çalışma zamanında kontrol etmek için bir değişkeniniz yoktur. Derleyici, onun C1.DoItStatic veya C2.DoItStatic'in –

    +0

    numaralı telefonunu arayacağını şimdi anlayamıyor. Teşekkürler +1 – Idrees

    İlgili konular