6

私はジョン・スキートの彼の本の早期アクセス版を読み始めました。これにはC#4.0のセクションが含まれていますが、私は1つのことに気づきました。残念ながら、私はVisual Studio 2010を利用できないので、代わりにここで質問して、誰かが答えを知っているかどうかを確認したいと思いました。

次のコード、既存のコードと新しいコードの混合物がある場合:

public void SomeMethod(Int32 x, Int32 y) { ... }

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }

コンパイラは、定義サイトまたは呼び出しサイトのいずれかで、あいまいさの可能性について不平を言いますか?

たとえば、このコードは実際に何をしますか?

SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);

コンパイルされますか?zパラメータのないものを呼び出すのでしょうか、それともzパラメータのあるものを呼び出すのでしょうか。

4

2 に答える 2

9

これについては、この章の「過負荷の解決」セクションで説明します。

コンパイラが 2 つの同等のオプションから選択できる場合、提供されていないオプションのパラメーターを使用する必要のないオーバーロードを優先して使用しますが、これは厳密なバイナリ選択です。提供されていないオプションのパラメーターが 1 つあるオーバーロードと 2 つのオーバーロードのどちらかを選択する必要がある場合、それはあいまいな状況であると見なされます。

フォローアップのコメントに答えるために、オプションのパラメーターを指定せずにオーバーロードを強制的に使用する方法がわかりません。たとえば、次のいずれも使用できません。

// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)

ただし、メソッドが異なるパラメーター名を使用している場合は、次のようにすることができます。

public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }

sc.SomeMethod(a: 15, b: 23); // Calls second method
于 2009-07-31T08:02:07.797 に答える
6

警告なしでコンパイルされ、最初のオーバーロードが選択されます。

オプションの名前付きパラメーターの導入により、C# のオーバーロード解決メカニズムは非常に複雑になりました。ただし、この特定のケースでは、それは理にかなっています。通常どおり、コンパイラは引数に一致する最も具体的なオーバーロードを選択します。

この特定のケースが C# 1.0 と大きく異なるとは思いません。

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

これは同じように機能します (オーバーロードの解決に関して)。

フォローアップの回答:そうは思いません。メソッド呼び出しでデフォルトの引数を手動で指定する必要があると思います。ただし、xまたはyパラメーターに次のような別の名前がある場合:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

次のように 2 番目のオーバーロードを選択できます。

obj.SomeMethod(t: 10, y: 20);
于 2009-07-31T07:56:35.217 に答える