VB.net データ型をこれらの引数から推論することはできません。というコンパイルエラーが直せません。

huahi11115 495 評価のポイント
2025-08-13T06:23:35.09+00:00

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;
	}

開発者テクノロジ | .NET | その他
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 12,696 評価のポイント MVP ボランティア モデレーター
    2025-08-13T12:09:14.4+00:00

    大前提として、そもそも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})
    
    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。