powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ограничения дженериков
22 сообщений из 22, страница 1 из 1
Ограничения дженериков
    #39866715
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39866793
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а меня расстраивает отсутствие наследования конструкторов. Собирается ли МС запиливать наследование конструкторов?
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39866848
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПочему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?

как ты себе это представляешь?
это уже похоже на трейты, на уровне языка это не поддерживается


Shocker.Proа меня расстраивает отсутствие наследования конструкторов. Собирается ли МС запиливать наследование конструкторов?

противоречит самой сути конструкторов. есть же base(), а у типа должен быть свой конструктор, так как конструируется экземпляр конкретного типа, поэтому наследование тут неуместно в принципе.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39866884
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyПочему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?

как ты себе это представляешь?
это уже похоже на трейты, на уровне языка это не поддерживается

В F# можно сделать нечто подобное
Код: c#
1.
2.
type Class5<'T when 'T : (member Method1 : 'T * string * decimal -> int)>(dataIn) =
    let data = dataIn


Это означает, что параметр-тип T должен иметь метод Method1 с параметрами (string, decimal) и возвращающий int.
Что сложного вести такие ограничения для конструктора?
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39866958
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

что мешает определить интерфейс с заданным методом и сделать ограничение по интерфейсу?
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39866959
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если нужно создать экземпляр объекта через конструктор с заданной сигнатурой, используйте тип Activator
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867002
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВ F# можно сделать нечто подобное
Код: c#
1.
2.
type Class5<'T when 'T : (member Method1 : 'T * string * decimal -> int)>(dataIn) =
    let data = dataIn



Это означает, что параметр-тип T должен иметь метод Method1 с параметрами (string, decimal) и возвращающий int.
Что сложного вести такие ограничения для конструктора?

В F# есть вывод типов, а дженерики лишь для совместимости с остальным .NET
Там же есть DU, чего не предвидится в C#
В общем, нельзя запихнуть в язык все крутые концепции, чем-то нужно жертвовать )
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867004
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesесли нужно создать экземпляр объекта через конструктор с заданной сигнатурой, используйте тип Activator

Ну тут речь о контроля на уровне компилятора. Чисто теоретически фича не выглядит как невозможной.
Однако нам не видны скрытые подводные камни, которые наверняка есть и не позволяют бесплатно такое реализовать.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867014
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesЕвгенийВ,

что мешает определить интерфейс с заданным методом и сделать ограничение по интерфейсу?Ничего не мешает. Но нужен конструктор.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867015
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyПочему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?

как ты себе это представляешь?как-то так:
Код: c#
1.
where T : new(int, string, DataTime)

не вижу проблем для компилятора
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867019
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyкак-то так:
Код: c#
1.
where T : new(int, string, DataTime)


не вижу проблем для компилятора

это же в мета-данных типа хранится, видимо с этим какие-то проблемы
может боятся каскадной зависимости, хотя ограничение new() есть
сталкивался с потребностью такой фичи, но как-то обошёл ))

вообще, то, что не может компилятор приходится делать либо юнит-тестами, или/либо расширениями на Roslyn
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867042
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я тоже обошел с помощью наследования (int, string, DatеTime в свойствах базового класса) и фабрики Create<T> (которая устанавливает эти свойства).
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867048
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В F# есть вывод типов, а дженерики лишь для совместимости с остальным .NET

Ну в C# тоже какой-никакой вывод типов :)
А вот дженерики в F# аж двух видов
'T и ^T и есть они так же в OCalm, который является прародителем F# и с C# не имеет ничего общего.
Например это
let inline a f b c = f b %&> b c
означает функция a которая принимает 3 аргумента f - функция, которая аргументом принимает функцию b, последняя принимает аргументом обобщенный параметр c
при чем результатами f и b являются некоторые типы, для которых определен оператор %&>
hVostt
Там же есть DU, чего не предвидится в C#
DU к ограничениям и выводу типов не имеют никакого отношения.

hVosttВ общем, нельзя запихнуть в язык все крутые концепции, чем-то нужно жертвовать )
Можно, но это увеличит порог вхождения и тогда это еще сильнее увеличит разницу между самыми тупыми разработчиками на C# и самыми толковыми программистами C#.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867050
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyкак-то так:
Код: c#
1.
where T : new(int, string, DataTime)


не вижу проблем для компилятора

это же в мета-данных типа хранится, видимо с этим какие-то проблемы

