Announcement

Collapse
No announcement yet.

Geben Sie die Typargumente explizit an...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Geben Sie die Typargumente explizit an...

    Code:
                MatchCollection mc = Regex.Matches(Source, pattern
                mc.Cast<Match>().Select(match =>
                { 
                // ... using match...
                });
    Code:
    Die Typargumente der System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,TResult>)-Methode können nicht per Rückschluss aus der Syntax abgeleitet werden. Geben Sie die Typargumente explizit an.
    Wie muss ich das lösen?

    Liebe Grüße.

  • #2
    [highlight=c#]
    MatchCollection mc = Regex.Matches(Source, pattern
    mc.Cast<Match>().Select(((Match)match) =>
    {
    // ... using match...
    });
    [/highlight]

    So solltest es wohl funktionieren Eigentlich schon seltsam dass er den Typen da nicht automatisch erkennt.

    Comment


    • #3
      Originally posted by fanderlf View Post
      [highlight=c#]
      MatchCollection mc = Regex.Matches(Source, pattern
      mc.Cast<Match>().Select(((Match)match) =>
      {
      // ... using match...
      });
      [/highlight]
      So hatte ich es mir auch gedacht, aber dann will der Kompiler ein ")" und bin auf die foreach Schleife umgestiegen.

      Comment


      • #4
        Bei Deinem Regex fehlt auch eine oben.

        Comment


        • #5
          Originally posted by fanderlf View Post
          Bei Deinem Regex fehlt auch eine oben.
          Das stimmt zwar, aber das meinte ich nicht

          Es ist äußerst komisch. Der folgende Code bringt die Fehlermeldung von oben:

          Code:
                      string test;
                      MatchCollection mc = Regex.Matches(Source, Pattern);
                      mc.Cast<Match>().Select(match =>
                          {
                              test = match.Value;
                          });
          Folgender Code geht:

          Code:
                      string test;
                      MatchCollection mc = Regex.Matches(Source, UrlPattern);
                      mc.Cast<Match>().Select(match => test = match.Value);

          Comment


          • #6
            Das ist eigentlich logisch

            Der obere Block mit den geschweiften Klammern hat keinen Rückgabewert. Du kannst also auch nicht schreiben:

            [highlight=c#]
            var bla = { test = "" };
            [/highlight]

            Das akzeptiert der Compiler auch nicht da der geklammerte Block keinen Rückgabewert hat.

            [highlight=c#]
            var bla = test = "" ;
            [/highlight]

            Das funktioniert hingegen weil test erstmal "" zugewiesen wird und dann wird bla der Wert von Test (in diesem Fall "") zugewiesen. Das zweite Statement oben halt als einen Rückgabewert.

            Ich denke Du hast einfach das Select Statement falsch angewendet. Die korrekte Syntax für Deine Anforderungen wäre eher:
            [highlight=c#]
            string test;
            MatchCollection mc = Regex.Matches(Source, UrlPattern);
            mc.Cast<Match>().Select(match => match.Value);
            [/highlight]

            bzw.

            [highlight=c#]
            string test;
            MatchCollection mc = Regex.Matches(Source, UrlPattern);
            mc.Cast<Match>().Select(match => { return match.Value; });
            [/highlight]

            In einem Select statement wird ein Typ in einen anderen umgewandelt. Der umgewandelte Werte sollte von der Funktion zurückgegeben werden und nicht einfach zugewiesen werden wie Du es in Deinem Code hattest

            Comment


            • #7
              Wie mache ich dem Compiler deutlich, dass es in diesem Delegaten keinen Rückgabewert gibt?

              Comment


              • #8
                Select hat IMMER einen Rückgabewert. Die Signatur von Select sieht glaub ich so aus:

                IEnumerable<T2> Select(this IEnumerable<T1> elements, Func<T1,T2> translator);

                Die Funktion ist dazu da um Element in andere Elemente umzuwandeln. Das ganze ist KEIN foreach, denn dann wären wahrscheinlich fast alle Funktion aus den LINQ extension foreach. Diese Funktionen gehen etwas weiter.

                Es gibt allerdings ab .Net 4 auch eine ForEach Extension. Ansonsten ist die auch einfach schnell selbst geschriben:

                [highlight=c#]
                public void ForEach<T>(this IEnumerable<T> elements, Action<T> delegate)
                {
                foreach(var element in elements)
                delegate(element);
                }
                [/highlight]

                Comment

                Working...
                X