Здравствуйте, adontz, Вы писали:
A>Здравствуйте, samius, Вы писали:
A>>>Вообще-то, есть свойство IsFixedSize S>>У другого интерфейса. Я просил без даункаста
A>Акстись, у какого другого?
A>
A>[ComVisible(true)]
A>public interface IList : ICollection, IEnumerable
A>
Мой вопрос был о IList<T>. Между ними ничего общего.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, samius, Вы писали:
S>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
Q>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
Мне вообще не понятно, к чему же таки относится это свойство.
var arr = new [] {1, 2};
((IList<int>)arr).IsReadOnly.Dump(); // True
((IList)arr).IsReadOnly.Dump(); // False
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, samius, Вы писали:
S>>Я бы удовлетворился стандартными контейнерами. Мне не нравится что интерфейсы не fine-grained.
A>Смысла в это всё равно нет, потому что я лично сам встречался со случаями когда коллекция ReadOnly/FixedSize иногда. Интерфейсами такое не обозначить.
Впрочем, можно было бы сделать аналог QueryInterface, который бы в динамике решал, возвращать ли или нет запрашиваемую грань.
Здравствуйте, samius, Вы писали:
Q>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
S>Мне вообще не понятно, к чему же таки относится это свойство. S>
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, samius, Вы писали:
Q>>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
S>>Мне вообще не понятно, к чему же таки относится это свойство. S>>
Q>Я так понял (в код не заглядывал), имеет место Explicit Interface Implementation.
Это для меня постижимо. Логика такого решения — нет.
Q>Всё-таки, при чём здесь индексатор?
Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?
Здравствуйте, samius, Вы писали:
Q>>Всё-таки, при чём здесь индексатор? S>Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?
По свойству «read only» элемента коллекции (если такое свойство есть). К Optional Features Pattern'у, его альтернативам и вообще коллекциям/интерфейсам это не имеет совсем никакого отношения. Это вопрос глубокой/неглубокой иммутабельности, он ортогонален обсуждаемой теме.
Здравствуйте, samius, Вы писали:
А>>>>>кто мне объяснит зачем мне доступен метод Add, который всегда будет кидать эксепшн? Q>>>>«Framework Design Guidelines», глава «9.7 Optional Feature Pattern». S>>>Есть рецепт, как можно понять, можно ли вызывать метод IList<T>.Add без получения исключения и даункастинга?
_FR>>В этом суть паттерна и заключена, что на все подобные кейсы "есть рецепт". Подробнее ознакомиться можно здесь.
S>Хорошо, как понять можно ли использовать индексатор списка на запись?
Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций
Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.
Help will always be given at Hogwarts to those who ask for it.
S>dynamic ad = arr;
S>bool r = ad.IsReadOnly;
S>r.Dump(); // False
S>
With the new dynamic keyword in C# 4.0, a method call on a dynamic object is resolved at runtime. Is is therefore impossible to access the explicitly implemented member on a dynamic object.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, samius, Вы писали:
Q>>>Всё-таки, при чём здесь индексатор? S>>Я не знаю причем, но по какому свойству тогда ориентироваться, можно ли изменять элементы коллекции? Или это дыра в Optional Features Pattern?
Q>По свойству «read only» элемента коллекции (если такое свойство есть). К Optional Features Pattern'у, его альтернативам и вообще коллекциям/интерфейсам это не имеет совсем никакого отношения. Это вопрос глубокой/неглубокой иммутабельности, он ортогонален обсуждаемой теме.
Причем здесь свойства элемента коллекции?
Есть метод
void SetValueIfCan(IList<T> list, int index, T value)
{
// как узнать, можно ли вызывать сеттер?
list[0] = value;
}
Здравствуйте, Аноним, Вы писали:
А>>>конкретные вещи: А>>>есть розетки на 360, а есть на 220В. Розетка в данном случае — это интерфейс. А>>>Я не могу вставить вилку 220 в 360. А>>>Считай, что метод Add это вставки вилки в розетку
_FR>>А кто вам _обещал_ какую-то конкретную розетку или вилку? Чем одна розетка\вилка лучше другой? Ничем, они равноправны. А переходники у любого _квалифицированного_ путешественника должны быть в наличии. Из приведённого вами примера виднен лишь недостаток квалификации
_FR>>Продолжайте, весилите публику в том же духе.
А>по сути ответа на конкретный пример не услышал — следовательно, сказать нечего
Я тоже не услышал выше ответов по сути. Однако вы что-то всё-таки в ответ, не по сути, но сказали. Следовательно, ваш вывод о том, что сказать нечего мне — ошибочен. Качайтесь :о)
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, samius, Вы писали:
S>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?
Ну ёлки-палки. Неужели так сложно погуглить и почитать о том, что означают свойства базовых интерфейсов коллекций И как можно о чём-то говорить, не имея таких примитивных знаний?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
S>>Хорошо, как понять можно ли использовать индексатор списка на запись?
_FR>Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций
_FR>Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.
FRED, я зол!
Ты даже не второй, кто мне предлагает для ответа на вопрос, можно ли по IList<T> узнать о возможности использования сеттера индексатора без даункаста, воспользвоаться IList-ом.
Благодарю за "внимательность".
Здравствуйте, samius, Вы писали:
S>>>Это как? свойство IsReadOnly определено у ICollection<T>. Как оно может вызываться по-разному в зависимости от того, хочу ли я узнать можно ли Add, или можно ли изменять через индексатор?
A>>Вообще-то, есть свойство IsFixedSize S>У другого интерфейса. Я просил без даункаста
Нет, вы действительно Рихтера не читали? Хоть одну коллекцию кроме массива можете привести в качестве примера, в которой был бы нужен IsFixedSize? Именно поэтому, потому что было сложно в большенстве голов уложить как IsFixedSize так и IsReadOnly, а так же из-за того, что кроме массива это более нигде было не нужно, в generic-коллекциях от этого отказались, оставив лишь IsReadOnly. Архитекторы блин, недоученные.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, samius, Вы писали:
S>>А потом, если arr.IsReadonly все-таки true, то его наверно изменять нельзя через индексатор?
_FR>Ну ёлки-палки. Неужели так сложно погуглить и почитать о том, что означают свойства базовых интерфейсов коллекций И как можно о чём-то говорить, не имея таких примитивных знаний?
Здравствуйте, samius, Вы писали:
S>>>Хорошо, как понять можно ли использовать индексатор списка на запись? _FR>>Я, признаться, удивлён: говорить о том, что коллекции сделаны не лучшим образом и не знать базовых интерфейсов коллекций
_FR>>Единственная коллекция с таким свойством — массив, и специально для него было сделано IList.IsFixedSize Property. Об этом, если не ошибаюсь, даже Рихтер писал. Классику всё-таки по диагонали читать не следует, что бы не задавать потом подобных вопросов.
S>FRED, я зол! S>Ты даже не второй, кто мне предлагает для ответа на вопрос, можно ли по IList<T> узнать о возможности использования сеттера индексатора без даункаста, воспользвоаться IList-ом. S>Благодарю за "внимательность".
Ну если ответ небыл известен, что плохого в том, что ответ получен несколько раз А если всё-таки был известен: почему не указать этого в сразу — мы же не подсекаем тут друг друга, подлавливая на ошибках и пытаясь выяснить, у кого больше, а пытаемся узнать, как лучше. Вот если ответ был известен, надо было бы так и написать, что IsFixedSize нет и без него никак. Ну а если забыли — ну и что что несколько раз напомнили?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, samius, Вы писали:
Q>>>Может, вопрос терминологии, но я не пойму, как можно изменять коллекцию через индексатор. Add меняет коллекцию; через индексатор же можно изменить элемент коллекции. Свойство «read only» коллекции не распространяется на её элементы.
Да, вопрос терминологии, говорили о разных вещах. Точнее, я изначально понял всё превратно, зачем-то добавил лишний уровень косвенности, евпочя.
S>Есть метод S>
S>void SetValueIfCan(IList<T> list, int index, T value)
S>{
S> // как узнать, можно ли вызывать сеттер?
S> list[0] = value;
S>}
S>