Laden...

new T(x) in einer generischen Klasse verwenden (CS0417)

Erstellt von newsunflower vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.751 Views
N
newsunflower Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren
new T(x) in einer generischen Klasse verwenden (CS0417)

Hallo

Ich kann in einer generischen Klasse nur dann ein neues Objekt vom Vorlagetyp erstellen, wenn dieser einen parameterlosen Konstruktor benutzt. Das ist das Problem, da ich einen Konstruktor mit Parametern aufrufen will um eine Instanz eines Vorlagenobjekts zu erstellen.

Folgendes Beispiel veranschaulicht mein Anliegen:



public class Key
{
  public Key()
  {
  }

  public Key(int k)
  {
  }
}

public class Something<T> where T : Key, new()
{
  public Something()
  {
    T key1 = new T();   // OK
    T key2 = new T(5);  // CS0417  T: Beim Erstellen einer Instanz eines Variablentyps können keine Argumente bereitgestellt werden
  }
}

Was muss ich tun?

Vielen Dank für sachdienliche Hinweise…

René

830 Beiträge seit 2005
vor 16 Jahren

newsunflower,

versuch mal das:


T obj = (T)typeof(T).GetConstructor(new Type[] { typeof(int) }).Invoke(new object[] { 5 });

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

N
newsunflower Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Ja… damit geht’s…
geht’s auch ohne Reflection? Das der Compiler eine Überprüfung vornehmen kann?

Besten Dank!

Lg
René

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo newsunflower,

dabei ist es doch so einfach: [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

This error occurs if a call to the new operator on a type parameter has arguments. The only constructor that can be called using the new operator on an unknown parameter type is a constructor with no arguments. If you need to call another constructor, consider using a class type constraint or interface constraint.

herbivore

T
210 Beiträge seit 2006
vor 16 Jahren

Wie wäre es mit folgendem:



public class Key
{
  public Key()
  {
  }

  public Key(int k)
  {
  }

  public Key GetKey(int k)
  {
    return new Key(k);
  }
}

public class Something<T> where T : Key, new()
{
  public Something()
  {
    T key1 = new T();
    T key2 =  key1.GetKey(5);
  }
}

N
newsunflower Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

ja genau... "Wenn Sie einen weiteren Konstruktor aufrufen müssen, können Sie eine Klassentypeinschränkung oder eine Schnittstelleneinschränkung verwenden."

klingt ja nach einer Möglichkeit?

Der Vorschlag einer Factory-Methode ist gar nicht mal so schlecht... ich glaube ich mach das so...

Danke
René

T
210 Beiträge seit 2006
vor 16 Jahren

Original von herbivore
Hallo newsunflower,

dabei ist es doch so einfach:
>
.

This error occurs if a call to the new operator on a type parameter has arguments. The only constructor that can be called using the new operator on an unknown parameter type is a constructor with no arguments. If you need to call another constructor, consider using a class type constraint or interface constraint.
herbivore Hallo herbivore,

ich verstehe leider nicht, wie ich mit einem class type constraint oder einem interface constraint festlegen kann, daß es diesen Konstruktor geben muß. In einem Interface kann man zwar Eigenschaften und Methoden vorgeben, aber Konstruktoren nicht, oder etwa doch?

Gruß
T-Man

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo T-Man,.

ja, eben. Die Lösung hast du ja schon selbst gefunden. 🙂 Einfach eine Methode zum Erzeugen verwenden.

herbivore

830 Beiträge seit 2005
vor 16 Jahren

Dann würde ich die Methode aber statisch machen, dann kann man sich das Erzeugen einer "unnützen" Instanz sparen.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

N
newsunflower Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

mit den static ist ein Problem wenn Key eine (abstrakte) Basisklasse ist... man kann ja keine abstrakten statischen Methoden def... was ja auch logisch ist...

830 Beiträge seit 2005
vor 16 Jahren

Wenn der Hund nicht gesch... hätte, hätte er den Hasen gekriegt... 🙂

Friedel

Ohne Ziel ist auch der Weg egal.