А как насчет необязательных параметров универсального типа в C# 5.0?[закрыто]

StackOverflow https://stackoverflow.com/questions/2541659

  •  23-09-2019
  •  | 
  •  

Вопрос

Просто мысль.

Разве не было бы полезно иметь необязательные параметры типа в C#?

Это сделало бы жизнь проще.Мне надоело иметь несколько классов с одним и тем же именем, но с разными параметрами типа.Также VS не поддерживает вот это (имена файлов):-)

Это, например, устранило бы необходимость в неуниверсальном IEnumerable:

interface IEnumerable<out T=object>{
  IEnumerator<T> GetEnumerator()
}

Что вы думаете?

Это было полезно?

Решение

Я определенно за это.

В настоящее время я пишу вспомогательные методы для разных сценариев, в которых хочу передавать ссылки на разные члены и методы классов.Для этого я беру, например, Expression<Func<TIn, TOut>> в качестве аргумента помощника (это позволяет мне получить доступ к методу с помощью лямбда-выражения, сохраняя тем самым строго типизированное значение).

НО. В настоящее время мне нужно определить новый вспомогательный метод для каждого разного количества входных аргументов, поскольку мне нужно иметь для него разное количество общих аргументов.Вместо

HelperMethod<TIn>(Expression<Action<TIn>> arg) // Yes, C# can distinguish
HelperMethod<TOut>(Expression<Func<TOut>> arg) // these two from eachother
HelperMethod<TIn, TOut>(Expression<Func<TIn, TOut>> arg)
HelperMethod<TIn1, TIn2, TOut>(Expression<Func<TIn1, TIn2, TOut>> arg)
// etc

Я мог бы обойтись максимум двумя способами:

HelperMethod<TIn>(Expression<Action<TIn>> arg)
HelperMethod<TOut, TIn1 = DummyType, ...>(Expression<Func<TIn1, ..., TOut> arg)

В моем случае это позволило бы избежать большого количества дублирования кода...

Другие советы

Каково будет основное использование этой языковой функции?Я вижу, что это может помочь с некоторыми административными задачами, такими как имена файлов, меньше ввода текста и тому подобное, но помимо этого я не понимаю, насколько это было бы полезно.

Кроме того, эта функция значительно усложнила бы любые универсальные ограничения, которые можно было бы наложить на параметр универсального типа, а сам тип по умолчанию должен был бы сам функционировать как своего рода универсальное ограничение.

Я думаю, что это усложнило бы язык, не принеся никакой реальной пользы разработчику.

Мне непонятно, что именно вы предлагаете.В настоящее время могут существовать типы с одинаковым именем, но с разными параметрами типа, но которые никак не связаны наследованием. Что тогда будет делать ваше предложение?

Более того, если бы библиотека базовых классов была переработана с нуля, почти наверняка не было бы неуниверсального интерфейса IEnumerable — он существует только потому, что CLR не поддерживала дженерики, когда интерфейс был представлен, и универсальный интерфейс наследуется от него. только для того, чтобы устаревший код продолжал работать.Недавно объявленные классы создаются для среды CLR, которая поддерживает дженерики, поэтому эта проблема больше не актуальна.

Недавно я наткнулся на случай, в котором можно было бы использовать что-то подобное, но не совсем.У меня был метод, который выполняет своего рода преобразование между классом A и связанным с ним классом AChild и классом B и классом BChild.Обычно пара A/AChild была такой же, как B/BCild, но иногда A была базовым классом B, а ACChild — базовым классом BChild.

Было бы неплохо иметь возможность сказать, что мой параметр типа TB по умолчанию имеет значение TA, а TBChild по умолчанию имеет значение TAChild.

Обратите внимание, что это была ситуация, в которой необходимо было записать параметры типа, поскольку вывод не работал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top