Delegado a un método de instancia no puede tener nulo 'este' discord.net [duplicado]

Resuelto traso asked hace 8 meses • 0 respuestas

Estoy desarrollando un programa C# en .NET 8

Tengo un host genérico con un montón de servicios para un robot de discordia. En uno tengo un código como este (código simplificado)

public MessageService(DiscordSocketClient client, ILogger<DiscordClientService> logger)
    : base(client, logger)
{
    client.MessageUpdated += OnMessageUpdated;
}
private Task OnMessageUpdated(Cacheable<IMessage, ulong> oldMessage, SocketMessage newMessage, ISocketMessageChannel channel)
{
    Task.Run(async () =>
    {
        if (newMessage is not SocketUserMessage message) return;
        var context = new SocketCommandContext(Client, message);

        if (context.Channel.Id == _botOptions.ChannelId)
            await CheckChannelAsync(context);  // <--- Error here
    }
    return Task.CompletedTask;
}
private async Task<bool> CheckChannelAsync(SocketCommandContext context)
{
    if (context.Message.Attachments.Count == 0)
    {
        string[] allowedSites = File.ReadAllLines(Utilities.GetLocalFilePath("AllowedSites.txt"));
        if (!Array.Exists(allowedSites, context.Message.Content.Contains))
        {
            string errorMessage = $"Your message doesn't contain any allowed website";
            await MessageDeleterHandlerAsync(context, errorMessage);
            return false;
        }
    }
    else
    {
        var attachment = context.Message.Attachments.First();
        if (attachment.Width < 40 || attachment.Height < 40)
        {
            string errorMessage = $"The picture is too small!!";
            await MessageDeleterHandlerAsync(context, errorMessage);
            return false;
        }
    }
    return true;

}

A veces recibo una ráfaga del mismo error que se activa varias veces por minuto y luego desaparece durante algunos días.

System.ArgumentException: el delegado a un método de instancia no puede tener "esto" nulo.

   at System.MulticastDelegate.ThrowNullThisInDelegateToInstance()
   at MyBot.Services.MessageService.CheckChannelAsync(SocketCommandContext context)
   at MyBot.Services.MessageService.<>c__DisplayClass15_0.<<OnMessageUpdated>b__0>d.MoveNext() in /my/bot/Services/MessageService.cs:line 101

No sé qué significa el mensaje de error. Hasta donde yo sé, no estoy usando delegados, así que no sé qué verificar para averiguarlo.

Intenté iniciar sesión si el contexto es nulo pero, como era de esperar, no lo es, ya que lo elimino bien antes de que ocurra el error.

Esto está usando Discord.NET

EDITAR: se agregó la lógica para CheckChannelAsync, además no estoy creando un delegado de la misma manera que la pregunta duplicada para que uno no responda mi pregunta

traso avatar Feb 16 '24 22:02 traso
Aceptado

Este problema ocurre cuando se crea un delegado directamente desde un grupo de métodos, es decir

Action action = someObj.SomeMethod; // note not invoked

y resulta que someObjnull; Esto no es un NullReferenceException, pero es básicamente comparable. Entonces: busque una conversión de grupo de métodos (a un delegado), que podría ser una suscripción a un evento, y verifique que el objeto de destino no sea null.

No puedo ver ninguno de estos en su código; el único candidato es:

client.MessageUpdated += OnMessageUpdated;

que es implícitamente

client.MessageUpdated += this.OnMessageUpdated;

pero podemos estar razonablemente seguros de que thisno es así null; Supongo que la verdadera causa está en el código que no se muestra. Tenga en cuenta que la causa podría estar oculta en elementos como LINQ, por ejemplo:

.Where(filter.Clause)

si esto es IEnumerable<T>, Clausees un grupo de métodos (muy probablemente bool Clause(T value)) y filterresulta ser null.

Marc Gravell avatar Feb 16 '2024 16:02 Marc Gravell