作为一名.Net开发,如果有一天编译器突然告诉你,你必须要为每一个list的构造函数传入参数,不能使用foreach处理数列。你会不会抓狂?


来分享下我踩到的坑

1571120993580

1571121036671

然而c++/cli是.NET兼容语言,语法自然是支持list或者foreach的使用的。所以事实上这里的语法完全没有任何问题,而且是可以通过编译的,就如同下图。

1571121163700

那么是什么造成这些错误提示了呢?

既然语法没有问题,那么原因就可能集中在编译器上了。

那会不会是IDE的设置问题呢?

尝试了多个vs版本以及c++编译器版本,这个错误提示都会出现。

这样一来问题就应该在项目配置上,即我们的.vcxproj上面的设置

最终在找到了ItemDefinitionGroup->ClCompile->ConformanceMode这个设置

1571121596884

这个设置,是指标准C++兼容模式。

我们知道由于历史原因,c++存在多个版本,vc++和ISO的c++存在一定的语法差异。

这个选项就是告诉编译器,只能按照标准c++的语法进行编译,任何vc++特有的c++语法都不能通过。

那么,对于c++/cli来说,是.NET兼容语言,自然和标准c++的语法差异更大了。

所以我们将这一项改为false就能编译通过了。

当然在项目的属性页,也可以通过配置属性->C/C++->语言->符合模式,找到这个选项

1571123394958

不过对于vs创建的C++的CLR项目这个属性默认是false的。

因此,出现这个情况很可能是该项目从vc++项目改动过来导致的

参考链接:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/C++CLI%E5%B1%85%E7%84%B6%E4%B8%8D%E8%83%BD%E5%88%9B%E5%BB%BA%E6%97%A0%E5%8F%82%E6%95%B0list.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系