Мне интересно, является ли 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 невероятно расплывчата.