2016-12-02 3 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

012,351
    6,
  • 는 그냥 작은 콘솔 응용 프로그램을 만들고 그것에 코드와 같은 컴파일러 오류 (들)의 일부를 복사
동일한 프로젝트가 VS15 심지어 VS13에 괜찮 컴파일합니다
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; 
    } 
} 

주 등장.

편집 2 : as 연산자를 사용하여 내 테스트에 따르면

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

작은 프로그램에서 오류를 재현 할 수 있습니까? –

+3

"구문 오류"가 있어야하는 코드 줄을 지정하지 않았습니까? 그렇다면 줄은 무엇입니까? –

+0

@MatthewWatson #Edited –

답변

1

, 비주얼 스튜디오에서 예상 작품으로 2017 년

그래서 당신은 사용할 수 있습니다

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

또한, is 운영자는 간단한 배열로 작업을 수행

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

또한 컴파일 것입니다.

제네릭 배열을 가지고있는 경우 문제가있는 것 같습니다. 사실, 당신이 뭔가를한다면

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

당신은 컴파일 오류가 발생합니다. is 연산자의 인수로서 일반적인 유형의 어레이를 사용하는 경우

또한 다음 코드 따라서

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

컴파일 할 유일한 문제 경우이다.

보조 메모로 일반적으로 as 연산자를 is 연산자로 사용하는 것이 일반적으로 선호합니다. 어쨌든 대상 유형에 변수가 필요하기 때문입니다.

+0

같은 문제가 ** 패턴 **가 표현식 발생 generics의 배열 ... [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' 연산자를 필요로하는 특정 케이스에 대한 단위 테스트가 없다고 생각됩니다. . 최소한의 예제로 코드를 단순화하고 Microsoft에 문제를 제출하는 것이 좋습니다. – Phil1970

1

C# 7은 is 연산자를 순수 형식 테스트에서 Pattern Matching으로 확장합니다.

이제 파서는 is에 이어 array-of-generic으로 혼동스럽게 보입니다.이 유형을 둘러싼 괄호로 시도 할 것이지만이 솔루션을 테스트 할 수 없습니다.

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

괄호가 작동하지 않습니다 ... – Phil1970

+0

이 경우 패턴이있는 Is 식도 작동하지 않습니다. generic 또는 배열 만 제대로 작동하는 동안'if (array2D Bgra [,] localName)'도 컴파일되지 않습니다. – Phil1970