2016-04-08 10 views

Antwort

2

Wenn Sie Public Class Test(Of T As OtherClass) verwenden, sagen Sie dem Compiler, dass Ihr generischer Typ T "OtherClass" sein muss. Wenn Sie also Activator.CreateInstanc(Of T) verwenden, verfügen Sie über die Eigenschaften und Methoden der Klasse "OtherClass". Wenn Sie Public Class Test(Of OtherClass) verwenden, geben Sie den Namen "OtherClass" für Ihren generischen Typ an. Wenn Sie also Activator.CreateInstance(Of Type) verwenden, verfügen Sie über die Eigenschaften und Methoden eines Objekts

Schauen Sie sich das Beispiel:

enter image description here

Dieser Compiler-Fehler rised wurde, weil die cla "Typ" ist kein IEnumerable

Wenn ich die As IEnumerable entfernen:

enter image description here

Der Fehler ist weg, weil T ein beliebiges Objekt sein kann.

+0

Eigentlich nicht ... Ich habe die Frage aktualisiert, um ihre Bedeutung zu verdeutlichen, ich wollte in generischen Begriffen verstehen, was der Unterschied zwischen solchen Klassen zu erklären ist. Warum ist Activator.CreateInstance beteiligt? – UsuarioBeta

+0

Vergiss es. Ich habs. Ich war wegen meiner schlechten Wortwahl verwirrt, da Type auch der Name einer bestehenden .NET-Klasse ist. Können Sie Ihre Antwort so bearbeiten, dass sie stattdessen OtherClass verwendet? – UsuarioBeta

+0

@UsuarioBeta Ich änderte die Antwort, sehen Sie können Sie jetzt verstehen .. = P – Henrique

0

Um Verwirrung zu vermeiden, ist es besser, diese beiden Beispiele von Ihnen als schreiben:

  • Class(Of T)
  • Class(Of T as OtherClass)

Class(Of T) bezeichnet einen generic Class, die jede Art für T annehmen kann.
Es ist legal, es als Class(Of String) zu instanziiert, Class(Of Integer) usw.

Class(Of T as OtherClass) bezeichnet eine generische Class mit einem constraint. Es kann nur Typen akzeptieren, die die Bedingung erfüllen (von einem bestimmten Typ erben, eine bestimmte Schnittstelle implementieren, einen öffentlichen parameterlosen Konstruktor haben, Referenztypen/Werttypen sind).

Ich finde es auch ein bisschen seltsam, dass Sie mit letzterem vertraut sind, aber nicht ersteren. Das unbeschränkte Class(Of T) ist viel häufiger. Wenn dies nicht Ihre Erfahrung ist, könnte dies bedeuten, dass Sie Generika verwenden, bei denen Sie die Vererbung verwenden sollten.

0

Sie können keine Klasse (of otherType) überhaupt erstellen !! und dies ist nicht sinnvoll zum Beispiel dieser Code nicht gültig ist:

  1. Klasse test2 (Of String)

  2. End Class weil Zeichenfolge ein Typname ist und nicht ein Platzhalter für einen Bereich von Arten. sollten Sie einen generischen Typ einschränken, wenn Sie eine spezifische Aktion ausführen möchten.Sie möchten zum Beispiel eine Instanz der generischen Art zu schaffen:

  3. Funktion createInstance (Of T As New)() As T

  4. Return New T()
  5. End Function
  6. ... ...
  7. myObject = createInstance (Objekt)()

und wie Sie „neu“ zu sehen ist keine Klasse oder Typnamen, aber es unterstützt jede Art, die eine neue Methode hat. ein weiteres Beispiel ist, wenn Sie "T" von jeder Art sein wollen, die null sein kann:

  1. Sub setToNull (Of T As Class) (obj als T)
  2. obj = Nothing

  3. End Sub

  4. ... ...
  5. setToNull (Objekt) (myObj)

Also beschränkt wir T auf "Klasse", die im Gegensatz zu Strukturen und Werttypen ein NULL-fähiger Typ sein kann.

Verwandte Themen