С#: вызов не общего метода из общего метода

class CustomClass<T> where T: bool
{
    public CustomClass(T defaultValue)
    {
        init(defaultValue); // why can't the compiler just use void init(bool) here?
    }
    public void init(bool defaultValue)
    {

    }
    // public void init(int defaultValue) will be implemented later
}

Здравствуйте. Это, кажется, простой вопрос, но я не смог найти ответ в Интернете: почему компилятор не использует метод init? Я просто хочу предоставить различные методы для разных типов.

Вместо этого выводится следующее сообщение об ошибке: "Наилучшее перегруженное соответствие метода для" CustomClass.init(bool) "имеет некоторые недопустимые аргументы"

Я был бы рад намеку.

С уважением, Крис

Ответ 1

Компилятор не может использовать init(bool), потому что во время компиляции он не может знать, что T есть bool. То, что вы запрашиваете, - это динамическая диспетчеризация - какой метод фактически вызывается, зависит от типа времени выполнения аргумента и не может быть определен во время компиляции.

Это можно сделать в С# 4.0 с помощью типа dynamic:

class CustomClass<T>
{
    public CustomClass(T defaultValue)
    {
        init((dynamic)defaultValue);
    }
    private void init(bool defaultValue) { Console.WriteLine("bool"); }
    private void init(int defaultValue) { Console.WriteLine("int"); }
    private void init(object defaultValue) {
        Console.WriteLine("fallback for all other types that don’t have "+
                          "a more specific init()");
    }
}