c#过载问题

本文关键字:问题 | 更新日期: 2023-09-27 17:53:30

是否有可能以某种方式实现以下方案:

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

以便在每个Go(ISpecific)调用时调用第一个重载,并且对于任何其他可能的对象的调用,类将回退Go(Object)实现?

c#过载问题

这就是默认情况下的工作方式-但是使用编译时类型。如果你有Go(foo),而foo的编译时类型没有实现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)

是的,它绝对有效,任何不是isspecific的对象都会调用该对象重载。

我写了一个控制台应用程序来检查。

输出
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");
    }
}