1

ここで少し問題があります。しかし、この質問はどのメソッドのオーバーロードにも当てはまります。

私は次のようなメソッド宣言をしました:(魔女は要件に正確に一致しませんでした)

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal width As Integer, ByVal height As Integer, ByVal paging As Boolean)

だから私はこれが必要な場合のためにオーバーロードを書くことを心に留めていました:

   Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal width As Unit, ByVal height As Unit, ByVal paging As Boolean)

2つの宣言は同じですが、高さと幅のタイプが異なります。「アクセス可能な「SetGridFormat」がこれらの引数に最も固有であるため、オーバーロードの解決に失敗しました」というエラーが発生しました。

問題は、ビルダーが使用する定義方法と構文を決定できない場合に、vb.netで「デフォルト」の定義方法を許可するかどうかです。

助けるためのタンク。

編集:2つの呼び出しは次のようになります:

SetGridFormat(dg, New Unit(100, UnitType.Percentage), New Unit(100, UnitType.Percentage), True)
SetGridFormat(dg, 100, 100,True)

回答から、何かを指定する必要があります。ほとんどの場合、ほとんどの回答が機能しますが、2つの値をゼロに設定できる(特定のサイズが不要な)問題のあるケースを除外します。

SetGridFormat(dg, Nothing, Nothing, True)

この場合、コンパイラの観点では、両方のメソッド宣言は同じです。

これがおそらく問題の根本的な原因です。そのような場合に何も存在しなければ、私は非常に失望するでしょう。:(

私の質問は、この場合、コンパイラに特定のメソッド呼び出しを使用させる方法はありますか?

4

3 に答える 3

1

デフォルト指定子はないと思いますが、デフォルトを指定する必要はありません。これは、コンパイラーが引数のタイプに基づいて呼び出すデフォルト指定子を決定するためです。

次のことを考慮してください。

Dim dg as DataGrid = Nothing
Dim widthInt as Integer = 0, HeightInt as Integer = 0
Dim pg as Boolean = False
Dim widthUnit as Unit = "Defaultvalue", heightUnit as Unit = "Defaultvalue"

SetGridFormat(dg, widthInt, heightInt, pg) ' Calls your first method
SetGridFormat(dg, widthUnit, heightUnit, pg) ' Calls your second method

本当に必要な場合は、タイプを必要なタイプに変換することで、コンパイラーに特定のメソッドを使用するように強制できます(ただし、オブジェクトを必要なタイプに変換できない場合、これは明らかに失敗します)。

SetGridFormat(dg, CType(AnyObject,Integer), CType(AnyObject,Integer), pg) ' Calls your first method
SetGridFormat(dg, CType(AnyObject,Unit), CType(AnyObject,Unit), pg) ' Calls your first method

したがって、特定のメソッドを呼び出したい場合は、次のようにするNothingことができます。

SetGridFormat(dg, CType(Nothing,Integer), CType(Nothing,Integer), pg) ' Calls your first method
SetGridFormat(dg, CType(Nothing,Unit), CType(Nothing,Unit), pg) ' Calls your first method

しかし、これはそもそも悪い設計のように思えNothingます。引数としてどちらかを呼び出すと同じ効果が得られるため、このインスタンスでどちらを呼び出すかは問題ではないので、実際に新しいオーバーロードを定義する必要があると思います。

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal paging As Boolean)
于 2012-08-09T13:16:48.277 に答える
1

デフォルトを指定する方法は確かにありません。ただし、次の構文を使用して、ナローイング変換を実行できます(質問を正しく読んだ場合)。

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal paging As Boolean)
Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal uWidth As Unit, ByVal uHeight As Unit, ByVal paging As Boolean)

SetGridFormat(dg, iWidth:=50, iHeight:=50, true)
SetGridFormat(dg, uWidth:=50, uHeight:=50, true)

お役に立てば幸いです。

于 2012-08-09T14:04:09.580 に答える
0

いいえ、使用するメソッドはユーザーが定義する必要があり、使用する引数に最も具体的(タイプに近い)になります。
あなたが持っている なら
yourMethod1(var1 as DataType1);
yourMethod1(var1 as DataType2);


DataType1 [extends DataType0];
DataType2 [extends DataType0];

次に、yourMethod1(...)の呼び出しでDataType1またはDataType2(またはそれらを拡張するいくつかのタイプ)引数を使用する必要があります。そうしないと、呼び出しは失敗します。

一方、
DataType1 [extends DataType0];
DataType2 extends DataType1;

次に、yourMethod1(...)DataType2を拡張する型のANY引数を使用してtoを呼び出すと、DataType1型の引数​​を使用してyourMethod1(...)を呼び出す(またはDataType1を直接拡張する-DataType2を介さない)唯一yourMethod1(var1 as DataType2)の実行方法が実行されます。yourMethod1(var1 as DataType1)

于 2012-08-09T13:25:45.490 に答える