为什么C++/CLI编译器很容易与符号混淆?

dev*_*ium 5 c++-cli

这是我的代码:

using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;

namespace Tests {
    ref class MyCollection : public IEnumerable<int> <----HERE!
Run Code Online (Sandbox Code Playgroud)

例如,C#编译器将识别它们IEnumerable<T>在这些命名空间中唯一的来自System::Collections::Generic.为什么C++/CLI编译器不能这样做呢?除非我输入其全名或至少Generic::IEnumerable<int>,否则它将无法识别它并将触发C2872错误:模糊符号.

我在这里错过了什么吗?

use*_*019 6

鉴于你的命名空间,IEnumerable是不明确的

MS在System :: CollectionsSystem :: Collections :: Generic中定义IEnumerable 你希望你的代码使用哪2个?

  • 呃,一个是通用的,另一个不是?不应该很难选择使用哪一个,而且,c#编译器不会被它混淆. (3认同)
  • C#和C++语言不同,因此以不同的方式解析代码 (3认同)
  • 编译器如何预先知道*它应该选择通用版本?它尚未解析`<int>`,即使它确实如此,它首先需要确定`<`是泛型类型的开头,而不是`less than`运算符.它仍然必须正确解析C++,因此它们不能随意改变它解析代码的方式. (2认同)