4

TaskBar名前空間内で定義されたメソッドを使用していますMicrosoft.WindowsAPICodePack.TaskbarSetProgressState具体的には、この質問に焦点を当てます。

の定義を尋ねたときに得られるメタ定義は次のSetProgressStateとおりです。

namespace Microsoft.WindowsAPICodePack.Taskbar
{
    public class TaskbarManager
    {
        public void SetProgressState(TaskbarProgressBarState state);
        public void SetProgressState(TaskbarProgressBarState state, IntPtr windowHandle);
        public void SetProgressState(TaskbarProgressBarState state, System.Windows.Window window);
    }
}

明らかに、1 つのメソッドのオーバーロードを強調するためだけに、そのクラスの定義のほとんどを省略しました。

この時点まで、単一パラメーターのオーバーロードを使用してきましたが、問題はありませんでした。ただし、今日、2 番目のパラメーターとして an を受け入れる 2 パラメーターのオーバーロードを使用しようとしましたIntPtr

私がそれをしたとき、ビルド中にこのエラーが発生し始めました:

タイプ 'System.Windows.Window' は、参照されていないアセンブリで定義されています。アセンブリ 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' への参照を追加する必要があります

だから私の質問は、単一パラメーターのオーバーロードを使用してもエラーが発生しなかったのはなぜですか?

編集(追加のサブ質問用):

次のことも試しましたが、違いはありませんでした。

SetProgressState(myState, (IntPtr) myWindowHandle);

明示的にキャストすることで、適切なオーバーロードを実現する際のコンパイラの混乱を回避できると考えましたが、そうではありませんでした。

4

2 に答える 2

2

Overload Resolution に関する MSDN ページによると、コンパイラは潜在的な候補を選択することから始めます。

これらの各コンテキストは、候補関数メンバーのセットと引数のリストを独自の方法で定義します

次に、最適なターゲットが選択されます。

セットに関数メンバーが 1 つしか含まれていない場合、その関数メンバーが最適な関数メンバーです。

ここでの私の理解は、コンパイラは、1 つの引数で呼び出したときに 2 つの引数メソッドを考慮さえしないということです。ただし、引数が 2 つのバージョンを使用する場合は、引数の型に関する情報が必要です。この場合、System.Windows.Windowどのオーバーロードを呼び出すかを決定できるようにするためには、何が必要かを知る必要があります。

別々のクラス ライブラリに 2 つのクラスがあるとします。

class Foo
{

}

class Bar : Foo
{

}

および他のライブラリの 4 つのメソッド

static void Do()
{

}

static void Do(Foo foo)
{

}

static void Do(Bar bar)
{

}

static Foo Get()
{
    return new Bar();
}

メソッド ライブラリと を含むライブラリを参照しますが、 を含むライブラリは参照しFooませんBar

次に、アプリケーションでFooメソッド ライブラリから型のオブジェクトを取得します (それも可能性がありBarますが、わかりません)。コンパイラは、Do()引数付きの最終的な呼び出しをどのように解決することになっていますか?

Bar の型情報も持っていないとできません。


サブ質問に関しては、上記に加えて、キャストが必ずしもオーバーロードの選択を強制するわけではないという事実の結果です。System.Windows.Windowから派生したと想像してみましょうIntPtr。引数をキャストしてIntPtrも、コンパイラがオーバーロードを解決するのにはまったく役立ちません (上記の例を参照)。

型情報が存在しないため、コンパイラは確実に知ることができないため、エラーを出力します。正直なところ、コンパイラにとってはそれが機能です。

于 2013-06-26T14:15:00.007 に答える