2009-07-06 9 views

Odpowiedz

36

Jest to ograniczenie na generycznego parametru swojej klasie, co oznacza, że ​​każdy typ, który jest przekazywany jako typ rodzajowy musi mieć konstruktora bez parametrów.

Więc

public class C : B 
{ 
    public C() {} 
} 

byłoby prawidłowym typem. Możesz utworzyć nowe wystąpienie A<C>.

Jednak

public class D : B 
{ 
    public D(int something) {} 
} 

nie spełniają ograniczenia i nie będą mogły utworzyć nową instancję A<D>. Jeśli dodałeś do D również konstruktora bez parametrów, będzie on znowu ważny.

+5

Także jeśli masz nowy() jako rodzajowy przymusu, można rzeczywiście instancję T w ogólna funkcja, tak jak: T instance = new T(); Bez nowego() jako ograniczenia nie można bezpośrednio utworzyć instancji klas (nadal można użyć statycznej fabryki, jeśli istnieje ograniczenie do konkretnej klasy) – Steffen

+0

Dobra rada. Naprawdę dostaniesz błąd kompilacji, jeśli spróbujesz to zrobić, co jest miłym sposobem przypomnienia o dodaniu ograniczenia. – womp

3

Nowe ograniczenie() oznacza, że ​​T musi mieć publiczny konstruktor bez parametrów. Wszelkie wywołania funkcji T() stają się wywołaniami różnych przeciążeń Activator.CreateInstance(). Bardziej elastyczne podejście (powiedzmy, gdyby konstruktorzy potrzebują argumentów, albo są wewnętrzne zamiast publiczny) jest użycie Delegat:

public class A<T> where T : B 
{ 
    public void Method(Func<T> ctor) 
    { 
     T obj = ctor(); 
     // .... 
    } 
} 

// elsewhere... 
public class C : B 
{ 
    public C(object obj) {} 
} 

public void DoStuff() 
{ 
    A<C> a = new A<C>(); 
    object ctorParam = new object(); 
    a.Method(() => new C(ctorParam)); 
}