CheckSTV
От: rameel https://github.com/rsdn/CodeJam
Дата: 30.04.07 20:41
Оценка: 14 (1)
Вечер добрый!

Почему не компилируется такой код Бага? Причем, если закоментировать выделенный код, то компиляция проходит успешно
namespace ConsoleApplication1
{
    public class First[T] where T : First[T], new()
    {
        public static CreateInstance() : T
        {
            T();
        }

    }
    
    public class Second : First[Second]
    {
    }    
    
    module Program
    {
        Main() : void
        {
            def c = Second.CreateInstance();
        }
    }
}


Текст ошибки:

Main.n(28,3):Error: CheckSTV for ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[...]]]] failed: cyclic type found

... << RSDN@Home 1.2.0 alpha rev. 677>>
Re: CheckSTV
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 30.04.07 21:09
Оценка:
Здравствуйте, rameel, Вы писали:

R>Вечер добрый!



R>Текст ошибки:

R>

R>Main.n(28,3):Error: CheckSTV for ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[...]]]] failed: cyclic type found


Интересно, а что ты этим кодом хотел добиться? Ну, сказано же тебе, рекурсивный тип получился.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Re[2]: CheckSTV
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 30.04.07 21:11
Оценка:
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>Интересно, а что ты этим кодом хотел добиться? Ну, сказано же тебе, рекурсивный тип получился.


Гм. Впрочем, тут надо позвать nikov'а.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Re: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.04.07 21:15
Оценка: 5 (1)
Здравствуйте, rameel, Вы писали:

R>Почему не компилируется такой код Бага? Причем, если закоментировать выделенный код, то компиляция проходит успешно


Однозначно — баг. Надо отписать в багтрекер.

Хотя конечно пример из серии "через зад автогеном...".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: CheckSTV
От: rameel https://github.com/rsdn/CodeJam
Дата: 30.04.07 22:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Однозначно — баг. Надо отписать в багтрекер.


Понятно. Набросал примеры из BLToolkit.Demo на Немерле, так студия просто схлопывается Завтра посмотрю, может сам где накосячил

VD>Хотя конечно пример из серии "через зад автогеном...".


... << RSDN@Home 1.2.0 alpha rev. 677>>
Re[3]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.05.07 12:23
Оценка:
Здравствуйте, rameel, Вы писали:

R>Понятно. Набросал примеры из BLToolkit.Demo на Немерле, так студия просто схлопывается Завтра посмотрю, может сам где накосячил


Это тоже в багтрекер. Схлопывание — это значит рекурсивное переполнение стека. Это надо вычищать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: CheckSTV
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.05.07 17:10
Оценка:
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>>Интересно, а что ты этим кодом хотел добиться? Ну, сказано же тебе, рекурсивный тип получился.


СТ>Гм. Впрочем, тут надо позвать nikov'а.


Тут я.
Однозначно, бага. А код вполне нормальный.
Re[2]: CheckSTV
От: IT Россия linq2db.com
Дата: 01.05.07 18:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Хотя конечно пример из серии "через зад автогеном...".


В BLToolkit это использовалось для создания экземпляров абстрактных классов.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.05.07 20:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>В BLToolkit это использовалось для создания экземпляров абстрактных классов.


Э... что?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: CheckSTV
От: IT Россия linq2db.com
Дата: 01.05.07 22:43
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>В BLToolkit это использовалось для создания экземпляров абстрактных классов.


VD>Э... что?


Трудно в это поверить?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: CheckSTV
От: desco США http://v2matveev.blogspot.com
Дата: 02.05.07 08:19
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Хотя конечно пример из серии "через зад автогеном...".


пример из этой же серии

    public class B[U] {}
    public class A[T] : B[A[A[T]]] {}


компилируется, но не проходит верификацию

Microsoft (R) .NET Framework PE Verifier. Version 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.

[token 0x02000003] Type load failed.
1 Error Verifying ClassLibrary.dll


к слову, аналогичный баг имеется в компиляторе C#

class B<U> {}
class A<T> : B<A<A<T>>> {}


Microsoft (R) .NET Framework PE Verifier. Version 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.

[token 0x02000003] Type load failed.
1 Error Verifying test.dll

Re[3]: CheckSTV
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.05.07 08:26
Оценка:
Здравствуйте, desco, Вы писали:

D>
D>    public class B[U] {}
D>    public class A[T] : B[A[A[T]]] {}
D>


D>компилируется, но не проходит верификацию


Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs
Интересно, что Ecma-334 не содержит подобного требования.
Re[4]: CheckSTV
От: desco США http://v2matveev.blogspot.com
Дата: 02.05.07 08:29
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, desco, Вы писали:


N>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs

N>Интересно, что Ecma-334 не содержит подобного требования.

в курсе пример оттуда и взят
Re[5]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.07 08:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Трудно в это поверить?


Звучит несколько нездорово. Все же, согласись, содание экземпляров абстрактных классов не совсем нормальное занятие.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.07 09:01
Оценка:
Здравствуйте, desco, Вы писали:

N>>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs

N>>Интересно, что Ecma-334 не содержит подобного требования.

D>в курсе пример оттуда и взят


Вы в баг-трекер отписали?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: CheckSTV
От: desco США http://v2matveev.blogspot.com
Дата: 02.05.07 09:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, desco, Вы писали:


N>>>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs

N>>>Интересно, что Ecma-334 не содержит подобного требования.

D>>в курсе пример оттуда и взят


