2017-07-10 5 views
2

J'ai deux fonctions avec le même nom et la principale différence est simplement le type de retour différent. Comment pourrais-je surcharger la fonction afin d'utiliser le même nom parce que parfois j'ai besoin des tableaux de Point3D ou Point3f, et les noms des fonctions suivantes donne l'erreur pour être le même:Fonction de surcharge avec type de retour différent

public static Point3d[] GetNGonCenters(this Mesh mesh) 
{ 
    Point3d[] centers = new Point3d[mesh.Ngons.Count]; 

    for (int i = 0; i < mesh.Ngons.Count; i++) 
     centers[i] = mesh.Ngons.GetNgonCenter(i); 

    return centers; 
} 

public static Point3f[] GetNGonCenters(this Mesh mesh) 
{ 
    Point3f[] centers = new Point3f[mesh.Ngons.Count]; 

    for (int i = 0; i < mesh.Ngons.Count; i++) 
     centers[i] = (Point3f)mesh.Ngons.GetNgonCenter(i); 

    return centers; 
} 
+8

Vous ne pouvez surcharge sur des arguments de méthode, et non sur les types de retour. – Phylogenesis

+1

Vous ne pouvez pas surcharger une fonction sur le type de retour – ali

+0

L'autre option crée une classe statique différente pour la méthode d'extension. La surcharge ne serait pas un problème si elles sont dans des classes séparées – RobPethi

Répondre

6

Le compilateur n'a aucun moyen de savoir ce que vous appelons. Je suggère rendre les noms plus descriptifs comme ceci:

public static Point3d[] GetNGonCenters3D(this Mesh mesh) 

Et

public static Point3f[] GetNGonCenters3F(this Mesh mesh) 

ne fonctionnera pas Surcharge ici car ils sont à la fois en utilisant les mêmes paramètres, le compilateur ne peut pas deviner ce que le type de retour que vous voulez.

0

Si vous voulez surcharger une fonction, vous devez avoir une fonction avec le même nom, comme vous l'avez fait, mais avec des paramètres différents. Vous ne surchargez pas vos fonctions car elles ont le même nom et le même paramètre. Vous devez soit renommer la fonction ou ajouter un nouveau paramètre à l'un d'entre eux.

0

Vous pouvez utiliser les médicaments génériques:

public static T[] GetNGonCenters<T>(this Mesh mesh) where T : Point3d 
{ 
    T[] centers = new T[mesh.Ngons.Count]; 

    for (int i = 0; i < mesh.Ngons.Count; i++) 
     centers[i] = (T)mesh.Ngons.GetNgonCenter(i); 

    return centers; 
} 

Hope this helps.

0

Vous ne pouvez pas surcharger deux fonctions avec la seule différence étant un type de retour. C# utilise la liste de paramètres comme contexte.

Deux idées:

  1. Vous pourriez avoir la fonction retourne un objet et typecast dans l'appel.
  2. Vous pouvez inclure une variable fictive dans l'en-tête pour différencier le contexte de la méthode.

Voici un bon lien vers un article sur la surcharge C#. Overloading in depth

0

Vous ne pouvez pas surcharger une méthode en ayant uniquement des types de retour différents. Une méthode est trouvée lorsque vous l'appelez par son nom et lui fournissez les paramètres, et non par quel objet vous attendez d'être renvoyé.

ce qui se passerait dans l'exemple suivant (notez qu'il ne compile pas):

public class Foo 
{ 
    public int Number { get; set; } 

    private void DoSomething(int num) 
    { 
     Number += num; 
    } 

    private int DoSomething(int num) 
    { 
     // Bad example, but still valid. 
     Number = num + 2; 
     return num * num; 
    } 
} 

var foo = new Foo(); 

// Which version of the method do I want to call here? 
// Most likely it is the one that returns void, 
// but you can ignore the return type of any method call. 
foo.DoSomething(3);