2013-03-09 3 views
8

Während mit der neuesten Version von Arbeits ich gefunden habe, dass es nicht dynamic Schlüsselwort nicht unterstützt, während die Ausführung Kompilieren und Skript, dh Sie error CS8000: This language feature ('dynamic') is not yet implemented in Roslyn. einen Übersetzungsfehler erhalten:Könnte Roslyn compile erwarten Stichwort? Hier ist ein kurzer Code-Schnipsel

var engine = new ScriptEngine(); 
var script = @"dynamic someVariable = 0;"; 
// you an error CS8000: This language feature ('dynamic') is not yet implemented in Roslyn 
engine.CreateSession().Execute(script); 

Während der Arbeit mit await Stichwort ...

Im Gegensatz dazu, während mit await Stichwort bei der Kompilierung oder Skript arbeiten, ich habe in der Regel einige zufällige Zusammenstellung Fehler wie ein von folgenden:

  • error CS1001: Identifier expected
  • error CS1003: Syntax error, ',' expected
  • error CS0246: The type or namespace name 'await' could not be found (are you missing a using directive or an assembly reference?)

Probe von Scripting

var engine = new ScriptEngine(); 

new[] 
{ 
    "System", "System.Threading", "System.Threading.Tasks", 
} .ToList().ForEach(@namespace => engine.ImportNamespace(@namespace)); 

var script = @"await Task.Run(() => System.Console.WriteLine(""Universal [async] answer is '42'""));"; 

engine.CreateSession().Execute(script); 

Beispiel der Kompilation

// compilation sample 
const string codeSnippet = @"namespace DemoNamespace 
    { 
     using System; 
     using System.Threading; 
     using System.Threading.Tasks; 

     public class Printer 
     { 
      public async void Answer() 
      { 
       var answer = 42; 
       var task = Task.Run(() => System.Console.WriteLine(string.Format(""Universal [async] answer is '{0}'"", answer))); 
       await task; // not working 
       task.Wait(); // working as expected 
      } 
     } 
    }"; 

var syntaxTree = SyntaxTree.ParseText(codeSnippet, 
    options: new ParseOptions(languageVersion: LanguageVersion.CSharp5)); 

var references = new [] 
{ 
    MetadataReference.CreateAssemblyReference(typeof(Console).Assembly.FullName), 
    MetadataReference.CreateAssemblyReference(typeof(System.Threading.Tasks.Task).Assembly.FullName), 
}; 

var compilation = Compilation.Create(
         outputName: "Demo", 
         options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary), 
         syntaxTrees: new[] { syntaxTree }, 
         references: references); 

if(compilation.GetDiagnostics().Any()) 
{ 
    compilation.GetDiagnostics().Select(diagnostic => diagnostic).Dump(); 
    throw new Exception("Compilation failed"); 
} 

Assembly compiledAssembly; 
using (var stream = new MemoryStream()) 
{ 
    EmitResult compileResult = compilation.Emit(stream); 
    compiledAssembly = Assembly.Load(stream.GetBuffer()); 
} 

dynamic instance = Activator.CreateInstance(compiledAssembly.GetTypes().First()); 
instance.Answer(); 

Q: Fehle ich etwas oder ist es noch nicht implementiert?

Ich habe verschiedene Konfigurationen mit LanguageVersion.CSharp5 und ohne versucht. Sowohl die Google- als auch die Stackoverflow-Suche sind sowohl für die Keywords als auch voller Marketinghype und fast nutzlos. Microsoft "Roslyn" CTP forum hat auch keine Antwort dafür.

ps: soweit ich weiß, async Schlüsselwort für die Lesbarkeit eingeführt hat sowohl durch den Menschen und Compiler während await tut alles Magie

Antwort

9

await Unterstützung nicht in der aktuellen Roslyn CTP implementiert wird (obwohl es jetzt in implementiert interne Builds). Der Grund für den Unterschied in der Fehlerberichterstattung besteht darin, dass wir zuerst den Roslyn-Parser so entwickelt haben, dass er die gesamte C# 4-Sprache verarbeiten kann, und dann die Semantik für die einzelnen Funktionen einzeln ausgefüllt hat. Da await ein C# 5-Feature ist, wird es vom Parser nicht einmal erkannt, und es gibt keinen Platz, um seine Verwendung zu erkennen und einen guten Fehler zu liefern.

+6

Gibt es Pläne, wann dieser interne Build (oder ein neues CTP) veröffentlicht wird? – JustAnotherUserYouMayKnow

+0

Freue mich schon auf den nächsten Code-Drop! Ich möchte in der Lage sein, Klassen zu generieren, die die System.Net.Http.HttpClient Async-Unterstützung nutzen. –

5

Eigentlich hat das Roslyn Forum die Antwort. Wenn Sie sich den Beitrag Known Limitations and Unimplemented Language Features ansehen, werden Sie feststellen, dass er "Async" unter den noch nicht implementierten Funktionen in C# enthält.

Diese Liste ist über den Juni CTP, aber seit the list of changes between the June CTP and the December CTP nicht Async auflistet, bedeutet es, es ist einfach noch nicht implementiert.

Ich denke, der Grund für den Unterschied in der Fehlermeldung ist, dass Roslyn dynamic versteht (aber es noch nicht implementiert). Auf der anderen Seite versteht es nicht async - await, so gibt es Ihnen generische Kompilierungsfehler.