C#重载问题

| 是否可以以某种方式实现以下方案:
public interface ISomething
{
    void Go(ISpecific specific);

    void Go(Object o);
}
这样,在每个“ 1”调用上都会调用第一个重载,并且对于具有任何其他可能对象的调用,该类将回退到“ 2”实现?     
已邀请:
这就是默认情况下的工作方式-但使用的是编译时类型。如果您具有
Go(foo)
,而ѭ4the的编译时类型未实现
ISpecific
,则即使
foo
在执行时所引用的对象实现
ISpecific
,它也会调用第二种方法。如果您希望在执行时动态地做出此决定,并且您正在使用C#4,则可以编写:
dynamic value = GetValue();
something.Go(value);
...并且在执行时,将选择正确的过载。     
是。这就是编译器的工作方式。     
是的,可以这样做。但是请注意,将根据引用的编译时间类型来决定要进行重载。
ISpecific specificVar = null;
something.Go(specificVar);  // ISomething::Go(ISpecific)
object obj = specificVar;
something.Go(obj);  // ISomething::Go(object)
    
是的,它绝对有效,任何不是ISpecific的对象都将调用该对象重载。 我写了一个控制台应用程序进行检查。 它输出
Object 
Object
Specific

class Program
{
    static void Main()
    {
        Object aSpecific = new Object();
        String nonSpecific = \"nonSpecific\";
        ISpecific specific = new Specific();

        ISomething something = new Something();

        something.Go(aSpecific);
        something.Go(nonSpecific);
        something.Go(specific);

        Console.ReadKey();
    }
}

interface ISpecific
{
    void GoGo();
}

interface ISomething
{
    void Go(ISpecific specific)
    void Go(Object o)
}

Class Specific : ISpecific
{
    public Specific() { }

    public void GoGo()
    {
         Console.WriteLine(\"Specific\");
    }
}

Class Something : ISomething
{
    public Something() { }

    public void Go(ISpecific specific)
    {
        specific.GoGo()
    }

    public void Go(Object o)
    {
        Console.WriteLine(\"Object\");
    }
}
    

要回复问题请先登录注册