Citando de Visual Studio 2017 Notas de la versión de RC

Analizadores y extensiones de idioma

Esta versión incluye algunas extensiones de lenguaje nuevas propuestas en las que estamos trabajando para las próximas versiones de C # y Visual Basic. Estas nuevas funciones de idioma están habilitadas de forma predeterminada e incluyen:

Para C #:

Dice que está habilitado de forma predeterminada, pero no puedo hacer que esto funcione. Incluso tomando la descarga exacta de ArbitraryAsyncReturns.zip de la página de Github vinculada (y arreglando las referencias a los paquetes React NuGet para eliminar errores no relacionados), pero sin instalar el paquete VSIX personalizado (que es para VS2015), sigo obteniendo

error CS1983: el tipo de retorno de un método asincrónico debe ser nulo, Tarea o Tarea

¿Necesito tomar algún paso adicional para que esto funcione?


Primero intenté reducir ese ejemplo específico a una versión mínima que debería funcionar, pero al intentar jugar con él, todavía no sabía qué debería funcionar y qué no. Sin embargo, como mínimo, dada esta mejora del lenguaje, esperaba un programa falso como

struct Test { }
static class Program {
    static async Test Test() { }
    static void Main() { }
}

Fallar al compilar con un mensaje de error diferente. Recibir el mismo mensaje de error incluso entonces sugirió que esta extensión de idioma aún no estaba habilitada, pero JaredPar notó que el mensaje de error simplemente no se ha actualizado todavía.


Ahora reduje uno de los ejemplos supuestamente válidos a una versión mínima que creo que debería compilarse (pero falla en tiempo de ejecución debido a los métodos no implementados), pero no compila:

using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

namespace System.Runtime.CompilerServices {
    public class TasklikeAttribute : Attribute {
        public TasklikeAttribute(Type builderType) { }
    }
}

struct TasklikeTypeMethodBuilder<T> {
    public static TasklikeTypeMethodBuilder<T> Create() => throw new NotImplementedException();
    public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine => throw new NotImplementedException();
    public void SetStateMachine(IAsyncStateMachine stateMachine) => throw new NotImplementedException();
    public void SetResult(T result) => throw new NotImplementedException();
    public void SetException(Exception exception) => throw new NotImplementedException();
    public TasklikeType<T> Task => throw new NotImplementedException();
    public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException();
    public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException();
}

[Tasklike(typeof(TasklikeTypeMethodBuilder<>))]
struct TasklikeType<T> { }

static class Program {
    static void Main(string[] args) { }
    static async TasklikeType<string> TasklikeTypeTester() {
        await Task.Yield();
        return "hello";
    }
}

Se genera el mismo error de compilador que el anterior para static async TasklikeType<string> TasklikeTypeTester().

11
user743382 14 dic. 2016 a las 04:47

2 respuestas

La mejor respuesta

El nombre del atributo TasklikeAttribute resulta que no es lo que se implementó en VS2017 RC, es de una versión diferente de la propuesta. Lo que realmente se implementa depende de un tipo System.Runtime.CompilerServices.AsyncMethodBuilderAttribute, que parece funcionar exactamente de la misma manera.

No pude encontrar esto documentado, pero pude encontrarlo en las pruebas de Roslyn, por ejemplo CodeGenAsyncTests.cs:

[AsyncMethodBuilder(typeof(ValueTaskMethodBuilder))]
struct ValueTask { }
...
namespace System.Runtime.CompilerServices { class AsyncMethodBuilderAttribute : System.Attribute { public AsyncMethodBuilderAttribute(System.Type t) { } } }
5
user743382user743382 15 dic. 2016 a las 02:41

No hay nada más que deba hacer para habilitar devoluciones similares a tareas. El problema aquí es que el mensaje diagonal para esta función aún no se ha actualizado. Aquí hay un enlace al problema de seguimiento:

https://github.com/dotnet/roslyn/issues/12621

6
JaredPar 14 dic. 2016 a las 17:48