System::Array::Resizeはジェネリック関数です。
public:
generic <typename T>
static void Resize(cli::array <T> ^ % array, int newSize);
ジェネリック型が省略された場合、型推論できれば省略可能ですが、推論できなければコンパイルは通りません。
System::Array^からSystem::Array<T>をコンパイル時に推測することは不可能なので、当然エラーになります。
無理やりでもやりたいなら、実行時に型をリフレクションで解析してやる必要があります。
#include "pch.h"
#include <iostream>
using namespace System;
public ref class TestClass {
public:
void test1(System::Array^% a1) {
//Array::Resize(a1, 4); //第1引数の型推論ができないのでコンパイルが通らない
//リフレクションでarrayの元の型を取得して
//その型のジェネリック関数を取得する
System::Type^ t = a1->GetType();
System::Type^ tArray = System::Array::typeid;
System::Type^ tElement = t->GetElementType();
System::Reflection::MethodInfo^ miResizeT = tArray->GetMethod(L"Resize")->MakeGenericMethod(tElement);
// ジェネリック関数をリフレクションから実行
array<System::Object^>^ param = { a1 , 1 };
miResizeT->Invoke(NULL, param); //static関数なので第一引数はナシ
a1 = dynamic_cast<System::Array^>(param[0]); //参照が変更されているの戻す
}
generic <class T>
void test2(array<T>^% a)
{
Array::Resize<T>(a, 2);
}
void test3(array<float>^% a1) {
Array::Resize(a1, 3); //ジェネリック型が型推論で省略できているだけ
Array::Resize<float>(a1, 3); //本来のジェネリック関数の呼び出し
}
};
int main(array<System::String^>^ args)
{
TestClass^ c1 = gcnew TestClass();
auto af = gcnew array<float, 1>(10);
System::Array^ a = af;
c1->test1(a); Console::Out->WriteLine(a->Length);
c1->test2(af); Console::Out->WriteLine(af->Length);
c1->test3(af); Console::Out->WriteLine(af->Length);
}