Информация об изменениях

Сообщение Re[15]: Ну спасибо за развёрнутый ответ.. от 24.10.2019 14:11

Изменено 24.10.2019 14:13 alexzzzz

Re[15]: Ну спасибо за развёрнутый ответ..
Здравствуйте, 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 нет типа. Если вывести его неоткуда, надо указать вручную. Иначе что должен вернуть подобный метод, если передать в него null без типа:
T Recreate<T>(T x) where T : new() // любые типы с конструктором без параметров
{
    Console.WriteLine(x);
    return new T();
}
?
Re[15]: Ну спасибо за развёрнутый ответ..
Здравствуйте, 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();
}
?