2016-08-19 4 views
0

Ich möchte eine Klasse mit einem generischen Typargument erstellen, das eine Integritätsbedingung als Unterklasse einer anderen generischen Klasse hat.Generische Typenargumente in generischen Integritätsbedingungen

Beispiel:

public class SomeGeneric<T> where T : new() 
{ 
    T CreateItem() => new T(); 
} 

Diese Klasse I erstellen möchten. Hinweis: Ich möchte nicht Client dieser Klasse den inneren Typ Argument zweimal angeben:

public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new() 
{ 
    public T Item {get; private set;} 
    public void TheClass 
    { 
     var instance = new TGeneric(); // this is possible because of the new() restriction 
     Item = instance.CreateItem(); 
    } 
} 

Dies könnte dann verwendet werden, wie folgt:

class AnotherClass 
{ 

} 

class Client : TheClass<SomeGeneric<AnotherClass>> 
{ 
    public void SomeMethod() 
    { 
     var theInstanceOfAnotherClass = this.Item; 
     // Do stuff with it 
    } 
} 

Soweit ich sagen kann, ist dies nicht möglich, da es auf dieser Linie bemängelt, dass T nicht bekannt ist:

public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new() 

Die Abhilfe zu tun wäre, wie folgt:

public class TheClass<T, TGeneric> where TGeneric : SomeGeneric<T>, new() 

Aber das würde bedeuten, dass der Kunde dies zu tun hat:

public class Client : TheClass<AnotherClass, SomeGeneric<AnotherClass>> 

Ich möchte Duplizieren der inneren Typ Argument zu vermeiden. Ist das möglich?

Antwort

-1

Funktioniert das oder ähnelt es sogar Ihren Vorstellungen?

public SomeClass<TGeneric<T>> where TGeneric<T> : SomeGeneric<T> 
+0

Nein, 'TGeneric' ist ein Typargument, kein generischer Typ, aber ja, das möchte ich erreichen – Kenneth

+0

Ich glaube nicht, dass es einen Weg gibt, das zu tun, was man will, ohne' T' zuerst zu deklarieren . Generische Typenargumente sind wie Funktionsargumente; Sie müssen sie deklarieren, bevor Sie sie verwenden können. – Craxal

0

Ich glaube nicht, dass dies möglich ist. This question adressiert die gleiche Situation.

Dieser Klappentext von MSDN besagt auch, dass es nicht erlaubt ist, anders als in C++. Ich bin mir nicht sicher, ob es einen Grund für diese Einschränkung gibt.

In C# kann ein generischer Typparameter selbst kein generischer Typ sein, obwohl konstruierte Typen als Generics verwendet werden können. C++ erlaubt Template-Parameter.

Ich denke, dass Sie Ihre Klasse in irgendeiner Weise zu überarbeiten haben eine generische object zu verwenden, oder auch nur mit dem doppelten Typargument leben.

Verwandte Themen