Имя: Пароль:
IT
 
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
(15) Ответ положительный.
Например
http://www.cyberforum.ru/csharp-beginners/thread404228.html
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