例如,我有一个类有三个重载方法,如下所示:
class MyClass
{
int sum(int i)
{
// Method implementation.
}
int sum(string x)
{
// Method implementation.
}
int sum(object o)
{
// Method implementation.
}
}
我的问题是当我通过传递任何值(整数,字符串或对象)来调用MyClass的sum方法时,它应该仅调用第三种方法(使用对象类型输入参数)
class MainClass
{
static void Main(string[] args)
{
MyClass obj = new MyClass();
obj.sum(10);
obj.sum("X")
}
}
答案 0 :(得分:0)
你说"没有类型铸造"但是你不能,因为你需要一些方法来向编译器指示要调用哪个版本,并且运行时使用它看到的类型来执行该操作。将int作为对象装箱意味着编译器将选择对象版本
sum(1);//call int version
sum((object)1); //call object version
sum((string)(object)"1"); //call string version
sum((object)(int)(object)1); //call object version
答案 1 :(得分:0)
首先,请允许我说,如果您在使用sum
时有时想要调用int
函数的一个版本,有时想要调用另一个版本,那么重载可能并非如此正确的工具。当您在概念上为多种不同类型实现相同的操作时,重载最有效,并且您希望编译器自动确定哪种函数是为每种类型调用的函数;如果你需要更多的手动控制调用哪个函数,你可能最好使用不同的名称。
也就是说,如果您确定这是您想要做的,您可以根据公共接口中的另一个函数实现对象的重载版本,如:
class MyClass
{
int sum(int i)
{
// Method implementation.
}
int sum(string x)
{
// Method implementation.
}
int sum(object o)
{
sum_object(o);
}
int sum_object(object o)
{
// Method implementation for objects
}
}
然后,当您要将对象版本应用于int
和string
个对象时,您只需直接调用sum_object
。