有人可以解释为什么以下代码无法编译(格式奇怪,以便更容易看到问题):
ListView ^ listview = gcnew ListView();
listview->Items->AddRange( gcnew array<ListViewItem^> {
gcnew ListViewItem( gcnew array<String^> { L"red", L"fish" } ),
gcnew ListViewItem( gcnew array<String^> { L"green", L"eggs" } )
});
这给出了
的编译错误错误C2440:'初始化':无法从'const wchar_t [4]'转换为'System :: Windows :: Forms :: ListViewItem ^'
如果代码分为两行,如下所示,那么一切都很好:
ListView^ listview = gcnew ListView();
ListViewItem^ lvi1 = gcnew ListViewItem( gcnew array<String^> { L"red", L"fish" } );
ListViewItem^ lvi2 = gcnew ListViewItem( gcnew array<String^> { L"green", L"eggs" } );
listview->Items->AddRange( gcnew array<ListViewItem^> {
lvi1,
lvi2
});
忽略为什么有人想制作一个整体的单行来填充ListView,为什么编译器在原始代码中设置ListViewItems有困难,以及如何编写这样的单行程序?
答案 0 :(得分:4)
这就像编译器解析器bug一样嘎嘎作响。如果将字符串数组初始值设定为空,则会更有趣。然后,您将在“输出”窗口中获得此描述:
1>c:\projects\cpptemp26\Form1.h(77) : error C2552: '$S4' : non-aggregates cannot be initialized with initializer list
1> 'System::Windows::Forms::ListViewItem ^' is not an array or class : Types which are not array or class types are not aggregate
1>c:\projects\cpptemp26\Form1.h(78) : error C2440: 'initializing' : cannot convert from 'const wchar_t [6]' to 'System::Windows::Forms::ListViewItem ^'
1> Reason: cannot convert from 'const wchar_t *' to 'System::Windows::Forms::ListViewItem ^'
1> No user-defined-conversion operator available, or
1> Cannot convert an unmanaged type to a managed type
请注意消息“ListViemItem ^不是数组或类”。这强烈建议编译器将初始化器应用于ListViewItem而不是字符串数组,这是无意义的。它从那里开始崩溃。
如果有的话,这不会很快得到修复。你知道这个简单的解决方法。您可以发布到connect.microsoft.com获取第二个意见。