Ошибка (-ы) компилятора 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
![введите описание изображения здесь]()
Ответы
Ответ 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>[,]))