|
C#: ограничения на параметрический тип | ☑ | ||
---|---|---|---|---|
0
Ненавижу 1С
гуру
08.05.13
✎
11:46
|
class A<T>
{ public T Test(T a, T b) { return a+b; } } какое ограничение сделать на T, чтобы код компилировался? |
|||
1
ptrtss
08.05.13
✎
12:05
|
Надо чтоб поддерживал перегр узку сложения
|
|||
2
Ненавижу 1С
гуру
08.05.13
✎
12:06
|
(1) понятно, но как?
|
|||
3
Serginio1
08.05.13
✎
12:07
|
Поддержку интерфейса сложения
|
|||
4
cViper
08.05.13
✎
12:08
|
(2) Number какой-нибудь
|
|||
5
cViper
08.05.13
✎
12:08
|
или (3)
|
|||
6
cViper
08.05.13
✎
12:08
|
если он есть такой интерфейс.
|
|||
7
Serginio1
08.05.13
✎
12:08
|
Поддержку интерфейса с методом сложения
Например Interface ИнтерфейсДляСложения { T Test(T a, T b) } |
|||
8
Ненавижу 1С
гуру
08.05.13
✎
12:08
|
(3) ты понимаешь, что пишешь? операторы в С# статические, какой тут интерфейс?
|
|||
9
AaNnDdRrEeYy
08.05.13
✎
12:10
|
string или int либо им подобный клас поддерживающий оператор сложения.
|
|||
10
NS
08.05.13
✎
12:11
|
public static T operator +(T A, T B)
|
|||
11
Ненавижу 1С
гуру
08.05.13
✎
12:11
|
(10) куда это писать? чей метод?
|
|||
12
Serginio1
08.05.13
✎
12:13
|
||||
13
NS
08.05.13
✎
12:14
|
(10) это метод класса Т.
|
|||
14
Ненавижу 1С
гуру
08.05.13
✎
12:15
|
(13) ну допустим, но что нам это даст?
|
|||
15
Ненавижу 1С
гуру
08.05.13
✎
12:17
|
(12) ответ значит отрицательный
|
|||
16
NS
08.05.13
✎
12:17
|
(14) Возможность писать в коде а + b для объектов типа T
|
|||
17
NS
08.05.13
✎
12:18
|
||||
18
Ненавижу 1С
гуру
08.05.13
✎
12:18
|
(16) не взлетает
|
|||
19
Ненавижу 1С
гуру
08.05.13
✎
12:19
|
(17) там нет generic
|
|||
20
AaNnDdRrEeYy
08.05.13
✎
12:19
|
Можно сделать через абстрактый оператор
abstract class A{ bublic static abstract operator (object a, object b)} любой класс наследуемый от А должен реализовать абстрактный оператор class A<T> where: T A // короче ограничиваем только потомками класса А { public T Test(T a, T b) { return a+b; } } |
|||
21
Serginio1
08.05.13
✎
12:20
|
http://msdn.microsoft.com/ru-ru/library/d5x73970.aspx
Параметры типа, не имеющие ограничений, например T в открытом классе SampleClass<T>{}, называются неограниченными параметрами типа. Неограниченные параметры типа подчиняются следующим правилам. • Операторы != и == не могут использоваться из-за отсутствия гарантии того, что конкретный аргумент типа будет поддерживать эти операторы. • Их можно преобразовывать в и из объекта System.Object или явно преобразовывать в любой тип интерфейса. • Допускается сравнение со значением NULL. При сравнении неограниченного параметра со значением null сравнение всегда возвращает результат false, если аргумент типа является типом значения. |
|||
22
Ненавижу 1С
гуру
08.05.13
✎
12:21
|
(20) static abstract
взаимоисключаются в одном объявлении (21) это я и так знал |
|||
23
AaNnDdRrEeYy
08.05.13
✎
12:21
|
(20)+ добавить в where известные sealed классы (строка, число) которые точно поддерживают этот оператор.
|
|||
24
Serginio1
08.05.13
✎
12:22
|
В случае применения ограничения where T : class следует избегать использования операторов == и != с параметром типа, потому что эти операторы выполняют только проверку удостоверения ссылки, но не проверяют равенство величины. Это верно даже в том случае, если эти операторы перегружаются в тип, который используется в качестве аргумента. В следующим коде иллюстрируется эта особенность; выдается результат false, несмотря на то что класс String используется для перегрузки оператора ==.
|
|||
25
lucifer
08.05.13
✎
12:23
|
(0) decimal
|
|||
26
Ненавижу 1С
гуру
08.05.13
✎
12:23
|
(23) нельзя, потому что:
1. Int32 не класс 2. T:A, T:B читается как одновременная поддержка A и B |
|||
27
NS
08.05.13
✎
12:24
|
http://www.rsdn.ru/article/csharp/newincsharp.xml#EMSAE
Тут написано что не взлетит. |
|||
28
Ненавижу 1С
гуру
08.05.13
✎
12:24
|
(24) хватит постить все подряд
|
|||
29
ptrtss
08.05.13
✎
12:25
|
Возможно получится, если параметры сделать dynamic, но надо как-то материться, если факт. значения не наследуют T
|
|||
30
Ненавижу 1С
гуру
08.05.13
✎
12:26
|
(29) ну это да
|
|||
31
ptrtss
08.05.13
✎
12:26
|
Или в теле завести две переменных и через них
|
|||
32
NS
08.05.13
✎
12:38
|
(0) Вообще ответ в (27)
Ограничения игнорируются при проверке перегрузки. |
|||
33
Serginio1
08.05.13
✎
12:47
|
Не на этом форуме задаешь вопросы. Хотя бы на RSDN зайди. Там много извращенцев. Они тебе могут предложить утинную типизацию http://www.rsdn.ru/forum/src/3165397.1
Только для примитивных типов перегрузка встроена для других это добавление метода op_Addition |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |