Имя: Пароль:
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