|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Разбираясь с ленивыми вычислениями наткнулся на вот такой вот пример кода: Код: 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.
Возник вопрос по поводу "трюка" со статическим классом: его назначение - это сделать вызов без указания параметра типа для обобщенного класса? И где можно поподробнее почитать про такие трюки (за счет чего происходит такое поведение и как это применяется)? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 14:27 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
где тут собственно трюки? если компилятор может определить тип на основании входных параметров вы ведь явый тип передаете в качестве параметра в метод, компилятор подставляет этот тип и генерирует класс (грубо говоря) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 14:33 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Roman Mejtes, Я как то неправильно задал вопрос..... Почему когда вызывается метод Lazy.New() не указываются параметр -тип, ведь этот метод тоже обощен.......? Смутило именно это. И второй вопрос - зачем делаются такие статические классы- как описанный в данном примере? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 14:41 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
зачем? чтоб не указывать каждый раз один тип :) лень матушка еще и не на такое толкает :) но это может быть чревато :) сам недавно наступил на грабли с подобным примером. в целом, ни чего не меняется, работать должно одинакого ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 14:46 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Roman Mejtes, А почему разрешается через статический метод вызывать обощенный метод без указания параметра типа? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 14:54 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
k120Roman Mejtes, Я как то неправильно задал вопрос..... Почему когда вызывается метод Lazy.New() не указываются параметр -тип, ведь этот метод тоже обощен.......? Смутило именно это. Компилятор вывел тип на основе переданного параметра. k120И второй вопрос - зачем делаются такие статические классы- как описанный в данном примере? Так, для удобства, в данном случае он опять будут выводить тип. И это необходимо в случае анонимного типа Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:04 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
k120Roman Mejtes, А почему разрешается через статический метод вызывать обощенный метод без указания параметра типа? Потому что generic type inference - компилятору хватает информации для выведения типа генерик-параметра из информации о типах передаваемых аргументов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:05 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Но если я попытаюсь сделать вот так: var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; }); то получу ошибку и требование указать параметр-тип. Почему здесь так? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:09 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
k120Сон Веры Павловны, Но если я попытаюсь сделать вот так: var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; }); то получу ошибку и требование указать параметр-тип. Почему здесь так? потому, что это конструктор, а для конструктора тип необходимо указать. тем более, что класс можно быть ковариантным или контрвариантным и передаваемый тип совсем не определяет то, какой класс в действительности нужен на выходе. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:17 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
k120Сон Веры Павловны, Но если я попытаюсь сделать вот так: var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; }); то получу ошибку и требование указать параметр-тип. Почему здесь так? В первую очередь здесь будет ошибка Cannot create an instance of the static class. Если вы пытаетесь таким образом обратиться к вышеприведенному самописному классу LazyExamp.Lazy - он статический. Во-вторых, type inference работает только для вызова методов, но не для вызова конструкторов классов. В-третьих (на всякий случай) type inference не может быть частичным - компилятор либо выводит типы для всех генерик-аргументов, либо их все надо задавать явно. В общем, читайте Рихтера, там всё это есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:20 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Спасибо огромное всем ответившим, вроде понимание появилось, закреплю Рихтером. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 15:25 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
k120Roman Mejtes, А почему разрешается через статический метод вызывать обобщенный метод без указания параметра типа? Все просто. Если компилятор сам может вычислить тип, он его сам неявно подставит - чтобы программистам не приходилось писать много того, что компилятор сам сможет вычислить (как например с var). В данном примере имеем такое описание: Код: c# 1.
что значит, что функция должна вернуть некий тип. ну и далее в коде идет реализация этой функции: Код: c# 1.
И компилятор понимает, что T это класс с полями int Mul и int Sum. Поэтому он не просит явно писать тип. Бывает, что компилятор не может вычислить тип, если возвращаются какие-нибудь генерики например. В этом случае уже вылетит соответствующая ошибка, с просьбой явно указать тип. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 19:43 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
ой. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 19:44 |
|
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
|
|||
---|---|---|---|
#18+
Чтение Рихтера зло, которое толкает на применение хитрожопых алгоритмов ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 23:14 |
|
|
start [/forum/topic.php?fid=20&msg=39327152&tid=1400288]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 393ms |
0 / 0 |