c# - Why does using the await operator for the second argument to a method affect the value of the first argument? -


the following c# program produces unexpected output. expect see:

value1: 25, value2: 10

value1: 10, value2: 25

but instead see

value1: 0, value2: 10

value1: 10, value2: 25

namespace consoleapplication4 {     class program     {         static void main(string[] args)         {             dowork().wait();              console.readline();         }          private async static task dowork()         {             someclass foo = new someclass()             {                 myvalue = 25.0f             };              printtwovalues(foo.myvalue, await getvalue());             printtwovalues(await getvalue(), foo.myvalue);         }          static void printtwovalues(float value1, float value2)         {             console.writeline("value1: {0}, value2: {1}", value1, value2);         }          static task<float> getvalue()         {             return task.factory.startnew(() =>                 {                     return 10.0f;                 });         }          class someclass         {             private float myvalue;              public float myvalue             {                                 {                     return this.myvalue;                 }                 set                 {                     this.myvalue = value;                 }             }         }     } } 

can explain me why using "await" operator in expression second argument printtwovalues method seems affecting value of first argument?

my guess must have fact argument list evaluated left-to-right. in first call printtwovalues i'm guessing return value someclass.myvalue gets pushed onto stack. execution continues getvalue starts task , exits. dowork exits , schedules continuation call printtwovalues when continuation runs value had gotten pushed on stack somehow lost , reverted default value.

while there simple ways workaround problem, storing arguments in temporary variables before passing them printtwovalues method, i'm curious why behavior occurring.

note: i'm using visual studio 2013, update 5. i'm building console application targeting .net framework 4.5 , running on windows 10 enterprise.

i've tested code both c#5 compiler , c#6 compiler using respectively linqpad 4 , linqpad 5 , reproduce issue.

this looks compiler bug of c#5 compiler, because when decomplied both versions .net reflector 9, got different code:

c#5:

private async static task dowork() {     float myvalue;     someclass foo = new someclass {         myvalue = 25f     };     float introduced6 = await getvalue();     printtwovalues(myvalue, introduced6);     float introduced7 = await getvalue();     printtwovalues(introduced7, foo.myvalue); } 

c#6:

private async static task dowork() {     someclass foo = new someclass {         myvalue = 25f     };     float myvalue = foo.myvalue;     float num2 = await getvalue();     float asyncvariable1 = num2;     printtwovalues(myvalue, asyncvariable1);     num2 = await getvalue();     float asyncvariable2 = num2;     printtwovalues(asyncvariable2, foo.myvalue); } 

notice that, c#5, myvalue variable declared before declaration of of foo , never initialized before first call printtwovalues.


Comments

Popular posts from this blog

html - Outlook 2010 Anchor (url/address/link) -

javascript - Why does running this loop 9 times take 100x longer than running it 8 times? -

Getting gateway time-out Rails app with Nginx + Puma running on Digital Ocean -