Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интересная штука с generic'ами, MS vs Mono 
:(
    Опции темы
arilou
Дата 14.1.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Вопрос всем на засыпку. Что будет, если скомпилить такой код?

Код

    class Program
    {
        class MyClass<T> 
        {
            public int this[T key]
            {
                get { return 0; }
            }

            public int this[int key]
            {
                get { return 1; } 
            }
        }

        static void Main(string[] args)
        {
            MyClass<int> cls = new MyClass<int>();
            Console.WriteLine(cls[0].ToString());
        }
    }
}


Не буду томить и заставлять copy-paste'ить его в студию smile Выведет "1".

Как выяснилось, MS C# compiler молча съедает первый this[T key] когда T = типу парметра второго индексатора. А вот Mono compiler умнее в данном случае и ругается: cannot define overload members that may unify for some type parameter substitutions

Риторический вопрос: и что делать, если код должен быть совместимым с обоими? smile

Это сообщение отредактировал(а) arilou - 14.1.2006, 19:38


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Void
Дата 14.1.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Очень странно. Прав, естественно, Mono, потому что в спецификации C# 2.0 черным по белому (20.1.8) прописан запрет такой перегрузки и даже пример приведен.
Баг-репорт в MS писать не пробовали? smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 14.1.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Угу, непонятно что делать в таком случае.

Получается, что есть "обычный int" и есть "правильный int", и M$ выбирает "правильный", хотя обычному программеру довольно сложно разобраться, какой из int-индексов правильный - первый или второй.


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 14.1.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



mr.DUDA
Ничего непонятного тут нет, такая конструкция просто запрещена:
Цитата
Methods, constructors, indexers, and operators within a generic class declaration can be overloaded; however, overloading is constrained so that ambiguities cannot occur within constructed classes. Two function members declared with the same names in the same generic class declaration must have parameter types such that no closed constructed type could have two members with the same name and signature. When considering all possible closed constructed types, this rule includes type arguments that do not currently exist in the current program, but could be written. Type constraints on the type parameter are ignored for the purpose of this rule.
...
class G1<U>
{
long F1(U u);    // Invalid overload, G<int> would have two
int F1(int i);      // members with the same signature
...
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
arilou
Дата 14.1.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Есть идеи, если оверлоады мне все таки нужны?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Void
Дата 14.1.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



arilou
А поподробнее задачу описать нельзя? Пока трудно хоть что-то сказать.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
-ser-
Дата 16.1.2006, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



может кто-то пояснит в чем проблема, только в том что компилятор не ругается? но код-то работает правильно, какие претензии (из двух правильных выбран вариант "наиболее правильный"). ведь нельзя же одновременно пустить поезд по двум веткам сразу.


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Exception
Дата 16.1.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



В том и дело, что наиболее верного не выбрать -- оба могут иметь одинаковую сигнатуру.
PM   Вверх
-ser-
Дата 16.1.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



я имел ввиду, хотели перегрузить, и пожалуйста, получили желаемый результат. может я что-то не понимаю.


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Exception
Дата 16.1.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Посмотри. Если generic-параметр Т у нас будет int, то
Код
public int this[T key]

как бы "превратится" в
Код
public int this[int key]
. Таким образом у нас появится два абсолютно одинаковых свойства. А такого быть не должно.
PM   Вверх
arilou
Дата 16.1.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 21
Всего: 61



Тут еще вот какая инфа проскользнула:

Цитата

This is from the ECMA spec 334 final draft, the two important ones are the first two function decls in G!

25.1.7 Overloading in generic classes
Methods, constructors, indexers, and operators within a generic class declaration can be overloaded. While
signatures as declared must be unique, it is possible that substitution of type arguments results in identical
signatures. The tie-breaking rules of overload resolution will pick the most specific one.
[
Example: The following examples show overloads that are valid according to this rule:


Код

interface I1<T> {…}
interface I2<T> {…}
class G1<U>
{
long F1(U u) {…} // Overload resolution for G<int>.F1
int F1(int i) {…} // will pick non-generic
void F3(I1<U> a) {…} // Valid overload
void F3(I2<U> a) {…}
}
class G2<U, V>
{
void F5(U u, V v) {…} // Overload resolution for G2<int, int>
would
void F5(V v, U u) {…} // fail
void F6(U u, I1<V> v) {…} // Valid, overload resolution on
G2<I1<int>, int>
// is ambiguous
void F6(I1<V> v, U u) {…}
void F7(U u1, I1<V> v2) {…} // Valid overload
void F7(V v1, U u2) {…}
void F8(ref U u) {…} // Valid overload
void F8(out V v) {…}
}



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
-ser-
Дата 16.1.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



arilou, если уж так надо и перегрузить и генерики использовать, то может попробовать что-то вроде
Код

    class Program
    {
        class MyBaseClass<T>
        {
            public int this[ T key ]
            {
                get
                {
                    return 0;
                }
                
            }
        }

        class MyClass<T> : MyBaseClass<T>
        {
            public int this[ int key ]
            {
                get
                {
                    return 1;
                }
            }
        }

        static void Main( string[] args )
        {
            MyBaseClass<int> cls = new MyClass<int>();
            Console.WriteLine( cls[ 0 ].ToString() );
            
            MyClass<int> cls1 = new MyClass<int>();
            Console.WriteLine( cls1[ 0 ].ToString() );
        }



--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
Void
Дата 16.1.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



arilou
Интересно. Где бы взять последнию версию спецификации?

Дожили, тонкие моменты в C# приходится разрешать ссылками на параграфы стандарта... За что боролись...


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
-ser-
Дата 17.1.2006, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 1.2.2005

Репутация: 5
Всего: 13



То что приведено arilou и есть последняя версия
http://www.ecma-international.org/publicat...ds/Ecma-334.htm


--------------------
"Тонкая, однако, работа." 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.