using System.Threading.Tasks;
internal static class TaskExtensions
public static async Task<object> ToGenericTaskAsync(this Task task)
var taskType = task.GetType();
if (!IsAssignableToGenericTaskType(taskType))
.GetProperty("Result", BindingFlags.Instance | BindingFlags.Public)!
private static bool IsAssignableToGenericTaskType(Type type)
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof(Task<>) &&
type.GetGenericArguments()[0] != Type.GetType("System.Threading.Tasks.VoidTaskResult"))
return type.BaseType is not null && IsAssignableToGenericTaskType(type.BaseType);
public static class Program
public static async Task Main()
Console.WriteLine(await Task.CompletedTask.ToGenericTaskAsync() is null);
Console.WriteLine(await Task.FromResult<int>(5).ToGenericTaskAsync() is 5);