2009-10-12 8 views
3

J'ai un certain nombre de classes qui représente les appels de transactions commerciales: l'exécution des procédures stockées appropriées.Comment éviter l'erreur 'call is ambiguous ...' lors de l'écriture de méthodes statiques et non statiques en C#?

Maintenant, les regards comme celui-ci:

public static class Request 
{ 
    public static void Approve(..) { 
     using(connection) { 
      command.Text = "EXEC [Approve] ,,"] 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

Et je veux les rendre plus thread-safe:

public class Request { 
    public static void Approve(..) { 
     new Request().Approve(..); 
    } 

    internal void Approve(..) { 
     using(connection) { 
      command.Text = "EXEC [Approve] ,,"] 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

Mais obtenir message d'erreur suivant:

L'appel est ambigu entre les méthodes ou propriétés suivantes: : 'MyNamespace.Request.Approve (..)' et 'MyNamespace.Request.Approve (..)'

Comment puis-je forcer, marque que j'appelle non-statique, méthode d'instance de statique? Ou je ne peux pas faire cela sans renommer l'une des méthodes? Ou déplacement d'une méthode statique vers une autre classe, etc.

+3

Vous pourriez être intéressé par certaines des décisions de conception impliquant la désambiguation des méthodes statiques à partir des méthodes d'instance en C#. Les règles semblent un peu étranges, mais en fait, elles sont soigneusement conçues. Voici un article que j'ai écrit récemment sur le sujet: http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx –

+0

@Eric Lippert Bonjour, Eric. Merci beaucoup pour le lien! J'ai beaucoup de nouvelles informations. btw Je lis votre blog (en russe par Gaidar) – abatishchev

Répondre

3

Si vous appelez d'une instance (par exemple, requestVar.Approve()), alors vous devez le renommer. La statique peut être appelée en utilisant Request.Approve() cependant.

+1

Oui, parce que vous appelez 'Approve()' depuis une instance de la classe 'Request'. Pour appeler la méthode statique sans ambiguïté, vous devez faire 'Request.Approve()'. Et de toute façon, faire une méthode statique et une méthode d'instance avec la même signature génèrerait une erreur de compilateur. – mgbowen

+0

Vous avez raison, désolé, n'a pas lu votre réponse avec soin – abatishchev

+1

Ce n'est pas un problème :). Mais selon la réponse de LBushkin, vous devriez probablement juste renommer la méthode interne en 'InternalApprove()' ou quelque chose de similaire, ou peut-être repenser la structure de votre classe. – mgbowen

4

C# permet ne permet pas d'appeler des méthodes statiques via des références d'instance. En tant que telles - les méthodes doivent soit être nommées différemment ou utiliser la surcharge d'argument pour différencier les méthodes statiques des méthodes d'instance.

Dans votre exemple, étant donné que la méthode Approve() est interne, le renommer est probablement l'option la plus simple. Comme pour marquer qu'une méthode est statique ... Je (personnellement) pense que le nom est un moyen parfaitement bien de différencier les deux - pourquoi inventer quelque chose de plus compliqué.

+1

Votre première phrase est erronée. C# ne permet certainement pas d'appeler des méthodes statiques via des références d'instance. –

+0

En effet. Que c'est embarrassant. – LBushkin

Questions connexes