2017-08-06 5 views
1

Angenommen, es eine Identitätsfunktion ist, die lautet:Wie umgehen Sie Rang N Polymorphismus in C#?

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

Was soll ich geben F?

void F<T>(Func<T, T> f) { // This is not sound! 
    System.Console.WriteLine("{0}", f(1)); 
    System.Console.WriteLine("{0}", f("one")); 
} 

static void Main() { 
    F(Id); 
} 

denke ich, C# nicht Rang N-Polymorphismus und C# F solide verfügt nicht geben kann. Ist das richtig?

Und dann, wie man solche Probleme umgehen?

+0

Sie müssen viel erarbeiten. Es stimmt, dass der von Ihnen gepostete Code nicht funktioniert. Aber warum sollten Sie wollen, dass es funktioniert? Ihre "generische" Methode verwendet nur "T", um den Delegierten "f" aufzurufen. Sie könnten genauso gut die Methode 'void F (Func f) {...}' deklarieren und es würde funktionieren. –

+0

'void F (Func f) {...}' ist nicht typsicher. Wenn "F" einen solchen Typ hat, kann "f" sein "string Foo (int v) {return v +"; } '. – kakkun61

+0

Dies scheint auf den ersten Blick eine akademische Frage zu einem Feature zu sein, das die C# -Sprache nicht unterstützt. Können Sie einen tatsächlichen Anwendungsfall angeben? – Corey

Antwort

5

Es ist mir nicht klar, was Sie erreichen wollen, aber man könnte dies mit einer nicht-generische Schnittstelle, die eine generische Methode enthält:

using System; 

interface IGenericSameTypeFunction 
{ 
    T Apply<T>(T input); 
} 

public class SimpleIdentityFunction : IGenericSameTypeFunction 
{ 
    public T Apply<T>(T input) => input; 
} 

class Test 
{  
    static void F(IGenericSameTypeFunction function) 
    { 
     Console.WriteLine(function.Apply(1)); 
     Console.WriteLine(function.Apply("one")); 
    } 

    static void Main() 
    { 
     F(new SimpleIdentityFunction()); 
    } 
} 

Der wichtige Aspekt ist, dass durch die Apply machen Methode generische anstelle der F Methode, Sie sagen "Dies ist eine Funktion, die in einer typsicheren Weise auf jeden Typ angewendet werden kann."

Es gibt keine Möglichkeit, diese Schnittstelle als Delegattyp auszudrücken.