Template Funktions Spezialisierung in c#?



  • Gibt's das ?
    Falls ja. Wie ist die Syntax?

    Danke



  • Damit es Templatespezialisierungen geben kann, müsste es erstmal Templates geben 🙂

    Nein, gibt's nicht.



  • Per Überladung gibt es durchaus etwas, was dem ähnlich kommt.

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApplication2 {
        class Program {
            static void foo(object o) { Console.WriteLine("object"); }
            static void foo<T>(IEnumerable<T> o) { Console.WriteLine("IEnumerable<T> with T = {0}", typeof(T)); }
            static void foo(System.Collections.IEnumerable o) { Console.WriteLine("IEnumerable"); }
            static void foo<T>(IList<T> o) { Console.WriteLine("IList<T> with T = {0}", typeof(T)); }
            static void foo(IEnumerable<int> o) { Console.WriteLine("IEnumerable<int>"); }
            static void foo(IList<int> o) { Console.WriteLine("IList<int>"); }
    
            static void Main(string[] args) {
                var a = new[] { 1, 2, 3 };
                var b = (IEnumerable<int>)a;
                var c = new short[] { 1, 2, 3 };
                var d = (System.Collections.IEnumerable)a;
                var e = (object)a;
    
                foo(a);
                foo(b);
                foo(c);
                foo(d);
                foo(e);
            }
        }
    }
    


  • Das Problem ist nicht (vollständige) Spezialisierungen zu bekommen, sondern dass C# keine Templates kennt, also auch den Code von nicht vollständigen Spezialisierungen oder der "Defaultversion" nicht für beliebige Parameter erzeugen kann.



  • hustbaer schrieb:

    Das Problem ist nicht (vollständige) Spezialisierungen zu bekommen, sondern dass C# keine Templates kennt, also auch den Code von nicht vollständigen Spezialisierungen oder der "Defaultversion" nicht für beliebige Parameter erzeugen kann.

    Mir ist nicht genau klar, was Du mit der Aussage meinst. Kannst Du das für mich bitte etwas ausführlicher schreiben?

    Nur damit keine Missverständnisse aufkommen: mir ist natürlich klar, dass C# weder Templates noch irgendeine Form der Templatespezialisierung kennt. Mein Code nutzt ja lediglich Überladung. Das Ziel des Codes ist aber ähnlich und ich denke, er hilft dem OP am ehesten.



  • Mein Code nutzt ja lediglich Überladung. Das Ziel des Codes ist aber ähnlich und ich denke, er hilft dem OP am ehesten.

    Das Ziel von Templates war ursprünglich denke ich dass man weniger Code schreiben muss, und genau das bekommt man in C# nicht hin. Templates gibts nicht, und der Preprozessor würde auch soweit kastriert dass es zu nixmehr zu gebrauchen ist.
    Das ist auch das was ich mit meinem Posting sagen wollte. Kein "weniger tippen" in C#.



  • hustbaer schrieb:

    Mein Code nutzt ja lediglich Überladung. Das Ziel des Codes ist aber ähnlich und ich denke, er hilft dem OP am ehesten.

    Das Ziel von Templates war ursprünglich denke ich dass man weniger Code schreiben muss, und genau das bekommt man in C# nicht hin.

    Na ja, ein wenig Freiheit bekommt man durchaus, nur leider natürlich nicht in dem Maße wie in C++. Aber folgender Code ist doch ein gutes Beispiel dafür, dass man durch Generics auch weniger tippen muss (*und* Typsicherheit beibehält):

    public static int CountIf<T>(this IEnumerable<T> items, Func<T, bool> p) {
        return items.Where(p).Select(x => 1).Sum();
    }
    

    /EDIT: So'n Quark 🙂 Man muss bei LINQ schon ein wenig aufpassen, dass man nicht zu klug wird.

    return items.Where(p).Count()
    

    Ist aber auch wurscht, man könnte gleich die korrekte Überladung von 'Count' verwenden, das Beispiel dient ja nur der Illustration.



  • Ja hast recht, sowas ist nett.
    Geht aber erst mit Studio 2008, oder?



  • hustbaer schrieb:

    Ja hast recht, sowas ist nett.
    Geht aber erst mit Studio 2008, oder?

    Ja, na gut … aber es ging mir eigentlich eher weniger um die Extension Methods. Man kann das ganze ja auch als statische Funktion in einer Helper-Klasse machen.


Anmelden zum Antworten