我有两个具有相同名称的功能,主要区别在于不同的返回类型。我怎么能重载函数才能使用相同的名称,因为有时我需要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;
}
答案 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#使用参数列表作为上下文。
两个想法:
这是关于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);