2

このエラーを回避するために何をする必要があるかを誰かが説明できますか?

「デリゲート型ではないため、匿名メソッドを 'System.Windows.Threading.DispatcherPriority' 型に変換できません」

    private void Test(object sender)
    {
        base.Dispatcher.BeginInvoke(delegate
        {
                       //some code

        }, new object[0]);
    }

ありがとう

4

3 に答える 3

2

.NET 3.5 SP1 以降を使用している場合は、System.Windows.Presentation.dllusing System.Windows.Threading;への参照を追加して、ファイルの先頭にあることを確認してください。より使いやすく、次のように簡単に記述できる拡張メソッドが含まれています。

base.Dispatcher.BeginInvoke(() => { /* some code */ });

SP1 以前の .NET 3.5 を使用している場合は、デリゲートを具体的なデリゲート型にキャストする必要があります。

base.Dispatcher.BeginInvoke((Action) delegate { /* some code */ }, new object[0]);
于 2012-10-15T14:51:41.497 に答える
0

更新された回答

デリゲートをAction(Func<something>値を返す場合は) にキャストします。

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke((Action)delegate
    {
        //some code
    }, new object[0]);
}

Dispatcher.BeginInvokeメソッドの最初のパラメーターにはSystem.Delegate. これは珍しいことです。通常、FuncまたはActionオーバーロードのいずれかを指定します。ただし、ここでは、異なる署名を持つデリゲートを渡すことができます。明らかに、匿名デリゲートはSystem.Delegate暗黙的にキャストされません。


アップデート

私は.NET 3.5で作業しています。それ以降のフレームワーク バージョンでは、追加のオーバーロードがBeginInvokeC# のオーバーロード メカニズムを妨害する可能性があります。試す

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke((System.Delegate)(Action)delegate
    {
        //some code
    }, new object[0]);
}
于 2012-10-15T14:55:27.893 に答える
0

EDIT「パラメータ」として
渡すことに混乱し、デリゲートに続くものはすべてコレクションにあるため、これが実際には「パラメータなし」を意味することに気づきませんでした...new object[0]BeginInvokeparams

単一の整数を期待する例を作成しています。

パラメータを渡したいので、これを使うのがベスト

private void Test(object sender)
{
    base.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action<int>)delegate(int i)
    {
                   //some code

    }, 5);
}

これにより、整数を受け取る匿名のデリゲートが作成され、これが整数を受け取るアクションに変換され、パラメーターを使用してデリゲートが呼び出されます5

于 2012-10-15T14:42:30.657 に答える