2017-02-04 1 views
4

REMARQUE: Cela semble être un problème avec le compilateur utilisé avec les projets SSDT, il est apparemment résolu dans le RC 2017. Mon problème est similaire à celui décrit here.Impossible d'écrire un membre de la fonction à corps d'expression

J'ai du code qui refuse de me laisser l'écrire en tant que membre de la fonction corps-expression. En bref, je veux faire:

void foo() => bar(); 

Mais l'IDE jette une crise de colère et exige que je l'écris comme ceci:

void foo() { bar(); } 

Je veux dire que, ce sont deux caractères supplémentaires, mais je ne suis pas sûr pourquoi il se plaint, les erreurs n'ont pas de sens non plus. Il me donne les 3 erreurs suivantes:

  • CS0000:;
  • CS0000: La méthode doit avoir un type de retour.
  • CS0000: identificateur attendu.

Le code complet ressemble à ceci. J'ai testé ce dans la fenêtre interactive C# et tout compile et s'exécute correctement. Je ne trouve aucun caractère non imprimable dans le code.

est d'utiliser VS communauté 2015 avec le cadre cible étant 4.6.1

code complet:

using System.Data.SqlClient; 
using Microsoft.SqlServer.Server; 

public partial class Triggers 
{ 

    private const string ConnectionString = "context connection = true"; 

    private const string ReadInsertedTable = @" 
    SELECT ID, 
      (
       SELECT * 
       FROM inserted AS b 
       WHERE a.ID = b.ID 
       FOR XML RAW, ELEMENTS XSINIL 
      ) 
    FROM inserted AS a 
"; 
    [SqlTrigger(Name = "Person_Insert", Target = "Person", Event = "FOR INSERT")] 
    public static void Person_Insert() => AuditInsert(TableName); // All errors here. 

    private const string TableName = "Person"; 

    private static void AuditInsert(string tableName) 
    { 

     using (var readConnection = new SqlConnection(ConnectionString)) 
     using (var writeConnection = new SqlConnection(ConnectionString)) 
     { 
      using (var readCommand = new SqlCommand(ReadInsertedTable, readConnection)) 
      { 
       readConnection.Open(); 
       using (var reader = readCommand.ExecuteReader()) 
       { 
        SqlContext.Pipe.Send((reader)); 
       } 
      } 
     } 
    } 
} 

enter image description here

Mise à jour: code compile à l'aide de l'utilitaire msbuild mais échoue encore dans Visual Studio.

+0

J'ai copié votre code sur mon vs et il a compilé sans erreurs –

+0

Une idée où commencer même à chercher pour essayer de résoudre ce problème? Parce que CS0000 ne semble même pas être un code normal. Je vais ajouter une image de mon IDE. – Jake

+0

quelle version de VS utilisez-vous? Notez que les membres de corps d'expression sont des caractéristiques de ** C# 6 ** donc cela ne fonctionne pas sur les anciens IDE –

Répondre

3

Cela aura quelque chose à voir avec Roslyn. Essayez d'exécuter ceci:

non Roslyn: https://dotnetfiddle.net/LJm1Fj

Roslyn: https://dotnetfiddle.net/aMUsj0

Je pense qu'il ya quelque chose de mal, soit avec votre dossier de projet ou votre installation de Visual Studio car VS2015 doit utiliser le compilateur basé sur Roslyn par défaut.

Je vais essayer:

  • la création d'un nouveau projet avec le code du violon au-dessus
  • si elle compile comparer alors les différences dans les fichiers * .csproj, principalement les ToolsVersion <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> et cible <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  • vous devriez regarder aussi dans les Output-> Construire fenêtre VS et vérifier l'exécutable en cours de lancement, dans mon cas: C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference ... Using shared compilation with compiler from directory: C:\Program Files (x86)\MSBuild\14.0\bin
  • si elle ne compile pas, je vous suggère de réinstaller.NET et VS
+0

On dirait qu'il utilise un ancien compilateur. Le csc.exe que j'obtiens est sous C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Csc.exe. Une idée de comment le changer? – Jake

+1

Avez-vous essayé de créer le projet vanille comme je l'ai suggéré? Je pense qu'il y aura des différences dans le dossier de projet, vraisemblablement dans la section des cibles. Ou peut-être existe-t-il une version linguistique spécifique dans le fichier de projet (Propriétés du projet -> Construire -> Avancé -> Version de la langue). – rocky

+0

Oui, je viens de faire ça. C'est à voir avec le type de projet. Apparemment, les projets de base de données SQL Server (SSDT) ​​n'utilisent pas Roslyn. – Jake

0

Cette réponse s'est avérée largement non pertinente.

Comme le demandeur a compris lui-même, avec l'aide d'un utilisateur rocheux, la question est qu'une base de données SQL Server Project (.sqlproj) (contrairement à d'autres projets de type .csproj) ne se construit pas avec le nouveau compilateur C# 6.0, à moins dans Visual Studio 2015. Le thread lié par le demandeur, Usage of wrong compiler during SQL Server Database Project building, a quelques détails.


ancienne réponse:

Dans votre image, la déclaration constante:

private const string TableName = "Person"; 

manque. Toutefois, vous n'avez pas supprimé le paramètre tableName de la méthode AuditInsert.

+0

Le code est correct, cela semble être un problème avec le compilateur utilisé pour les projets SSDT. Apparemment, c'est réglé dans la RC 2017, mais je ne vais pas l'installer de sitôt.:-) – Jake

+0

@Jake Comment 'AuditInsert (TableName)' peut-il être correct quand il n'y a pas de 'TableName' défini quelque part? Je regarde ton image. –

+0

L'image était juste pour montrer que les erreurs sont apparues depuis que Maksim a dit que cela s'est bien passé pour lui. Nous avons déjà établi que c'est un problème de compilateur, pas un code. Je mets à jour ma question principale en conséquence avec un lien vers une question connexe. – Jake