2016-12-02 4 views
13

Я только что обновился до VS2017, но сразу же с летучей мыши мой проект больше не может быть построен, так как я получаю кучу странных ошибок компилятора, которых не было, когда я использовал VS15.Ошибка компилятора Visual Studio 2017

Ошибки, такие как:

  • Syntax Error; value expected
  • Invalid Expression Term '['
  • Invalid Expression Term 'byte'
  • Using the generic type requires 1 type arguments

Редактировать 1:

  • Просто создал небольшое консольное приложение и скопировать часть кода к ней и той же ошибке (ы) компилятора появилось
using System; 
using System.Runtime.InteropServices; 

namespace Error 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Array array2D = null; 
      if (array2D is Bgra <byte>[,]) 
      { 
      } 
     } 
    } 

    public interface IColor { } 

    public interface IColor<T> : IColor 
     where T : struct 
    { } 

    public interface IColor2 : IColor { } 

    public interface IColor2<T> : IColor2, IColor<T> 
     where T : struct 
    { } 

    public interface IColor3 : IColor { } 

    public interface IColor3<T> : IColor3, IColor<T> 
     where T : struct 
    { } 

    public interface IColor4 : IColor { } 

    public interface IColor4<T> : IColor4, IColor<T> 
     where T : struct 
    { } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct Bgra<T> : IColor4<T> 
     where T : struct 
    { 
     public Bgra(T b, T g, T r, T a) 
     { 
      B = b; 
      G = g; 
      R = r; 
      A = a; 
     } 

     public T B; 

     public T G; 

     public T R; 

     public T A; 

     public override string ToString() 
     { 
      return $"B: {B}, G: {G}, R: {R}, A: {A}"; 
     } 

     public const int IDX_B = 0; 

     public const int IDX_G = 1; 

     public const int IDX_R = 2; 

     public const int IDX_A = 3; 
    } 
} 

Обратите внимание, что тот же самый проект компилируется нормально в VS15 и даже VS13.

Edit 2:

  • VS15 < => VS17 enter image description here
+6

Можете ли вы воспроизвести ошибку в небольшой программе? –

+3

Не указывает ли строка кода «синтаксическая ошибка», если это так, а какая строка? –

+0

@MatthewWatson #Edited –

ответ

1

Согласно моего теста, используя as оператор работает, как ожидается, в Visual Studio 2017.

Таким образом, вы можете использовать

var tmp = array2D as Bgra<Byte>[,]; 
if (tmp != null) { ... } 

Кроме того, оператор is делать работы с простым массивом:

if (array2D is int[,]) { ... } 

также компилировать.

Так кажется, что проблемный случай, если у вас есть массив дженериков. Фактически, если вы делаете что-то вроде

if (array2D is List<int>[,]) { ... } 

вы получите ошибку компиляции.

Кроме того, следующий код будет составлять

object something = null; 
if (something is List<int>) { ... } 

Таким образом, единственным проблематичным является случай, когда с использованием массива общего типа в качестве аргумента оператора is.

В качестве побочного примечания я обычно предпочитаю использовать оператор as оператору is, так как обычно вам нужна переменная в целевом типе.

+0

Та же проблема возникает с ** Is-выражения с рисунком ** при использовании массив дженериков ... См. также [Что нового в C# 7.0] (https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/). – Phil1970

+0

Оператор 'as' работает, но нет причин для' '' не работать как обычно. –

+1

Я согласен с тем, что он должен скомпилировать, но я подозреваю, что не было единичного теста для этого конкретного случая, требующего ** (1) ** массивов, ** (2) ** generics и ** (3) ** 'is' operator , Я рекомендую вам упростить код до минимального примера и отправить проблему в Microsoft. – Phil1970

1

C# 7 расширяет оператор is от чистового тестирования до того, что они называют Pattern Matching.

Синтаксический анализатор теперь, похоже, путается is, за которым следует массив-общий.Я бы попробовал с parens вокруг типа, но я не могу проверить это решение

if (array2D is (Bgra<byte>[,])) 
+0

Parenthesis не работает ... – Phil1970

+0

В этом случае Is-выражения с шаблонами также не будут работать: 'if (array2D is Bgra [,] localName)' также не будет компилироваться, пока генератор или массив будут работать правильно. – Phil1970