Delegado a un método de instancia no puede tener nulo 'este' discord.net [duplicado]
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
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 someObj
sí null
; 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 this
no 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>
, Clause
es un grupo de métodos (muy probablemente bool Clause(T value)
) y filter
resulta ser null
.