Здравствуйте, varenikAA, Вы писали:
A>>int Foo<T>(T item) where T : struct, IComparable<T>
A>>Метод принимает только те T, которые value-типы и реализуют интерфейс IComparable<T>. С такими T он работать точно умеет. Что-то другое в него хрен запихнёшь.
AA>И что? Вы описали интерфейс.
Этот метод не принимает экземпляры классов, пусть даже реализующих интерфейс. Он принимает только числа и структуры, реализующие интерфейс. Это явно указано в объявлении. Для каждого подходящего типа будет сгенерирована своя версия метода.
AA>в отличии от C# 2-й версии, где надо было писать int x = Foo<Person>(null);
AA>В последних можно так: var x = Foo((Person)null);
Не понял. В режиме C# 2.0 компилятор принимает оба варианта. Они равнозначны по смыслу и результату. У литералов null и default нет типа. Если вывести его неоткуда, надо указать вручную. Иначе какая из перегрузок WriteLine должна быть вызвана и что должен вернуть подобный метод, если передать в него null без типа:
T Recreate<T>(T x) where T : new() // любые типы с конструктором без параметров
{
Console.WriteLine(x);
return new T();
}
?