1

J'ai créé une classe mockup à illustrer la question:surcharge résolution dans les constructeurs génériques

public class Anything<T> 
    { 
     /// <summary> 
     /// Generic typed constructor 
     /// </summary> 
     /// <param name="param1"></param> 
     public Anything(T param1) 
     { 
      Console.WriteLine("I'm generic typed constructor"); 
     } 

     /// <summary> 
     /// String typed constructor 
     /// </summary> 
     /// <param name="param1"></param> 
     public Anything(string param1) 
     { 
      Console.WriteLine("I'm string typed constructor"); 
     } 
    } 

Whats up si je construire quelque chose de l'objet string? Il n'y a aucun moyen de différencier les deux constructeurs. C'est une mauvaise pratique de définir un autre constructeur avec le même nombre de paramètres?

Two constructos looks equal

+0

En fait, il y a moyen. Le compilateur utilisera une surcharge non générique si possible. Donc, ce n'est pas une mauvaise pratique s'il y a quelque chose de spécial sur la chaîne –

+0

Quelle est exactement votre question? Comment cela fonctionne (lire à propos de la résolution de surcharge, voir en double), lequel sera appelé (l'exécuter) ou si c'est une mauvaise pratique (basée sur l'opinion)? Si vous fournissez un cas d'utilisation réel, des alternatives peuvent être affichées. Le cas d'utilisation vous expliquera pourquoi vous pensez avoir besoin d'une surcharge de chaîne en premier lieu, et à partir de là, vous verrez comment atténuer l'ambiguïté. Encore une fois, voir en double. :) – CodeCaster

Répondre

1

Le compilateur sera toujours choisir la méthode surchargée plus spécifique, qui est celle avec le paramètre string dans sa signature. Même si vous avez une méthode générique (ou un constructeur dans votre cas), le paramètre explicitement typé string est le plus spécifique. Ainsi

new Anything<string>("test"); 

volonté sortie

Je suis constructeur tapé chaîne


Du point de vue de l'ingénierie logicielle, il est en effet une mauvaise pratique parce qu'il ne serait pas clair l'utilisateur de la classe pourquoi par exemple le constructeur avec le paramètre string présenterait un comportement différent de celui générique.