問題タブ [overload-resolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1295 参照

c# - 型制約がメソッド シグネチャの一部ではないのはなぜですか?

更新: C# 7.3 以降、これは問題ではなくなりました。リリースノートから:

メソッド グループに、型引数が制約を満たさないジェネリック メソッドが含まれている場合、これらのメンバーは候補セットから削除されます。

C# 7.3 以前:

だから私はEric Lippert の 'Constraints are not part of the signature'を読み、オーバーロードの解決後に型制約がチェックされることを仕様が指定していることを理解しましたが、なぜこれがそうでなければならないのかについてはまだ明確ではありません。以下はエリックの例です。

オーバーロードの解決 for: が最適なオーバーロード マッチであると推測するため、これはコンパイルされませんFoo(new Giraffe())Foo<Giraffe>、型制約が失敗し、コンパイル時エラーがスローされます。エリックの言葉で:

ここでの原則は、オーバーロードの解決 (およびメソッドの型の推論) であり、引数のリストと各候補メソッドの仮パラメーターのリストとの間で可能な限り一致するものを見つけます。つまり、候補メソッドのシグネチャを調べます。

型制約は署名の一部ではありませんが、なぜできないのでしょうか? 型制約を署名の一部と見なすのが悪い考えであるシナリオには、どのようなものがありますか? 実装が難しい、または不可能ですか?最適なオーバーロードが何らかの理由で呼び出すことができない場合は、2 番目に最適なオーバーロードに静かにフォールバックすることを推奨しているわけではありません。私はそれを嫌います。最適なオーバーロードの選択に影響を与えるために型制約を使用できない理由を理解しようとしています。

私は、C# コンパイラの内部で、オーバーロードの解決のみを目的として (メソッドを完全に書き換えるわけではありません)、次のことを想像しています。

次のように変換されます:

型制約を仮パラメータ リストに「引き込む」ことができないのはなぜですか? これはどのように署名を悪い方法で変更しますか? 署名を強化するだけのような気がします。次にFoo<Reptile>、過負荷候補と見なされることはありません。

編集 2:私の質問がとても混乱していたのも不思議ではありません。私は Eric のブログを正しく読んでおらず、間違った例を引用しました。より適切だと思う例を編集しました。また、タイトルをより具体的なものに変更しました。この質問は、最初に想像したほど単純ではないように思えます。おそらく、いくつかの重要な概念が欠けています。これがスタックオーバーフローの資料であるかどうかはわかりません。この質問/ディスカッションを他の場所に移動するのが最善かもしれません.

0 投票する
3 に答える
628 参照

c# - C#での過負荷解決

特定のケースでC#の過負荷解決の問題が発生しています。私のRazorファイルには、次のものがあります。

クラス構造:

渡される実際のインスタンスはPhotoのものです。

SearchResult(IEntity)呼び出される必要があるすべてのインスタンスに対して呼び出されますSearchResult(IPhoto)(または、IEntity派生物が何であれインスタンスの最も具体的なオーバーロード)。これに頼ることなく、どうすれば自分がやろうとしていることを実行できますか?

0 投票する
3 に答える
427 参照

c# - C# でのメソッド オーバーロードの解決とジェネリック/反変インターフェイス

私の問題は、私のクラス/インターフェース階層のコードスニペットで最もよく説明されていると思います:

質問 1: 2 番目のケースのように に解決され、s1.Transform(v)解決されITransform<ISelection>ないのはなぜですか?ITransform<IValue>

質問 2:ITransform質問 1 では、 が であるかである<D>かに違いはないようです<in D><in D>しかし、私のクラス/インターフェース階層での使用に他に問題はありますか? どちらのISelector実装ITransform<IValue>ITransform<ISelection>. IValue継承するため、ここで反変性が問題を引き起こす可能性がありますISelectionか?

EDIT お知らせ: 現在、Silverlight 4 を使用していますが、これは一般的な C# の動作だと思います。

0 投票する
2 に答える
211 参照

c++ - 自動型推論を禁止する

次のデモコードがあります。

これは私の実際のコードの煮詰めたバージョンなので、役に立たないように見えますが、問題を示すには十分なはずです:

したがって、自動型推論 (テンプレート パラメーター U の場合) が、テンプレート関数の正しいバージョン (パラメーターが 2 つしかないバージョン) を選択するという私の興味を妨げることは明らかです。

少し異なることを行う基本的なテンプレートと特殊なテンプレートを両方のバージョンに用意する必要があります。

質問は次のとおりです。この時点で型を自動的に推論しないようにコンパイラに指示する可能性はありますか (たとえば、パラメータが 2 つしかないテンプレートを使用するなど)。

0 投票する
3 に答える
491 参照

c# - Funcデリゲートオーバーロードを使用したメソッドのラムダを解決するVisualStudioのバグ?

さまざまなFuncデリゲートのオーバーロードがある関数で匿名メソッドを使用すると、VisualStudio2010で奇妙な動作に遭遇しました。

以下に小さな複製クラスを作成しました。

このListViewAdapterクラスを検討してください

そして、ラムダでオーバーロードを使用する次のコード:

解決する必要がFunc<RefType1, string, string>あり、最初の引数はである必要がありますが、問題は、 Visual StudioRefType1である代わりに、それを。と見なすということです。itemRefType1int

質問:Funcデリゲート間には明らかではない有効な変換がありますか、それともこれはVisual Studio IntelliSenseのバグですか?

0 投票する
1 に答える
734 参照

c# - 型引数の置換後に2つのメソッドが同一のシグニチャーを持つ場合、誤ったオーバーロードがオーバーライドされます

この例はC#コンパイラのバグを示していると思います(間違っている場合は私をからかってください)。このバグはよく知られているかもしれません。結局のところ、この例は、このブログ投稿で説明されている内容を単純に変更したものです。

アイデアはBase<T, S>、2つの仮想メソッドを使用してクラスを作成することです。このクラスのシグネチャは、との「悪意のある」選択の後に同一にTなりSます。クラスConflictは仮想メソッドの1つだけをオーバーロードします。が存在するため、どのメソッドIntermediate<,>を明確に定義する必要があります。

しかし、プログラムを実行すると、出力は間違った過負荷がオーバーライドされたことを示しているようです。

Sam Ngのフォローアップ投稿を読むと、タイプロード例外が常にスローされると彼らが信じていたため、そのバグは修正されなかったという表現が得られました。しかし、この例では、コードはコンパイルされ、エラーなしで実行されます(予期しない出力のみ)。


2020年の追加:これは、C#コンパイラの新しいバージョン(Roslyn?)で修正されました。この質問をしたときの出力は次のとおりです。

2020年の時点で、次の出力tio.runが得られます。

0 投票する
2 に答える
186 参照

c# - c#オーバーロード解決ルール

次の拡張メソッドを想定します。

今、私はこれをIEnumerable<T>インターフェイスの実装を介して呼び出します。

この場合、どちらが呼び出されますか。また、その理由は何ですか。

0 投票する
2 に答える
160 参照

c++ - 関数が同じ名前の場合にコンストラクターを呼び出す方法

私が以下を持っている場合:

名前を変更できる可能性があるため、問題はありませんが、コンストラクターを強制的に呼び出す方法に興味があり、関数呼び出しがコンストラクターよりも優先される理由を自問しています。さらに、名前の重複に関する警告メッセージが表示されないのはなぜですか。

0 投票する
2 に答える
296 参照

c++ - std::ostringstream演算子のオーバーロード検索順序?

私は次のクラスを持っています:

私がこれを行うとき:

最初の"Hello "文字列は として扱われますvoid*。コードをデバッグすると、文字列ではなくポインター値として"Hello "渡されて出力されます。std::basic_ostream::operator<< (void const*)2 番目の文字列"World"は、グローバルなオーバーロードされた << 演算子に適切に渡されますchar const*

<< 演算子の両方の使用法が同じオーバーロードに解決されることを期待していますが、これは起こりません。誰かが説明して、おそらく修正を提案できますか?

前もって感謝します。

アップデート

私は C++03 に行き詰まっていることを言い忘れましたが、一部の人が C++03 と C++11 の両方のケースをカバーしてくれたことをうれしく思います。

0 投票する
4 に答える
2678 参照

c++ - あいまいなstring::operator=intおよびstringへの暗黙的な変換を伴う型の呼び出し

次のプログラムがあるとします。

Visual Studio 11でコンパイルされますが、clangやgccではコンパイルされません。暗黙的にaからaGenericTypeに変換したいので問題が発生しますが、aを返す可能性もあるため、あいまいさがあります(両方が一致します)。intcharstringoperator=(char)operator=(string)GenericType

ただし、コピーコンストラクターは問題ありません。

私の質問は、mainの内容を変更せずに、このあいまいさを解決するにはどうすればよいですか?GenericTypeこの状況を処理するために変更するには何をする必要がありますか?