Информация о методах тоже хранится в мета - данных и ничего.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867051
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttможет боятся каскадной зависимости, хотя ограничение new() есть
сталкивался с потребностью такой фичи, но как-то обошёл ))

вообще, то, что не может компилятор приходится делать либо юнит-тестами, или/либо расширениями на Roslyn
Всё гораздо проще. Ответ Липперта:
However, in this specific case I can certainly give you some reasons why I would push back on the feature if it came up in a design meeting as a possible feature for a future version of the language.
...
I say that we should either do the whole feature or don't do it at all. If it is important to be able to restrict types to have particular constructors, then let's do the whole feature and restrict types on the basis of members in general and not just constructors.

В общем, лениво трудиться непонятно над чем, и что мало кому нужно.
Ну, а если сильно припрет, можно дополнительно в генерик-метод передавать генерик-делегат-фабрику с нужной сигнатурой.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867052
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати . "Штирлиц упорно продолжал стоять на своём".
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867127
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНу в C# тоже какой-никакой вывод типов :)

ну с натягом я бы сказал :)

ЕвгенийВозначает функция a которая принимает 3 аргумента f - функция, которая аргументом принимает функцию b, последняя принимает аргументом обобщенный параметр c
при чем результатами f и b являются некоторые типы, для которых определен оператор %&>

да, вот это вывод типов )

ЕвгенийВDU к ограничениям и выводу типов не имеют никакого отношения.

это к тому, что этого тоже сильно не хватает, чтобы писать в функциональном стиле


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

или лениво, как справедливо замечено выше )

Сон Веры Павловны Кстати . "Штирлиц упорно продолжал стоять на своём".

а ещё бы вывод дженериков через конструктор
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867243
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ЕвгенийВDU к ограничениям и выводу типов не имеют никакого отношения.

это к тому, что этого тоже сильно не хватает, чтобы писать в функциональном стиле


Можно симулировать.
автор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
   public abstract class Expression
    {
        public sealed class Number : Expression
        {
            public Number(int value)
            {
                Value = value;
            }
            public int Value { get; private set; }
        }
        public sealed class Add : Expression
        {
            public Add(Expression left, Expression rigth)
            {
                Left = left;
                Rigth = rigth;
            }
            public Expression Left { get; private set; }
            public Expression Rigth { get;private set; }
        }
        public sealed class Multiply : Expression
        {
            public Multiply(Expression left, Expression rigth)
            {
                Left = left;
                Rigth = rigth;
            }
            public Expression Left { get;private set; }
            public Expression Rigth { get;private set; }
        }
        public sealed class Variable:Expression
        {
            public Variable(string str)
            {
                Value = str;
            }
            public string Value { get; private set; }
        }
        public static int Evaluate(Dictionary<string, int> env, Expression expression)
        {
            switch(expression)
            {
                case Number n:
                    return n.Value;
                case Add add:
                    return Evaluate(env, add.Left) + Evaluate(env, add.Rigth);
                case Multiply mul:
                    return Evaluate(env, mul.Left) + Evaluate(env, mul.Rigth);
                case Variable variable:
                    return env[variable.Value];
                default:
                    throw new Exception();
            }
        }
    }
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867521
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВМожно симулировать.

к сожалению, это не то :)
всё прибито гвоздями к базовому типу
да и если всё наследовать от одного, весь смысл теряется на корню
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867524
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВМожно симулировать.

к сожалению, это не то :)
всё прибито гвоздями к базовому типу
да и если всё наследовать от одного, весь смысл теряется на корню
Компилятор F# именно так все и разворачивает :)
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867526
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВКомпилятор F# именно так все и разворачивает :)

Это я знаю. Но это делает компилятор, а не человек :)
И с точки зрения синтаксиса ничего подобного на C# не повторить, только "развернуть" руками.
...
Рейтинг: 0 / 0
Ограничения дженериков
    #39867561
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttAntonariyПочему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?

как ты себе это представляешь?
это уже похоже на трейты, на уровне языка это не поддерживается
...

Имхо, гораздо больше то, чего хочет Antonariy, похоже на concepts.

// https://en.wikipedia.org/wiki/Concepts_(C )
// https://en.cppreference.com/w/cpp/language/constraints

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

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

Там вроде как принято (или было принято) считать, что всякий new в обобщенном коде - тяжкий грех, почти наверно - тяжелейшая, не подлежащая объяснению или оправданию ошибка проектирования.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ограничения дженериков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]