No, they mustn't. The problem you are facing is related to LINQ expression serialization. Let me explain.
Your _nickname is a field, so the compiler embeds its value as
. What happens here is that the expression includes the instance of your class, which is not what you wanted in the
To overcome this, copy the field to a local variable, e.g.:
var nickname = _nickname;
chatProxy.Filtered += eventHandler.AddFilter((f, args) => args.Nickname == nickname);
And now it works. Explanation is actually simple: now the expression contains a compiler-generated closure class instance with a local copy of your
field. LINQ expression now contains Expression.Constant(closure).Field("local_nickname"), and that is serializable.