Здравствуйте, копатыч, Вы писали:
К>Как правильно определить операторы сравнения для generic ?
Поскольку обобщенный тип должен быть скомпилирован в месте определения (а не использования, как в C++) для параметров-типов в обобщенных классах нельзя использовать операторы сравнения, так же как и + — * / и т.д. так как компилятор не может определить применимы ли эти операторы к неизвестному типу.
Для этих целей используют ключевое словое where, налагающее ограничение (constraint) на параметр обобщенного типа и интерфейсы типа IComparable
К> public static bool operator >(TestClass<T> x, TestClass<T> y) К> { К> return !(x<y); К> } К> //........................
Кстати, в общем случае этот код не верен. Если А не меньше Б то это может значить как больше так и просто равно.
Как правильно определить операторы сравнения для generic ?
Что не так и куда копать?
class TestClass<T>
{
T m_Value;
public static bool operator <(TestClass<T> x, TestClass<T> y)
{
//error! Operator '<' cannot be applied to operands of type 'T' and 'T'
//Вроде должен вызыватся свой < для T .... а вот если уже такого нет, то тогда alarm ... IMHOreturn x.m_Value < y.m_Value ;
}
public static bool operator >(TestClass<T> x, TestClass<T> y)
{
return !(x<y);
}
//........................
}
Здравствуйте, Аноним, Вы писали:
AB>>Поскольку обобщенный тип должен быть скомпилирован в месте определения (а не использования, как в C++) А>Что значит в месте определения ,а не использования, как в C++? Можете, пожалужста, подробнее?
. Там описаны отличия шаблонов C++ от обощенных типов .NET.
Теперь кратко. Цитата: "Обобщенные типы .NET компилируются в MSIL так же как и любой другой класс".
В этой фразе и зарыта вся разница. Когда Вы пишете шаблон С++, то компилятор проводит лишь поверхностный анализ правильности синтаксиса шаблона, а вот создание кода и, соответственно, полная синтаксическая проверка проводиться при первом использовании шаблона. Т.е. когда Вы впервые объявляете переменную (например, list<int> li; ) или параметр функции или ещё чего. В результате шаблоны допускают использование любых операций в шаблоне, но при этом не могут быть помещены в библиотеку (двоичную) и требуют своего исходного кода при компиляции. Т.е. Вы не можете использовать шаблон С++ в других языках.
В отличие, обобщенные типы .NET компилируются сразу в MSIL. Генерация конкретного машинного кода производиться JIT-компилятором при первом использовании. Это дает возможность не передавать исходный код обобщенного класса на сторону, позволяет использовать обобщение в языках, отличных от того на котором оно написано, но накладывает ограничение — правильность кода обобщения должна быть проверена на этапе компиляции обобщенного типа. Т.е. компилятор для генерации MSIL-кода должен быть уверен, что _все_ операции производимые внутри кода обобщения допустимы и должен знать какие функции он при этом будет вызывать.