1
public static string GetFoo() {

        string source = GameInfoUtil.GetSource(repairRequest, () => {
            return "0"; // this line gives error
        });
        .
        .
        MORE WORK, BUT WANT TO SKIP IT
    }


public static string GetSource(WebRequest request, Action failureCallback) {
        // DOING WORK HERE WITH REQUEST
        if(WORK IS SUCCESSFULL) RETURN CORRECT STRING ELSE CALL ->
        failureCallback();
        return "";
    }

私はこのようなことをしたいのですが、エラーが発生します:

Error   2   Cannot convert lambda expression to delegate type 'System.Action' because some of the return types in the block are not implicitly convertible to the delegate return type.
Error   1   Since 'System.Action' returns void, a return keyword must not be followed by an object expression   C:\Users\Jaanus\Documents\Visual Studio 2012\Projects\Bot\Bot\Utils\GameInfoUtil.cs 58  5   Bot

私がやりたいことは、で何かが起こったときGameInfoUtil.GetSourceにデリゲートを呼び出し、GetFooメソッドが戻って作業を続行しないことです。

4

2 に答える 2

5

Actionデリゲートは void を返す必要があります。文字列を返すことはできません。次のように変更できますFunc<string>

string source = GameInfoUtil.GetSource(repairRequest, () => {
        return "0";
    });

public static string GetSource(WebRequest request, Func<string> failureCallback)
{
    if( <some condition> )
        return failureCallback(); // return the return value of callback
    return "";
}
于 2013-03-16T08:31:43.570 に答える
1

Actionデリゲートは void を返します。文字列「0」を返そうとしています。

その値に変更ActionFunc<string>て返す場合。

public static string GetSource(WebRequest request, Func<string> failureCallback) {
    // DOING WORK HERE WITH REQUEST
    if(!(WORK IS SUCCESSFULL))
    {
        return failureCallback();
    }
    return "";
}

あなたのコードは動作します。

ラムダ内のコードは、外部関数から戻ることはできません。内部的に、ラムダは通常のメソッドに変換されます (言いようのない名前で)。

public static string GetFoo() {
    string source = GameInfoUtil.GetSource(repairRequest, () => {
        return "0"; // this line gives error
    });
}

と同等です

public static string GetFoo() {
    string source = GameInfoUtil.GetSource(repairRequest, XXXYYYZZZ);
}

public static string XXXYYYZZZ()
{
    return "0";
}

return "0"これで、GetFoo から戻れない理由を簡単に理解できます。

于 2013-03-16T08:36:18.767 に答える