Possible issues and best practices for this piece of code public class NANDFunction : FunctionInfo
{
    public override string Name { get { return "NAND"; } }
    public override int MinArgs { get { return 2; } }
    public override int MaxArgs { get { return 2; } }

    public override object Evaluate(object[] args)
    {
        bool arg0 = CalcConvert.ToBool(args[0]);
        bool arg1 = CalcConvert.ToBool(args[1]);
        return ((arg0 != arg1) || (!arg0 &amp;&amp; !arg1));
    }
}


What do you think of this code?
You may want to add some additional validation around how many arguments you're expecting (since you know via MinArgs and MaxArgs). You can also eliminate having to create an object array explicitly in the caller by using the params keyword (make sure you do it in the declaration in FunctionInfo as well). Lastly, if this class is intended to be non-inheritable (unlike FunctionInfo), mark it as sealed:

public sealed class NANDFunction : FunctionInfo
{
    public override string Name { get { return "NAND"; } }
    public override int MinArgs { get { return 2; } }
    public override int MaxArgs { get { return 2; } }

    public override object Evaluate(params object[] args)
    {
        if ((args.Length &lt; this.MinArgs) || (args.Length &gt; this.MaxArgs))
        {
            throw new ArgumentException("An insufficient number of arguments were passed.");
        }

        bool arg0 = CalcConvert.ToBool(args[0]);
        bool arg1 = CalcConvert.ToBool(args[1]);
        return (arg0 != arg1) || (!arg0 &amp;&amp; !arg1);
    }   
}