2016-12-02 28 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:など

エラー

  • は、ほんの少しのコンソールアプリケーションを作成し、それにコードの一部をコピーして、同じコンパイラエラー(複数可)正確に同じプロジェクトは、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:

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

小さなプログラムでエラーを再現できますか? –

+3

"構文エラー"があると思われるコード行を指定していない場合、その行は何ですか? –

+0

@MatthewWatson #Edited –

答えて

1

私のテストによると、2017年

だからあなたが使用できるのVisual Studioで期待通りas演算子を使用して動作します

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

(entry.EntityがISelfReferencingTombstone 実体である)場合、'同じ問題が発生すると** ANを使用した場合**パターンで、表情ですジェネリックの配列... [C#7.0の新機能](https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/)も参照してください。 – Phil1970

+0

'as'演算子は動作しますが、' is'がいつものように動作しない理由はありません。 –

+1

私はコンパイルする必要があることに同意しますが、**(1)**配列、**(2)**ジェネリックおよび**(3)** 'is'演算子を必要とするその特定のケースの単体テストはなかったと思われます。最小限の例でコードを簡素化し、Microsoftに問題を提出することをお勧めします。 – Phil1970

1

C#7は、is演算子を純粋な型テストからPattern Matchingに拡張します。

パーサーは、isとそれに続くgenericの配列によって混乱するようです。私は型の周りに括弧で試してみたいが、私はこの解決策をテストすることはできません

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

括弧が機能しません... – Phil1970

+0

この場合、パターン付きのIs式も機能しません。generic(配列のみが正しく動作する間、 'array2DはBgl [、] localName)'もコンパイルされません。 – Phil1970

関連する問題