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