@@ -37,6 +37,25 @@ public void Test_TaskExtensions_ResultOrDefault()
37
37
Assert . AreEqual ( 42 , ( ( Task ) tcs . Task ) . GetResultOrDefault ( ) ) ;
38
38
}
39
39
40
+ [ TestCategory ( "TaskExtensions" ) ]
41
+ [ TestMethod ]
42
+ public async Task Test_TaskExtensions_ResultOrDefault_FromAsyncTaskMethodBuilder ( )
43
+ {
44
+ var tcs = new TaskCompletionSource < object > ( ) ;
45
+
46
+ Task < string > taskFromBuilder = GetTaskFromAsyncMethodBuilder ( "Test" , tcs ) ;
47
+
48
+ Assert . IsNull ( ( ( Task ) taskFromBuilder ) . GetResultOrDefault ( ) ) ;
49
+ Assert . IsNull ( taskFromBuilder . GetResultOrDefault ( ) ) ;
50
+
51
+ tcs . SetResult ( null ) ;
52
+
53
+ await taskFromBuilder ;
54
+
55
+ Assert . AreEqual ( ( ( Task ) taskFromBuilder ) . GetResultOrDefault ( ) , "Test" ) ;
56
+ Assert . AreEqual ( taskFromBuilder . GetResultOrDefault ( ) , "Test" ) ;
57
+ }
58
+
40
59
[ TestCategory ( "TaskExtensions" ) ]
41
60
[ TestMethod ]
42
61
public void Test_TaskExtensions_ResultOrDefault_OfT_Int32 ( )
@@ -86,5 +105,16 @@ public void Test_TaskExtensions_ResultOrDefault_OfT_String()
86
105
87
106
Assert . AreEqual ( "Hello world" , tcs . Task . GetResultOrDefault ( ) ) ;
88
107
}
108
+
109
+ // Creates a Task<T> of a given type which is actually an instance of
110
+ // System.Runtime.CompilerServices.AsyncTaskMethodBuilder<TResult>.AsyncStateMachineBox<TStateMachine>.
111
+ // See https://source.dot.net/#System.Private.CoreLib/AsyncTaskMethodBuilderT.cs,f8f35fd356112b30.
112
+ // This is needed to verify that the extension also works when the input Task<T> is of a derived type.
113
+ private static async Task < T > GetTaskFromAsyncMethodBuilder < T > ( T result , TaskCompletionSource < object > tcs )
114
+ {
115
+ await tcs . Task ;
116
+
117
+ return result ;
118
+ }
89
119
}
90
120
}
0 commit comments