Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio 2017编译器错误_C#_Visual Studio 2017 - Fatal编程技术网

C# Visual Studio 2017编译器错误

C# Visual Studio 2017编译器错误,c#,visual-studio-2017,C#,Visual Studio 2017,我刚升级到VS2017,但一开始我的项目就无法再构建,因为我遇到了一堆奇怪的编译器错误,这些错误在我使用VS15时是不存在的 错误,例如: 语法错误;预期值 无效的表达式术语“[” 无效的表达式术语“byte” 使用泛型类型需要1个类型参数 编辑1: 刚刚创建了一个小型控制台应用程序,并将一些代码复制到其中,出现了相同的编译器错误 使用系统; 使用System.Runtime.InteropServices; 名称空间错误 { 班级计划 { 静态void Main() { 数组array

我刚升级到VS2017,但一开始我的项目就无法再构建,因为我遇到了一堆奇怪的编译器错误,这些错误在我使用VS15时是不存在的

错误,例如:

  • 语法错误;预期值
  • 无效的表达式术语“[”
  • 无效的表达式术语“byte”
  • 使用泛型类型需要1个类型参数
编辑1:
  • 刚刚创建了一个小型控制台应用程序,并将一些代码复制到其中,出现了相同的编译器错误
使用系统;
使用System.Runtime.InteropServices;
名称空间错误
{
班级计划
{
静态void Main()
{
数组array2D=null;
如果(array2D是Bgra[,])
{
}
}
}
公共接口IColor{}
公共接口IColor:IColor
其中T:struct
{ }
公共接口IColor2:IColor{}
公共接口IColor2:IColor2,IColor
其中T:struct
{ }
公共接口IColor3:IColor{}
公共接口IColor3:IColor3,IColor
其中T:struct
{ }
公共接口IColor4:IColor{}
公共接口IColor4:IColor4,IColor
其中T:struct
{ }
[StructLayout(LayoutKind.Sequential)]
公共结构Bgra:IColor4
其中T:struct
{
公共Bgra(TB、TG、TR、TA)
{
B=B;
G=G;
R=R;
A=A;
}
公共旅游局;
公共交通;
公共交通;
公共交通管理局;
公共重写字符串ToString()
{
返回$“B:{B},G:{G},R:{R},A:{A}”;
}
公共常数int IDX_B=0;
公共const int IDX_G=1;
公共const int IDX_R=2;
公共常数int IDX_A=3;
}
}
请注意,完全相同的项目在VS15甚至VS13中都可以编译

编辑2:
  • VS15 VS17

根据我的测试,在Visual Studio 2017中,使用
作为
操作符的工作方式与预期一致

所以你可以用

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

因此,如果你有一个泛型数组,那么问题似乎就出现了

if (array2D is List<int>[,]) { ... }
if(array2D是List[,]){…}
您将得到编译错误

下面的代码也可以编译

object something = null;
if (something is List<int>) { ... }
objectsomething=null;
如果(某物是列表){…}
因此,唯一有问题的情况是使用泛型类型的数组作为
is
运算符的参数

作为旁注,我通常更喜欢使用
As
运算符而不是
is
运算符,因为通常目标类型中都需要一个变量。

C#7将
is
运算符从纯类型测试扩展到他们所称的类型

解析器现在似乎被
is
后跟泛型数组弄糊涂了。我尝试使用类型周围的paren,但我无法测试此解决方案

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

你能在一个小程序中重现这个错误吗?它不是指定了一行代码吗“语法错误”应该是什么,如果是,那行是什么?@MatthewWatson#编辑as关键字并检查null.var tmp=array2D as Bgra[,];if(tmp!=null)(这里没有VS2017,所以我无法测试)看起来编译器中出现了突破性的变化,可能是一个bug。我可以重现这个问题(在以前的编译器版本中它肯定可以正常工作!)在这种情况下,带模式的Is表达式也不起作用:
if(array2D是Bgra[,]localName)当泛型或数组单独正常工作时,
也不会编译。当使用泛型数组时,带模式的Is表达式也会出现同样的问题…另请参见。
as
运算符工作,但没有理由
Is
不能正常工作。我同意它应该编译,但我怀疑没有单元测试f或者需要(1)数组、(2)泛型和(3)
is
运算符的特定情况。我建议您将代码简化为一个最小的示例,并将问题提交给Microsoft。
object something = null;
if (something is List<int>) { ... }
if (array2D is (Bgra<byte>[,]))