Почему не компилируется такой код Бага? Причем, если закоментировать выделенный код, то компиляция проходит успешно
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
R>Main.n(28,3):Error: CheckSTV for ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[ConsoleApplication1.First[...]]]] failed: cyclic type found
Интересно, а что ты этим кодом хотел добиться? Ну, сказано же тебе, рекурсивный тип получился.
Здравствуйте, VladD2, Вы писали:
VD>Однозначно — баг. Надо отписать в багтрекер.
Понятно. Набросал примеры из BLToolkit.Demo на Немерле, так студия просто схлопывается Завтра посмотрю, может сам где накосячил
VD>Хотя конечно пример из серии "через зад автогеном...".
Здравствуйте, rameel, Вы писали:
R>Понятно. Набросал примеры из BLToolkit.Demo на Немерле, так студия просто схлопывается Завтра посмотрю, может сам где накосячил
Это тоже в багтрекер. Схлопывание — это значит рекурсивное переполнение стека. Это надо вычищать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>>Интересно, а что ты этим кодом хотел добиться? Ну, сказано же тебе, рекурсивный тип получился.
СТ>Гм. Впрочем, тут надо позвать nikov'а.
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 не содержит подобного требования.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, desco, Вы писали:
N>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs N>Интересно, что Ecma-334 не содержит подобного требования.
Здравствуйте, desco, Вы писали:
N>>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs N>>Интересно, что Ecma-334 не содержит подобного требования.
D>в курсе пример оттуда и взят
Вы в баг-трекер отписали?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, desco, Вы писали:
N>>>Там в спецификации есть дополнительное ограничение. См. Ecma-335, 9.2 Generics and recursive inheritance graphs N>>>Интересно, что Ecma-334 не содержит подобного требования.
D>>в курсе пример оттуда и взят
VD>Вы в баг-трекер отписали?
Здравствуйте, VladD2, Вы писали:
IT>>Трудно в это поверить?
VD>Звучит несколько нездорово. Все же, согласись, содание экземпляров абстрактных классов не совсем нормальное занятие.
В C# — это единственный способ догенерировать класс в рантайме.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
VD>>Звучит несколько нездорово. Все же, согласись, содание экземпляров абстрактных классов не совсем нормальное занятие.
IT>В C# — это единственный способ догенерировать класс в рантайме.
Не понятно утверждение. Для того чтобы догененерировать класс в рантайме, надо создать экземпляр абстрактного класса?
Здравствуйте, 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("Вася");
}
Если нам не помогут, то мы тоже никого не пощадим.
Напиши на шарпе лучше, а я посмотрю
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);
}
Декларативность в полный рост. Вот только на немерле можно сделать лучше
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Напиши на шарпе лучше, а я посмотрю
Дык, а есть ли теперь в этом смысл?
IT>В базовом классе определены некоторые вспомогательные методы, которые используются генератором, некоторые виртуальные методы, которые иногда полезно перекрывать и там же болтается атрибут, отвечающий за генерацию...
Ясно.
А почему было не организовать описание в виде интерфейса? Тогда ведь можно было бы любые классы использоват и не париться.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
IT>>Напиши на шарпе лучше, а я посмотрю
VD>Дык, а есть ли теперь в этом смысл?
Когда все мои клиенты перейдут на N, то понятное дело не будет
IT>>В базовом классе определены некоторые вспомогательные методы, которые используются генератором, некоторые виртуальные методы, которые иногда полезно перекрывать и там же болтается атрибут, отвечающий за генерацию...
VD>Ясно. VD>А почему было не организовать описание в виде интерфейса? Тогда ведь можно было бы любые классы использоват и не париться.
Я же говорю, в базовом классе есть много всяких полезняшек. Например, управление соединением. Да и нафига аксессору другой базовый класс, это же тупой до предела паттерн.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Когда все мои клиенты перейдут на N, то понятное дело не будет
А клиенты сами пишут программы?
Тогда надо срочно ускорить процесс миграции.
IT>Я же говорю, в базовом классе есть много всяких полезняшек. Например, управление соединением. Да и нафига аксессору другой базовый класс, это же тупой до предела паттерн.
Дык тогда бы этот "базовый" можно было просто подключать генератором. А в описании иметь чистый интерфейс.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.