Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Halter <halter73@gmail.com>2022-05-17 23:42:32 +0300
committerStephen Halter <halter73@gmail.com>2022-07-23 00:28:17 +0300
commitec7e5670617bd8f0e0ec5713fd24190e04d3bb95 (patch)
tree9d854b1f7f38eac33504bc8fec13bd48934f2429
parent6ad8ac45971afd24f705b4cb32b8bd2858a551cc (diff)
Task and ValueTask are not covarianthalter73/task-is-not-covariant
-rw-r--r--src/Http/Http.Extensions/src/RequestDelegateFactory.cs40
-rw-r--r--src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs17
2 files changed, 8 insertions, 49 deletions
diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
index 78213b3375..a51aa4ea5b 100644
--- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
+++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
@@ -46,7 +46,7 @@ public static partial class RequestDelegateFactory
private static readonly MethodInfo ExecuteValueTaskOfStringMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskOfString), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteTaskResultOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteValueResultTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!;
- private static readonly MethodInfo ExecuteObjectReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteObjectReturn), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteAwaitedReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteAwaitedReturn), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo GetRequiredServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetRequiredService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!;
private static readonly MethodInfo GetServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!;
private static readonly MethodInfo ResultWriteResponseAsyncMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteResultWriteResponse), BindingFlags.NonPublic | BindingFlags.Static)!;
@@ -886,7 +886,7 @@ public static partial class RequestDelegateFactory
}
else if (returnType == typeof(object))
{
- return Expression.Call(ExecuteObjectReturnMethod, methodCall, HttpContextExpr);
+ return Expression.Call(ExecuteAwaitedReturnMethod, methodCall, HttpContextExpr);
}
else if (returnType == typeof(ValueTask<object>))
{
@@ -1876,12 +1876,12 @@ public static partial class RequestDelegateFactory
{
static async Task ExecuteAwaited(ValueTask<object> valueTask, HttpContext httpContext)
{
- await ExecuteObjectReturn(await valueTask, httpContext);
+ await ExecuteAwaitedReturn(await valueTask, httpContext);
}
if (valueTask.IsCompletedSuccessfully)
{
- return ExecuteObjectReturn(valueTask.GetAwaiter().GetResult(), httpContext);
+ return ExecuteAwaitedReturn(valueTask.GetAwaiter().GetResult(), httpContext);
}
return ExecuteAwaited(valueTask, httpContext);
@@ -1891,45 +1891,21 @@ public static partial class RequestDelegateFactory
{
static async Task ExecuteAwaited(Task<object> task, HttpContext httpContext)
{
- await ExecuteObjectReturn(await task, httpContext);
+ await ExecuteAwaitedReturn(await task, httpContext);
}
if (task.IsCompletedSuccessfully)
{
- return ExecuteObjectReturn(task.GetAwaiter().GetResult(), httpContext);
+ return ExecuteAwaitedReturn(task.GetAwaiter().GetResult(), httpContext);
}
return ExecuteAwaited(task, httpContext);
}
- private static Task ExecuteObjectReturn(object obj, HttpContext httpContext)
+ private static Task ExecuteAwaitedReturn(object obj, HttpContext httpContext)
{
- if (obj is Task<object> taskObj)
- {
- return ExecuteTaskOfObject(taskObj, httpContext);
- }
- else if (obj is ValueTask<object> valueTaskObj)
- {
- return ExecuteValueTaskOfObject(valueTaskObj, httpContext);
- }
- else if (obj is Task<IResult?> task)
- {
- return ExecuteTaskResult(task, httpContext);
- }
- else if (obj is ValueTask<IResult?> valueTask)
- {
- return ExecuteValueTaskResult(valueTask, httpContext);
- }
- else if (obj is Task<string?> taskString)
- {
- return ExecuteTaskOfString(taskString, httpContext);
- }
- else if (obj is ValueTask<string?> valueTaskString)
- {
- return ExecuteValueTaskOfString(valueTaskString, httpContext);
- }
// Terminal built ins
- else if (obj is IResult result)
+ if (obj is IResult result)
{
return ExecuteResultWriteResponse(result, httpContext);
}
diff --git a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
index 6553767887..3e09154dd7 100644
--- a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
+++ b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
@@ -2845,14 +2845,6 @@ public class RequestDelegateFactoryTests : LoggedTest
// Object return type where the object is IResult
static object StaticResultAsObject() => new CustomResult("Still not enough tests!");
- static object StaticResultAsTaskObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!"));
- static object StaticResultAsValueTaskObject() => ValueTask.FromResult<object>(new CustomResult("Still not enough tests!"));
-
- // Object return type where the object is Task<IResult>
- static object StaticResultAsTaskIResult() => Task.FromResult<IResult>(new CustomResult("Still not enough tests!"));
-
- // Object return type where the object is ValueTask<IResult>
- static object StaticResultAsValueTaskIResult() => ValueTask.FromResult<IResult>(new CustomResult("Still not enough tests!"));
// Task<object> return type
static Task<object> StaticTaskOfIResultAsObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!"));
@@ -2872,11 +2864,6 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Func<ValueTask<CustomResult>>)StaticValueTaskTestAction},
new object[] { (Func<object>)StaticResultAsObject},
- new object[] { (Func<object>)StaticResultAsTaskObject},
- new object[] { (Func<object>)StaticResultAsValueTaskObject},
-
- new object[] { (Func<object>)StaticResultAsTaskIResult},
- new object[] { (Func<object>)StaticResultAsValueTaskIResult},
new object[] { (Func<Task<object>>)StaticTaskOfIResultAsObject},
new object[] { (Func<ValueTask<object>>)StaticValueTaskOfIResultAsObject},
@@ -2922,8 +2909,6 @@ public class RequestDelegateFactoryTests : LoggedTest
// Dynamic via object
static object StaticStringAsObjectTestAction() => "String Test";
- static object StaticTaskStringAsObjectTestAction() => Task.FromResult("String Test");
- static object StaticValueTaskStringAsObjectTestAction() => ValueTask.FromResult("String Test");
// Dynamic via Task<object>
static Task<object> StaticStringAsTaskObjectTestAction() => Task.FromResult<object>("String Test");
@@ -2941,8 +2926,6 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Func<ValueTask<string>>)StaticValueTaskTestAction },
new object[] { (Func<object>)StaticStringAsObjectTestAction },
- new object[] { (Func<object>)StaticTaskStringAsObjectTestAction },
- new object[] { (Func<object>)StaticValueTaskStringAsObjectTestAction },
new object[] { (Func<Task<object>>)StaticStringAsTaskObjectTestAction },
new object[] { (Func<ValueTask<object>>)StaticStringAsValueTaskObjectTestAction },