VD>Вы в баг-трекер отписали?


да.
Re[7]: CheckSTV
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.05.07 09:18
Оценка:
Здравствуйте, desco, Вы писали:

VD>>Вы в баг-трекер отписали?


D>да.


Уже давным-давно.
Re[5]: CheckSTV
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.05.07 09:27
Оценка: +1 :)
Здравствуйте, desco, Вы писали:

D>в курсе пример оттуда и взят



Да, уважаю людей, которые читают Ecma-335...
Re[6]: CheckSTV
От: IT Россия linq2db.com
Дата: 02.05.07 11:00
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Трудно в это поверить?


VD>Звучит несколько нездорово. Все же, согласись, содание экземпляров абстрактных классов не совсем нормальное занятие.


В C# — это единственный способ догенерировать класс в рантайме.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: CheckSTV
От: nikov США http://www.linkedin.com/in/nikov
Дата: 02.05.07 11:07
Оценка: +1
Здравствуйте, IT, Вы писали:

VD>>Звучит несколько нездорово. Все же, согласись, содание экземпляров абстрактных классов не совсем нормальное занятие.


IT>В C# — это единственный способ догенерировать класс в рантайме.


Не понятно утверждение. Для того чтобы догененерировать класс в рантайме, надо создать экземпляр абстрактного класса?
Re[8]: CheckSTV
От: IT Россия linq2db.com
Дата: 02.05.07 14:03
Оценка:
Здравствуйте, nikov, Вы писали:

N>Не понятно утверждение. Для того чтобы догененерировать класс в рантайме, надо создать экземпляр абстрактного класса?


Типа того. Вот вполне корректный пример использования BLToolkit:

public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
{
    [SqlQuery("SELECT * FROM Person WHERE FirstName = @name")]
    public abstract List<Person> GetListByFirstName(string @name);
}

void Main()
{
    List<Person> list = PersonAccessor.CreateInstance().GetListByFirstName("Вася");
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.07 15:14
Оценка:
Здравствуйте, IT, Вы писали:

IT>Типа того. Вот вполне корректный пример использования BLToolkit:


IT>
IT>public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
IT>{
IT>    [SqlQuery("SELECT * FROM Person WHERE FirstName = @name")]
IT>    public abstract List<Person> GetListByFirstName(string @name);
IT>}

IT>void Main()
IT>{
IT>    List<Person> list = PersonAccessor.CreateInstance().GetListByFirstName("Вася");
IT>}
IT>


Ужасть.

А зачем все же тут наследование?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: CheckSTV
От: IT Россия linq2db.com
Дата: 02.05.07 21:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ужасть.


Напиши на шарпе лучше, а я посмотрю

VD>А зачем все же тут наследование?


В базовом классе определены некоторые вспомогательные методы, которые используются генератором, некоторые виртуальные методы, которые иногда полезно перекрывать и там же болтается атрибут, отвечающий за генерацию.

Кстати, базовый класс не обязан быть дженериком. Это как раз сделано исключительно для удобства. Простейший вариант выгладит так:

public abstract class PersonAccessor : DataAccessor
{
    [SqlQuery("SELECT * FROM Person WHERE FirstName = @name")]
    public abstract List<Person> GetListByFirstName(string @name);
}

Если учесть, что для получения имён сохранённых процедур может использоваться имя метода, то для них будет ещё короче:

public abstract class PersonAccessor : DataAccessor
{
    public abstract List<Person> GetListByFirstName(string @name);
}

Декларативность в полный рост. Вот только на немерле можно сделать лучше
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.07 22:13
Оценка:
Здравствуйте, IT, Вы писали:

IT>Напиши на шарпе лучше, а я посмотрю


Дык, а есть ли теперь в этом смысл?

IT>В базовом классе определены некоторые вспомогательные методы, которые используются генератором, некоторые виртуальные методы, которые иногда полезно перекрывать и там же болтается атрибут, отвечающий за генерацию...


Ясно.
А почему было не организовать описание в виде интерфейса? Тогда ведь можно было бы любые классы использоват и не париться.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: CheckSTV
От: IT Россия linq2db.com
Дата: 02.05.07 22:51
Оценка:
Здравствуйте, VladD2, Вы писали:

IT>>Напиши на шарпе лучше, а я посмотрю


VD>Дык, а есть ли теперь в этом смысл?


Когда все мои клиенты перейдут на N, то понятное дело не будет

IT>>В базовом классе определены некоторые вспомогательные методы, которые используются генератором, некоторые виртуальные методы, которые иногда полезно перекрывать и там же болтается атрибут, отвечающий за генерацию...


VD>Ясно.

VD>А почему было не организовать описание в виде интерфейса? Тогда ведь можно было бы любые классы использоват и не париться.

Я же говорю, в базовом классе есть много всяких полезняшек. Например, управление соединением. Да и нафига аксессору другой базовый класс, это же тупой до предела паттерн.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: CheckSTV
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.07 23:39
Оценка:
Здравствуйте, IT, Вы писали:

IT>Когда все мои клиенты перейдут на N, то понятное дело не будет


А клиенты сами пишут программы?
Тогда надо срочно ускорить процесс миграции.

IT>Я же говорю, в базовом классе есть много всяких полезняшек. Например, управление соединением. Да и нафига аксессору другой базовый класс, это же тупой до предела паттерн.


Дык тогда бы этот "базовый" можно было просто подключать генератором. А в описании иметь чистый интерфейс.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.