Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Ограничить тип аргумента генерикса?


Автор: Dims 3.11.2008, 20:20
Можно ли указать, что аргумент генерикса должен быть подтипом определённого типа или имплементить определённый интерфейс?

Например, можно ли ограничить, чтобы аргументы были только числовыми типами?

Автор: Bogdan1024 3.11.2008, 20:31
Код

public class MyGenericClass<T> where T:IComparable { }


Автор: Dims 3.11.2008, 21:03
Пасиб.

Автор: Dims 4.11.2008, 17:59
А если надо ограничить именно до числового типа, например

Код

class Vector<T>
    {
        private T x, y;
        public double Length
        {
            get
            {
                Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
            }

        }
    }


ругается. Как сделать?

Автор: Bogdan1024 4.11.2008, 18:03
Тогда тебе не нужны дженериксы.
int, uint, single и много чего другого неявно преобразуются в дабл и т.д..

Автор: Dims 4.11.2008, 18:07
Цитата(Bogdan1024 @  4.11.2008,  18:03 Найти цитируемый пост)
int, uint, single и много чего другого неявно преобразуются в дабл

Это точно?

Автор: PashaPash 4.11.2008, 18:12
Цитата(Dims @  4.11.2008,  18:07 Найти цитируемый пост)
Это точно? 

Не совсем. С варнингом про потерю точности. 

Автор: Bogdan1024 4.11.2008, 18:14
Цитата
Это точно? 

Не, в памяти int хранится как int, если ты об этом smile
Почитай про:
Implicit Numeric Conversions Table
Тупо всё преобразуется в decimal. Большинство математических функций могут его принять в качестве параметра.

Автор: Dims 4.11.2008, 22:51
Насколько я понимаю, implicit conversion это просто неявное преобразование. То есть, например, в этой таблице есть строка From float To double. Это значит, что я могу писать

Код

double a = 2.0;
float b = 3.0f;
a = b;


и мне не надо писать так

Код

a = (double) b;


то есть, преобразовывать явно.

Но это вовсе не значит, что при вычислении 2.0f + 3.1f аргументы сперва преобразуются в double или decimal.

Короче, наверное, нельзя.

Добавлено через 1 минуту и 23 секунды
Цитата(PashaPash @  4.11.2008,  18:12 Найти цитируемый пост)
Не совсем. С варнингом про потерю точности.  

Можно пример?

Автор: Partizan 5.11.2008, 19:26
Цитата

Можно пример?


Очевидно, что в результате преобразования double -> float или double -> int произойдёт потеря точности...

Автор: Dims 6.11.2008, 21:42
Я хотел пример варнинга про потерю точности.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)