internal ParamOutputChainer(Chainer prev)
            : base(prev)
        {
            ParamChainer paramObj = prev.GetPrev <ParamChainer>();

            paramObj.Param.IsOutput = true;
        }
        internal ParamOptionalChainer(Chainer prev, ParameterArgument defaultArgument)
            : base(prev)
        {
            if (defaultArgument.IsNullReference())
            {
                defaultArgument = Designer.Null;
            }

            TryTakeException(defaultArgument.Exception);
            TryThrow();

            ParamChainer paramObj = prev.GetPrev <ParamChainer>();

            paramObj.Param.IsOptional = true;
            paramObj.Param.Default    = defaultArgument;

            if (defaultArgument.CheckType(paramObj.Param, defaultArgument.Value, out chainException))
            {
                paramObj.Param.Default.BuildArgument(GetRoot(), paramObj.Param.Name);
                TryThrow(paramObj.Param.Default.Exception);
            }
            else
            {
                chainException.Extra = "Argument is a default value of the parameter.";
                TryThrow();
            }
        }
        internal ParamNotNullChainer(Chainer prev)
            : base(prev)
        {
            ParamChainer paramObj = prev.GetPrev <ParamChainer>();

            paramObj.Param.IsNullable = false;

            if (paramObj.Param.Default != null && paramObj.Param.Default.Value == null)
            {
                var paramName = paramObj.Param.Name;
                Throw(QueryTalkExceptionType.OptionalParamDefaultArgumentNull,
                      ArgVal(() => paramName, paramName),
                      Text.Method.ParamOptional);
            }
        }