/** <summary>
         *  Return a list of all template names missing from group that are defined
         *  in this interface.  Return null if all is well.
         *  </summary>
         */
        public virtual IList<string> GetMissingTemplates( StringTemplateGroup group )
        {
            string[] missing =
                _templates.Values
                .Where( template => !template.optional && !group.IsDefined( template.name ) )
                .Select( template => template.name )
                .ToArray();

            return ( missing.Length == 0 ) ? null : missing;
        }
 /** <summary>
  *  Return a list of all template sigs that are present in the group, but
  *  that have wrong formal argument lists.  Return null if all is well.
  *  </summary>
  */
 public virtual IList<string> GetMismatchedTemplates( StringTemplateGroup group )
 {
     List<string> mismatched = new List<string>();
     foreach ( TemplateDefinition d in _templates.Values )
     {
         if ( group.IsDefined( d.name ) )
         {
             StringTemplate defST = group.GetTemplateDefinition( d.name );
             var formalArgs = defST.FormalArguments;
             bool ack = false;
             if ( ( d.formalArgs != null && formalArgs == null ) ||
                 ( d.formalArgs == null && formalArgs != null ) ||
                 d.formalArgs.Count != formalArgs.Count )
             {
                 ack = true;
             }
             if ( !ack )
             {
                 foreach ( var arg in formalArgs )
                 {
                     FormalArgument arg2;
                     if ( !d.formalArgs.TryGetValue( arg.name, out arg2 ) || arg2 == null )
                     {
                         ack = true;
                         break;
                     }
                 }
             }
             if ( ack )
             {
                 //System.out.println(d.formalArgs+"!="+formalArgs);
                 mismatched.Add( GetTemplateSignature( d ) );
             }
         }
     }
     if ( mismatched.Count == 0 )
     {
         mismatched = null;
     }
     return mismatched;
 }