開発者テクノロジ | .NET | その他
.NETソフトウェアフレームワークに基づくMicrosoftテクノロジー
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
VB.net データ型をこれらの引数から推論することはできません。というコンパイルエラーが直せません。
Dim arr1 As Integer() = {-2, 90}
Dim arr2 As Single() = {68.31F, 1.0F}
Dim result0 As Integer = TestClass.mth1({arr1, arr2})'(1)
(1)の行でコンパイルエラーが出ます。
メソッド 'Public Shared Overloads Function mth1(Of T)(arr As T()()) As Integer' 内の型パラメーターのデータ型をこれらの引数から推論することはできません。データ型を明示的に指定することによって、このエラーを修正できる場合があります。
この解決方法が分かりません。
VB.netでコンパイルエラーを出さない書き方を教えて下さい。
// C++/CLIでのコード (コンパイルは通る)
generic <class T>
static int mth1(array<array<T>^>^ arr) {
for each(Array ^ var in arr) {//Arrayは意味があって使っている
auto t1 = var->Length;
t1 = t1;
}
return 0;
}
大前提として、そもそもintegerとsingleとは異なる型であり、当然integer型の配列とsingle型の配列も異なる型なのだから1つのジェネリック型で表すには基底であるobjectやValueTypeやIFormattableなどに揃えないと成立しません。
Dim result0 As Integer = TestClass(Of Object).mth1(New Object()() {arr1.OfType(Of Object).ToArray(), arr2.OfType(Of Object).ToArray()}) '(1)
Dim result0VT As Integer = TestClass(Of ValueType).mth1(New ValueType()() {arr1.OfType(Of ValueType).ToArray(), arr2.OfType(Of ValueType).ToArray()}) '(1)
Dim result0IFT As Integer = TestClass(Of Object).mth1(New IFormattable()() {arr1.OfType(Of IFormattable).ToArray(), arr2.OfType(Of IFormattable).ToArray()}) '(1)
そんな面倒するぐらいなら、最初からジェネリックなしのインターフェースで受けたほうがマシですよ?
public ref class TestClassCPP {
public:
static int mth1(System::Collections::Generic::IList<System::Collections::IList^>^ arr) {
for each (System::Collections::IList^ var in arr) {
auto t1 = var->Count;
t1 = t1;
}
return 3;
}
static int mth2(System::Collections::Generic::IList<Array^>^ arr) {
for each (Array^ var in arr) {
auto t1 = var->Length;
t1 = t1;
}
return 4;
}
};
そうすればVB側はジェネリックを何も推定する必要がなくインターフェスだけ見ればすむので
Dim result1 As Integer = TestClassCPP.mth1({arr1, arr2})
Dim result2 As Integer = TestClassCPP.mth2({arr1, arr2})