Этот код, вероятно, был написан программистом C ++, который использовал общий язык C ++ для написания C ++ / CLI. Это совершенно неправильно, передача ссылки на дескриптор отслеживания возможна, только если дескриптор хранится в стеке. Он не может работать, если переданная ссылка List <> хранится в поле объекта в куче, сборщик мусора может переместить его и сделать указатель недействительным. Компилятор поймает его и выдаст ошибку. ^ Уже является ссылкой, дополнительная ссылка не требуется.
Без ссылки ключевое слово const также не имеет большого смысла. Не то, чтобы это когда-либо было раньше, CLR не может обеспечить его соблюдение. Не то чтобы это имело здесь большое значение, этот код нельзя было вызвать из любого другого языка .NET. Они не будут генерировать указатель на дескриптор отслеживания.
Просто исправьте это, бессмысленно хранить плохой код вроде этого:
void foo(IList<int>^ list ) { ... }
Пример кода, который показывает, что ссылка не может работать:
using namespace System;
using namespace System::Collections::Generic;
ref class Test {
public:
IList<int>^ lst;
void foo(IList<int> const &list) {}
void wontcompile() {
foo(lst); // C3699
IList<int>^ okay;
foo(okay);
}
};