Laden...

Parameter xyz cannot be used inside lambda expression when using ref or out modifier.

Erstellt von Stefan8887878 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.515 Views
Thema geschlossen
S
Stefan8887878 Themenstarter:in
2 Beiträge seit 2013
vor 10 Jahren
Parameter xyz cannot be used inside lambda expression when using ref or out modifier.

Hallo Leute

Ich definiere in einer Funktion mit ref prametern eine Async-Funktion mit einem einem Lambda-Ausdruck. Dann erhalte ich die Meldung während dem compilieren:> Fehlermeldung:

Parameter dscontent cannot be used inside lambda expression when using ref or out modifier.

Wie kann ich das Problem beheben leider kann ich keine sync funktion aufrufen, da das ganze async sein muss.

Danke im Voraus

Das heisst


static void GeneralFunktion(ref dataset dscontent)
{
    webclient.downloadfileasync("pfad1","pfad2");
    webclient.downloadfilecompleted+=(sender, e)=>
    {
        dscontent.readxml(pfad2); // hier das problem: er meldet mir während dem   Compilieren: Parameter dscontent cannot be used inside lambda expression when using ref or out modifier
    }
}

1.002 Beiträge seit 2007
vor 10 Jahren

Hallo Stefan8887878,

herzlich Willkommen auf myCSharp.

Gleich vorweg, dein Code ist leider Kraut und Rüben:
*Variablenbenennung *Sprache (Englisch & Deutsch) *(fehlende) Formatierung

Warum übergibst du deinen Parameter überhaupt per ref? Lass das ref-Keyword doch einfach weg. Per Referenz übergeben wird deine dataset-Instanz trotzdem.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

771 Beiträge seit 2009
vor 10 Jahren

Dafür musst du eine lokale Variable anlegen:


static void GeneralFunktion(ref dataset dscontent)
{
  dataset ds = dscontent;

  webclient.downloadfileasync("pfad1","pfad2");
  webclient.downloadfilecompleted+=(sender, e)=>
  {
     ds.readxml(pfad2);
  }
} 

Wobei ich nicht sehe, warum du 'ref' hier benötigst? Vllt. ist das eher dein Problem?

Und du meinst DataSet aus dem System.Data Namespace?

Btw: Benutze hier im Forum die C#-Tags (#-Button)

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Stefan8887878,

ergänzend zu den vorherigen Antworten siehe auch [Artikel] Parameter-Übergabemechanismen: call by value vs. call by reference (ref/out) und [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen). Beachte bitte weiters [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Edit: Stefan8887878 hat mich per PM darauf hingewiesen, dass es ihm um eine "Rückgabe" von dscontent geht, daher der Versuch mittels ref. Das geht in diesem Falle aber wegen der anonymen Methode nicht bzw. widerspricht es auch dem asynchronen Gedanken. Grob: einmal asynchron - immer asnychron. Die Asynchronizität muss ich in Folge also durch das restliche Programm durchziehen.
Angewandt auf deine Aufgabe heißt das, dass der Aufrufer z.B. ebenfalls durch ein Ereignis benachrichtigt werden kann. Siehe hierzu [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse). D.h. im Ereginishandler von Downloadfilecompleted feuerst du dein Ereignis um den Aufrufer zu benachrichtigen und in den EventArgs übergibts du das dscontent-DataSet.

Anstatt dem Ereignis-basierten asynchronen Muster kann ab .net 4.0 auch mittels Tasks und Continuations und ab .net 4.5 mit async/await gearbeitet werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Thema geschlossen