2017-06-12 3 views
0

Ich habe dies:Generics, ohne einen bestimmten Typ

class Program 
    { 
     static void Main(string[] args) 
     { 

      var result = new Result<int, bool> { success = true, Data = 88 }; 
      var result2 = new Result<string, bool> { success = true, Data = "Niels" }; 


      Console.WriteLine(result2.success); 
      Console.WriteLine(result2.Data); 

      Console.ReadKey(); 
     } 
    } 

    public class Result<T, TU> 
    { 
     public TU success { get; set; } 
     public T Data { get; set; } 


    } 

So dies eine einfache generische Klasse mit zwei Eigenschaften ist.

ich gerade fragen, wie dies machen:

var result = new Result<int, bool> { success = true, Data = 88 }; 

noch generic :). Weil Sie noch haben „sagt“, was die Rückkehr Typ sein: <int, bool>

So ist es möglich, es zum Beispiel, wie dies zu tun:

<T var1, T var2> ? 

Danke

Also ich meine, wie dies :

var result = new Result<T var1, T var2> { success = true, Data = 88 }; 

Damit Sie für den Erfolg und für Daten füllen kann, was auch immer Sie (string, int, float, bool) wollen ..

+0

Sie meinen, Sie möchten eine Instanz von 'Result' erstellen, ohne explizit die generischen Typen zu schreiben? – grek40

+0

'public Ergebnis f (T t, TU tu) => neu Ergebnis (t, tu);' ist generischer. Aber der Compiler muss von irgendwo die Typparameter bekommen. Sie müssen genauer angeben, was '' bedeuten soll. –

+0

Konstruktoren können die generischen Typargumente nicht automatisch ableiten. Aber Methoden * können *, verwenden Sie also eine Factory-Methode wie von grek40 zur Verfügung gestellt. – HimBromBeere

Antwort

6

Sie können eine Factory-Methode verwenden, um die Typen automatisch aus den gegebenen Parametern zu beheben:

public static class ResultFactory 
{ 
    public static Result<T, TU> Create<T, TU>(TU success, T data) 
    { 
     return new Result<T, TU> { success = success, Data = data }; 
    } 
} 

var result = ResultFactory.Create(true, 88); 
var result2 = ResultFactory.Create(true, "Niels"); 
+0

Danke. Aber woher kommt das Create? – LikeToDo

+1

@Default danke, kann ich nie wieder Code im Antwortfenster anstatt einer tatsächlichen IDE schreiben – grek40

+1

@LikeToDo Es ist der Name der Methode in der 'Factory' Klasse – Default

0

Weil du immer noch zu „sagen“, was die Art Rückkehr sein wird: <int, bool>

Ja, Sie müssen den Typ T,TU angeben und den Typ nicht offen lassen. Typen müssen zur Kompilierungszeit geschlossen werden. Daher ist das Aufrufen von <T var1, T var2> nicht möglich, es sei denn, es ist in einen anderen generischen Typ oder eine andere Methode eingebettet