2009-02-19 6 views
10

Ich fragte mich, ob es möglich ist, wie meine 5 Minuten des Experimentierens fruchtlos erwiesen.Generic Identity-Funktion zur Verwendung mit Typ Inferenz

Ich hoffte, dass es so einfach sein würde, wie:

T Identity<T>(T t) { return t; } 

Aber diese auf generische Methoden unter Func-Parameter zu kompilieren schlägt fehl. ZB OrderBy. Selbst wenn ich Typparameter spezifiziere (was genau das ist, was ich vermeiden will!), Kann es nicht kompiliert werden.

Als nächstes habe ich versucht, etwas, was ich dachte funktionieren würde:

Func<T, R> MakeIdentity<T, R>() 
{ 
    return (T t) => (R)(object)t; 
} 

Auch no go :((dies kompiliert, wenn Typ-Parameter Anwendung wieder, nicht, was ich will)

Hat jemand hatte Glück so machen eine Sache

UPDATE: bitte nicht sagen: x => x, ich weiß, dass es offensichtlich ist, ich für eine Funktion bin zu fragen, nicht Ausdruck :)

UPDATE 2: Wenn I ref Zur Identität, ich meine im funktionalen Sinne, wo die Funktion einfach das gleiche Objekt zurückgibt, das Sie ihr übergeben haben. Es ist wahrscheinlich in jeder funktionalen Sprache, die ich gefunden habe, aber diese verwenden nicht statische Typisierung. Ich frage mich, wie das (wenn möglich) mit Generika zu tun ist. Nur zum Spaß!

UPDATE 3: Hier ist eine teilweise ‚Lösung‘ auf der Grundlage der zweiten Idee:

Expression<Func<T, T>> MakeIdentity<T>() 
{ 
    return t => t; 
} 

void Foo(string[] args) 
{ 
    var qargs = args.AsQueryable(); 
    var q = qargs.OrderBy(MakeIdentity<string>()); 
    ... 
} 

Ich denke nicht, etwas mehr als dies möglich sein wird.

+0

Was versuchen Sie zu tun? –

+0

Müde vom Schreiben x => x :) Und ich frage mich wirklich. es dient keinem Zweck. – leppie

+0

Mit C# 6.0 'myList.OrderBy (Identity);' wird funktionieren. – Henrik

Antwort

3

Typinferenz wird nicht funktionieren, da Hostmethode und Eingabemethode beide generisch sind. Dazu müssen Sie

myList.OrderBy<int, int>(Identity); 

Oder

myList.OrderBy((Func<int, int>)Identity); 
1

Das Problem, das Sie haben, ist, dass anonyme Funktionen und Methodengruppen in C# nicht am Typ Inferenz teilnehmen. Explizite Typen müssen angegeben werden.

Was Sie tun können, ist jedoch Identity-Funktionen für anonyme Funktionen. Beispiel

Func<T> IdentityFunc1<T>(Func<T> func) { return func; } 

Ich bin nicht ganz sicher, was Sie mit der zweiten Probe bekommen. Kannst du es ausarbeiten?

+1

Ich denke du verstehst Identität falsch. Es ist eine häufig verwendete Funktion in der funktionalen Sprache, die einfach zurückgibt, was Sie ihm geben. – leppie

+0

Ich denke deine Antwort gilt trotzdem, danke :) – leppie

0

Die erste Option funktioniert für mich schreiben:

public class Foo { 

    public Foo(Func<MyObj, MyObj> map) {... } 

} 

public class Client { 

    private static T Identity<T>(T t) { return t; } 

    public void main() { 
     var foo = new Foo(Identity); 

     var c = from f in Enumerable.Range(0, 100) select Identity(f); 
     c.ToList().ForEach(System.Console.Out.WriteLine); 
    } 
} 
2

Dies funktioniert für mich in Orte, die ich es bisher gebraucht habe.

internal class IdentityFunction<TSource> 
{ 
    public static Func<TSource, TSource> Instance 
    { 
     get { return x => x; } 
    } 
} 

OrderBy(IdentityFunction<Foo>.Instance) 
Verwandte Themen