Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ограничения дженериков / 22 сообщений из 22, страница 1 из 1
25.09.2019, 10:57
    #39866715
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
Почему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?
...
Рейтинг: 0 / 0
25.09.2019, 12:15
    #39866793
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
а меня расстраивает отсутствие наследования конструкторов. Собирается ли МС запиливать наследование конструкторов?
...
Рейтинг: 0 / 0
25.09.2019, 13:26
    #39866848
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
AntonariyПочему существует всего одно ограничение на конструкторы - new()? Собирается ли МС запиливать в new() аргументы?

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


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

противоречит самой сути конструкторов. есть же base(), а у типа должен быть свой конструктор, так как конструируется экземпляр конкретного типа, поэтому наследование тут неуместно в принципе.
...
Рейтинг: 0 / 0
25.09.2019, 14:14
    #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
25.09.2019, 16:03
    #39866958
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
ЕвгенийВ,

что мешает определить интерфейс с заданным методом и сделать ограничение по интерфейсу?
...
Рейтинг: 0 / 0
25.09.2019, 16:05
    #39866959
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
если нужно создать экземпляр объекта через конструктор с заданной сигнатурой, используйте тип Activator
...
Рейтинг: 0 / 0
25.09.2019, 17:13
    #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
25.09.2019, 17:15
    #39867004
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
Roman Mejtesесли нужно создать экземпляр объекта через конструктор с заданной сигнатурой, используйте тип Activator

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

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

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

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


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

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

вообще, то, что не может компилятор приходится делать либо юнит-тестами, или/либо расширениями на Roslyn
...
Рейтинг: 0 / 0
25.09.2019, 17:53
    #39867042
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
Да я тоже обошел с помощью наследования (int, string, DatеTime в свойствах базового класса) и фабрики Create<T> (которая устанавливает эти свойства).
...
Рейтинг: 0 / 0
25.09.2019, 18:26
    #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
25.09.2019, 18:29
    #39867050
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
hVosttAntonariyкак-то так:
Код: c#
1.
where T : new(int, string, DataTime)


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

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

Информация о методах тоже хранится в мета - данных и ничего.
...
Рейтинг: 0 / 0
25.09.2019, 18:40
    #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
25.09.2019, 18:43
    #39867052
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
Кстати . "Штирлиц упорно продолжал стоять на своём".
...
Рейтинг: 0 / 0
25.09.2019, 23:27
    #39867127
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
ЕвгенийВНу в C# тоже какой-никакой вывод типов :)

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

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

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

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

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


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

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

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

а ещё бы вывод дженериков через конструктор
...
Рейтинг: 0 / 0
26.09.2019, 12:04
    #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
26.09.2019, 19:42
    #39867521
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничения дженериков
ЕвгенийВМожно симулировать.

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

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

Это я знаю. Но это делает компилятор, а не человек :)
И с точки зрения синтаксиса ничего подобного на C# не повторить, только "развернуть" руками.
...
Рейтинг: 0 / 0
26.09.2019, 21:56
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ограничения дженериков / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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