私の質問は半分文体的で、半分機能的です。ライブラリを書き直して、できるだけコンパクトにしようとしています。(パスを取り、値を ByRef 変数に読み込みます。) 以前は、次のようでした。
Public Sub Read(ByVal name As String, ByRef values(,) As Integer)
Public Sub Read(ByVal name As String, ByRef values(,,) As Long)
などなど・・・スカラ版も含めて30個くらいありました。更新するナイトメア。
すべてのメソッドは、タイプとランクによってオーバーロードされました。このシステムをジェネリックでやり直していますが、問題が発生しています。次のメソッドはコンパイルされません。
Public Sub Read(Of T)(ByVal name as String, ByRef values As T)
Public Sub Read(Of T)(ByVal name as String, ByRef values As T())
Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,))
Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,,))
コンパイルできない理由は明らかです。型 'T' は簡単に配列と見なすことができ、コンパイラは最初のオーバーロードと 2 番目のオーバーロードのどちらを選択するかわかりません。(注: このシステムは、オーバーロードされた Read メソッドのスカラー バージョンがない場合、期待どおりに機能します。)
だから、私は難問が残っています。これらのオーバーロードを設計する最善の方法がわからないので、このライブラリを使用する既存のコードとの下位互換性をできるだけ維持しながら、最小限のコードを使用します。(厳密に社内で使用しているため、ライブラリを使用して任意のコードを変更できましたが、署名は可能な限り同じに保ちたいと考えています。)
基本的に、私が示したようにオーバーロードを設計する方法はありますか? 最上位のオーバーロードをスカラー入力のみに使用することをコンパイラーに明示的に伝えることはできますか? そうでない場合、どのデザインが最適ですか? 私はどんな創造的なアイデアにもオープンです。
ありがとう