Подтвердить что ты не робот

Ошибка (-ы) компилятора Visual Studio 2017

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

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

  • 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.

Изменить 2:

  • VS15 <= > VS17 введите описание изображения здесь
4b9b3361

Ответ 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, так как обычно вам нужна переменная в целевом типе.

Ответ 2

С# 7 расширяет оператор is от чистого тестирования типа до того, что они называют Соответствие шаблону.

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

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