Auf Englisch lesen

Freigeben über


Compilerfehler CS4004

Kann nicht in unsicherem Kontext warten

Beispiel

Im folgenden Beispiel wird der Fehler CS4004 generiert:

using System.Threading.Tasks;

public static class C
{
    public static unsafe async Task<string> ReverseTextAsync(string text)
    {
        return await Task.Run(() =>
        {
            if (string.IsNullOrEmpty(text))
            {
                return text;
            }

            fixed (char* pText = text)
            {
                char* pStart = pText;
                char* pEnd = pText + text.Length - 1;
                for (int i = text.Length / 2; i >= 0; i--)
                {
                    char temp = *pStart;
                    *pStart++ = *pEnd;
                    *pEnd-- = temp;
                }

                return text;
            }
        });
    }
}

Dieser Code generiert einen Fehler in C# 13, da sich await im unsafe-Block befindet.

Die ReverseText-Methode verwendet einfach eine Hintergrundaufgabe, um asynchron eine neue Zeichenfolge in umgekehrter Reihenfolge einer bestimmten Zeichenfolge zu erstellen.

So beheben Sie diesen Fehler

Wenn Sie den nicht verwalteten Code vom erwartbaren Code trennen, wird dieser Fehler behoben. Eine Trennmethode besteht darin, eine neue Methode für den unsicheren Code zu erstellen und dann vom erwarteten Code aufzurufen. Beispiel:

public static class C
{
    public static async Task<string> ReverseTextAsync(string text)
    {
        return await Task.Run(() => ReverseTextUnsafe(text));
    }

    private static unsafe string ReverseTextUnsafe(string text)
    {
        if (string.IsNullOrEmpty(text))
        {
            return text;
        }

        fixed (char* pText = text)
        {
            char* pStart = pText;
            char* pEnd = pText + text.Length - 1;
            for (int i = text.Length / 2; i >= 0; i--)
            {
                char temp = *pStart;
                *pStart++ = *pEnd;
                *pEnd-- = temp;
            }

            return text;
        }
    }
}