人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

なぜC#の省略可能引数は、オーバーロードのシンタックスシュガーではないのでしょうか?

C#の省略可能引数はビルド時に呼び出し側に値が埋め込まれるだけなので、この記事の「省略可能引数を追加する」のような問題が起きます。
http://qiita.com/chocolamint/items/f04665ce2db211abb2d2

なぜC#の省略可能引数は、内部的にオーバーロード関数を自動生成するのではなく、呼び出し側に値が埋め込むといった実現方法になっているのでしょうか。

●質問者: ku__ra__ge
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● degucho
●100ポイント ベストアンサー

バイナリレベルで互換性を保つためではないでしょうか
関数が別DLLの場合など。


ku__ra__geさんのコメント
すみません。私の理解力が足りておらず、オーバーロード関数を自動生成する場合はバイナリレベルで互換性が保てず、省略可能引数では互換性が保てるケースが思いつかないのですが、オーバーロード関数を自動生成した場合に具体的にどういったケースで互換性が保てなくなるでしょうか?

deguchoさんのコメント
オーバーロード関数を生成したところで保てない、といった書き方のほうが正しいでしょうか。 同一アセンブリ内であればオプション引数部分を定数可したオーバーロード関数本体をコンパイル時に複製することは可能かと思いますが 別DLLの場合はそれができません。 void overloaded(string s, int i) } SomeClass.DoSomething(s, i, false); } のような単純な呼び出しスタブを作るだけなら同じ問題がおきますし。 (JITコンパイル時にオーバーロード関数を作成するなら可能かもしれませんが) ※オーバーロード関数自動生成は以下を想定しています int func (int a, int b, int c = 1) { return a + b + c; } 自動生成 int func (int a, int b) { int c = 1 return a + b + c; }

ku__ra__geさんのコメント
重ね重ねすみません。 >別DLLの場合はそれができません。 という部分がよくわかりませんでした。 内部的にオーバーロード関数を自動生成する場合、引数が省略可能な関数と自動生成された関数は必ず同一アセンブリになるのではないでしょうか? 最初から書いておくべきでしたが、質問補足で想定している関数自動生成を追記しました。

deguchoさんのコメント
定義側コンパイル時にすべてのオーバーロードを定義しておけという話だったのですね。 ちょっと意図がずれておりましたすみません。 元々下記リンクの最後にあるようにCOM相互運用のニーズで実装されたようなものなので http://ufcpp.net/study/csharp/sp4_optional.html 例にあるOpenメソッドはオプション引数が14個もあるので https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.workbooks.open%28VS.80%29.aspx 名前付き引数を使用することを考えると提示された方法では 2の14乗で16384個もオーバーロード関数を作らなければいけないので現実的ではないからではないでしょうか (実装の関してはフォーラム等で議論されていると思うのですがちょっと見つけられませんでした)

deguchoさんのコメント
あと既存のVB.NETで作成されたDLL(=DefaultValueAttributeが付いた関数) をビルドし直さずにそのまま使うという理由もあるかと思われます。

ku__ra__geさんのコメント
こちらこそ説明が不足しておりました。 ありがとうございます。

質問者から

以下のような関数自動生成を想定しています。

// 記述コード
class OptionalArgument {
int func (int a, int b, int c = 1) { return a + b + c; }
}

// 自動生成結果
class OptionalArgument {
int func (int a, int b, int c) { return a + b + c; }
int func (int a, int b) { func(a, b, 1); }
}


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