2

私はC#で次のメソッドを持つクラスを持っていました:

public MyRetType MyMethod(String p1 = null)
 {
    MyMethod(<default values>);
 } 
public MyRetType MyMethod(String p1, String p2, MyClass1 p3, String p4 = null, MyClass2 p5 = null)
 {
    ...
 } 

新しいオプションのパラメーターを追加する必要がありました。下位互換性を維持するために、それぞれ 1 つのパラメーターを持ついくつかのメソッドを追加し、以前のメソッドを書き直して新しいメソッドを呼び出しました。

 public MyRetType MyMethod(String p1 = null, IEnumerable<int> pnew = null)
 {
    MyMethod(<default values>);
 } 
 public MyRetType MyMethod(String p1) 
 {
     return MyMethod(p1, null); 
 }

 public MyRetType Launch(String p1, String p2, MyClass1 p3, IEnumerable<int> pnew , String p4 = null, MyClass2 p5 = null)
 {
    ...
 } 
 public MyRetType MyMethod(String p1, String p2, MyClass1 p3, String p4= null, MyClass2 p5 = null)
 {
     return MyMethod(p1, p2, p3, null, p4, p5);
 }

これは c# で機能するようですが、null だけで MyMethod を呼び出すとあいまいになることは承知しています (最後のリストの最初の 2 つのメソッドのいずれかである可能性があります)。

ただし、Visual Basic から MyMethod を呼び出そうとすると、IntelliSense にリストされません。手動で書くと、「あいまいな呼び出し」というエラーが発生しました。

なぜこれが起こるのですか?

4

1 に答える 1

2

オプションを捨ててオーバーロードに固執する必要があります-オプションのパラメーターを持たないオーバーロードが既にある場合、オプションは少し意味がありません。

public MyRetType MyMethod() 
{
    return MyMethod(null,null);
}

public MyRetType MyMethod(String p1) 
{
    return MyMethod(p1,null);
}

public MyRetType MyMethod(String p1, IEnumerable<int>)
{
    MyMethod(<default values>);
} 
于 2013-02-22T11:58:46.610 に答える