Почему «динамический» не ковариантен и не контравариантен по отношению ко всем типам при использовании в качестве параметра универсального типа?

Мне интересно, является ли dynamic семантически эквивалентным объекту при использовании в качестве параметра универсального типа . Если так, то мне любопытно, почему существует это ограничение, поскольку они различаются при присвоении значений переменным или формальным параметрам.

Я написал небольшой эксперимент на C # 4.0, чтобы разобрать некоторые детали. Я определил несколько простых интерфейсов и реализаций:

interface ICovariance<out T> { T Method(); }

interface IContravariance<in T> { void Method(T argument); }

class Covariance<T> : ICovariance<T>
{
    public T Method() { return default(T); }
}

class Contravariance<T> : IContravariance<T>
{
    public void Method(T argument) { }
}

Интересные детали эксперимента:

class Variance
{
    static void Example()
    {
        ICovariance<object> c1 = new Covariance<string>();
        IContravariance<string> c2 = new Contravariance<object>();

        ICovariance<dynamic> c3 = new Covariance<string>();
        IContravariance<string> c4 = new Contravariance<dynamic>();

        ICovariance<object> c5 = new Covariance<dynamic>();
        IContravariance<dynamic> c6 = new Contravariance<object>();

        // The following statements do not compile.
        //ICovariance<string> c7 = new Covariance<dynamic>();
        //IContravariance<dynamic> c8 = new Contravariance<string>();

        // However, these do.
        string s = new Covariance<dynamic>().Method();
        new Contravariance<string>().Method((dynamic)s);       
    }
}

Первые два утверждения с c1 и c2 демонстрируют, что базовая ковариация и контравариантность работают. Затем я использую c3 и c4 , чтобы показать, что динамический может использоваться как параметр универсального типа таким же образом.

Операторы с c5 и c6 показывают, что преобразование из динамического в объект всегда допустимо. В этом нет ничего удивительного, поскольку объект является предком всех других типов.

Последний эксперимент с c7 и c8 - вот где я начинаю запутаться. Это означает, что методы, возвращающие динамических объектов, не заменяют методы, возвращающие строковые объекты, и аналогично, что методы, принимающие строковые объекты, не могут принимать динамических шт. Я действительно получил реальный ответ о том, как это сделать (на самом деле получил "значок Tumbleweed" lol). У меня есть приложение на основе документов (...

Я уже задал пару вопросов по этой теме, и на самом деле не получил реального ответа о том, как это сделать (на самом деле оно получило "Значок Tumbleweed" lol) .

У меня есть приложение на основе документа (то есть Menu.Xib отделен от MyDocument.Xib).

Допустим, я хочу добавить кнопку «Полужирный» или кнопку «Проверить орфографию» (элементы, перечисленные в меню .xib (в разделе «Формат»> «Шрифт» и т. д.) в MyDocument (основной интерфейс). Я не могу понять, как это сделать.

Любая помощь будет принята с благодарностью (если сработает, я сразу же награду ответ, это меня озадачило уже пару недель)

Я попытался добавить диспетчер шрифтов в MyDocument. Xib и подключается таким образом, но кнопка жирным шрифтом только включает, но не отключает. Кроме того, проверка орфографии и т. Д. Не может быть активирована через диспетчер шрифтов.

Должен быть лучший способ сделать это.

Документация Apple невероятно расплывчата.

13
задан paulmelnikow 13 January 2012 в 17:47
поделиться