C # необязательные аргументы в абстрактном методе - PullRequest
3 голосов
/ 19 сентября 2010

Дано:

interface IFoo
{
    void Print(string text = "abc");
}

class Bar : IFoo
{
    public void Print(string text = "def")
    {
        Console.WriteLine(text);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Bar b = new Bar();
        b.Print();

        IFoo f = b as IFoo;
        f.Print();
    }
}

Вывод:

def
abc

Только я или это немного странно? Первоначально я ожидал "def" в обоих случаях. Однако, если бы это было так, то дополнительные аргументы абстрактные методы были бы бесполезны Но все равно кажется хорошей отправной точкой для неприятных ошибок.

1 Ответ

6 голосов
/ 19 сентября 2010

Необязательные параметры - это функция компилятора, и компилятор может работать только с информацией о типе, доступной во время компиляции. Поэтому значения берутся из типа ссылки, с которой вы работаете, а не из фактического типа времени выполнения. В этом простом тестовом примере можно было бы узнать фактический тип f с помощью статического анализа, но это редко работает в реальных примерах и поэтому не реализовано.

...