2017-06-29 6 views
0

Ich lese, "C# in Kürze" und ich kam zu Advanced C# Funktionen erstes Thema: Delegierten.Kompilierfehler: Die Verwendung des generischen Typs erfordert N-Typ-Argumente

Dieser einfache Code funktioniert

using System; 

namespace prueba 
{ 
class Program 
{ 
    public delegate int Transformer(int x); 

    static void Main(string[] args) 
    { 
     Transformer t = Square; 
     t += Cube; 
     int result = t(3); 
     Transform(5, Square); 
     Console.WriteLine(result); 
     Console.Read(); 
    } 

    static int Square(int x) => x * x; 


    static int Cube(int x) => x * x * x; 

    public static void Transform(int x, Transformer t){ 
     t(x); 
    } 
    } 
} //prints => 27 

Wenn ich versuche, Generika zu verwenden, mit diesem Code

using System; 

namespace prueba 
{ 
class Program 
{ 
    public delegate int Transformer<T>(T arg); 

    static void Main(string[] args) 
    { 
     Transformer t = Square; // Compilation Error at this lane 
     t += Cube; 
     int result = t(3); 
     Transform(5, Square); 
     Console.WriteLine(result); 
     Console.Read(); 
    } 

    static int Square(int x) 
    { 
     Console.WriteLine(x); 
     return 0; 
    } 

    static int Cube(int x) => x * x * x; 

    public static void Transform<T>(T x, Transformer<T> t){ 
     t(x); 
    } 
    } 
} 

Ich kann nicht kompilieren: this

ich wirklich bin neu und Ich verstehe nicht, was bedeutet, dass ich 1 Typ-Argument benötige, wenn das einzige, was ich getan habe, ist, den Typ Delegat für einen generischen Typ (T) zu ändern. Könnte mir jemand helfen? Diese

+2

Sie versuchen, den generischen Typ 'Transformator verwenden' ohne Angabe 'T'. Dies ist nicht erlaubt, wenn eine Variable wie diese deklariert wird. Sie müssen explizit sein und sagen 'Transformer = Square;' –

+0

oh, ich sehe, danke, ich dachte, es funktioniert wie dynamische var, aber ich war falsch, wirklich danke – Ferus7

Antwort

2

Wie die Fehlermeldung besagt, versuchen Sie, den generischen Typ Transformer<T> zu verwenden, ohne alle generische Argumente anzugeben.

Dies ist nicht erlaubt.

Ihre Codezeile muss angeben T Sie verwenden möchten:

Transformer<int> t = Square; 
2

bedeutet, dass Ihre Variablentyp eine Art Argument erfordert, wenn Sie es definieren:

Transformer<int> t = Square; 

Auf der anderen Seite, sind Sie sicher, dass Sie benötigen hier eine generische Methode benutzen? Oder wird der Delegat andere Arten von Argumenten neben int nehmen?

+1

Ich war Delegierten testen Funktion, nur in einem Test-Projekt, um zu überprüfen, wie es funktioniert :), übrigens vielen Dank – Ferus7

+0

@ Ferus7 Ja, ich dachte eigentlich, dass es wahrscheinlich kein echter Fall war. Bitte :) – silkfire

Verwandte Themen