具有不同返回类型的重载函数

时间:2017-07-10 12:20:46

标签: c# overloading

我有两个具有相同名称的功能,主要区别在于不同的返回类型。我怎么能重载函数才能使用相同的名称,因为有时我需要point3d或point3f数组,以下函数名称给出相同的错误:

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;
}

5 个答案:

答案 0 :(得分:6)

编译器无法知道你在调用什么。我建议使这些名称更具描述性:

public static Point3d[] GetNGonCenters3D(this Mesh mesh)

public static Point3f[] GetNGonCenters3F(this Mesh mesh)

重载在这里不起作用,因为它们都使用相同的参数,编译器无法猜出你想要的返回类型。

答案 1 :(得分:0)

如果要重载函数,则必须具有与您具有相同名称的函数,但必须具有不同的参数。您没有重载您的函数,因为它们具有相同的名称和相同的参数。您必须重命名该函数或向其中一个添加新参数。

答案 2 :(得分:0)

您可以使用泛型:

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;
}

希望这有帮助。

答案 3 :(得分:0)

您不能重载两个函数,唯一的区别是返回类型。 C#使用参数列表作为上下文。

两个想法:

  1. 您可以让函数返回一个对象并在调用中对其进行类型转换。
  2. 您可以在标头中包含一个虚拟变量,以区分方法上下文。
  3. 这是关于C#重载的论文的一个很好的链接。 Overloading in depth

答案 4 :(得分:0)

您不能仅通过使用不同的返回类型来重载方法。当您按名称调用它并为其提供参数时,会找到一种方法,而不是您期望返回的对象。

考虑以下示例中会发生什么(请注意它不会编译):

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);