Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#自动为参数选择最相关的方法_C#_Methods_Overloading - Fatal编程技术网

C#自动为参数选择最相关的方法

C#自动为参数选择最相关的方法,c#,methods,overloading,C#,Methods,Overloading,我在C#中有以下代码: 程序输出4,但是,我希望它选择更具体的方法,这将是第二种方法。我不能简单地将变量rect和circle定义为它们的特定类型,因为在我的代码上下文中,我不知道它们的类型是什么 我试图实现这一点的方法是否完全错误,或者是否有一种相当简单的方法可以自动选择正确的方法?如果您真的想在运行时选择方法,可以使用动态。请注意,它是缓慢的 我仍然觉得你应该使用的模式是不同的,但是除非你告诉我们你真正想要什么,否则很难解释什么是真正的模式 例如,如果不使用dynamic,您可以: publ

我在C#中有以下代码:

程序输出4,但是,我希望它选择更具体的方法,这将是第二种方法。我不能简单地将变量rect和circle定义为它们的特定类型,因为在我的代码上下文中,我不知道它们的类型是什么


我试图实现这一点的方法是否完全错误,或者是否有一种相当简单的方法可以自动选择正确的方法?

如果您真的想在运行时选择方法,可以使用
动态
。请注意,它是缓慢的

我仍然觉得你应该使用的模式是不同的,但是除非你告诉我们你真正想要什么,否则很难解释什么是真正的模式

例如,如果不使用dynamic,您可以:

public static int count(Object obj1, Object obj2)
{
    if (obj1 is Rectangle && obj2 is Circle)
    {
        return count((Rectangle)obj1, (Circle)obj2);
    }

    return 4;
}
请注意,我仍然觉得这里有些不对劲,因为如果你

Console.WriteLine(count(circle, rect));
(I倒置的
圆圈
矩形
)。你想要相同的结果还是不同的结果?在这两种情况下,你也必须处理这个问题


另一个问题:你必须处理的案件数量呈指数级增长。对于2个数字,您有4个案例(rect+rect、circle+circle、rect+circle、circle+rect),但是对于4个数字,您已经有16个案例,6个数字36个案例……

您需要使用dynamic关键字在代码中触发动态调度(运行时评估):

static void Main(string[] args)
{
    Object rect = new Rectangle();
    Object circle = new Circle();
    Console.WriteLine(count((dynamic) rect, (dynamic) circle));
}

在您的示例中,这将打印0而不是4。

遗憾的是,是编译器选择了正确的方法,编译器看到的是对象和对象,而不是矩形和圆圈,但肯定是因为矩形和圆圈是更适合第二个方法参数的子类,编译器应该选择第二个方法?这里讨论的概念是动态分派或多重分派,这类似于方法重载,但方法是在运行时选择的,而不是在编译时选择的。这里是@DanDoe不,C编译器不会执行你的程序,所以它看不到在
rect
circle
中可能会出现什么值。它只能查看
rect
circle
的类型,因为它们是“确定的”
Console.WriteLine(count(circle, rect));
static void Main(string[] args)
{
    Object rect = new Rectangle();
    Object circle = new Circle();
    Console.WriteLine(count((dynamic) rect, (dynamic) circle));
}