Существует ли разумный подход к параметрам типа «по умолчанию» в C # Generics?

В шаблонах C ++ можно указать, что параметр определенного типа является значением по умолчанию. Т.е. если явно не указано, он будет использовать тип T.

Можно ли это сделать или приблизиться к C #?

Я ищу что-то вроде:

public class MyTemplate {} 

Так что экземпляр типа, который явно не указывает T2 :

 MyTemplate t = new MyTemplate(); 

Было бы существенно:

 MyTemplate t = new MyTemplate(); 

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

Подclass – лучший вариант.

Я бы подclassифицировал ваш основной родовой class:

class BaseGeneric

с определенным classом

class MyGeneric : BaseGeneric

Это упрощает сохранение вашей логики в одном месте (базовый class), но также легко обеспечить оба варианта использования. В зависимости от classа, возможно, потребуется очень немного дополнительной работы, чтобы это произошло.

Одним из решений является подclassов. Другой, который я использовал бы вместо этого, – это заводские методы (в сочетании с ключевым словом var).

 public class MyTemplate { public MyTemplate(..args..) { ... } // constructor } public static class MyTemplate{ public static MyTemplate Create(..args..) { return new MyTemplate(... params ...); } public static MyTemplate Create(...args...) { return new MyTemplate(... params ...); } } var val1 = MyTemplate.Create(); var val2 = MyTemplate.Create(); 

В приведенном выше примере val2 имеет тип MyTemplate а не тип, полученный из него.

class MyStringTemplate:MyTemplate типа class MyStringTemplate:MyTemplate не совпадает с типом MyTemplate . Это может создать определенные проблемы в определенных сценариях. Например, вы не можете использовать экземпляр MyTemplate для MyStringTemplate .

вы также можете создать class Overload as so

 public class MyTemplate { public T1 Prop1 { get; set; } public T2 Prop2 { get; set; } } public class MyTemplate : MyTemplate{} 

C # не поддерживает такую ​​функцию.

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

К сожалению, C # не поддерживает то, что вы пытаетесь сделать. Было бы трудно реализовать, учитывая, что тип по умолчанию для параметра должен будет соответствовать общим ограничениям и, скорее всего, создаст головные боли, когда CLR попытается обеспечить безопасность типа.

  • Поддерживает ли Java значения параметров по умолчанию?
  • Значение по умолчанию для типа в Runtime
  • Что означает «default» после объявления функции classа?
  • Создание (и доступ) разреженной матрицы с записями NA по умолчанию
  • Почему в параметрах C ++ последнее значение должно быть добавлено последними?
  • Как вы используете конструктор, отличный от стандартного для члена?
  • Force R не использовать экспоненциальную нотацию (например, e + 10)?
  • Таблицы стилей CSS по умолчанию для браузеров
  • Программный эквивалент по умолчанию (Тип)
  • Как загрузить пакеты в R автоматически?
  • Как открыть браузер по умолчанию в C #
  • Давайте будем гением компьютера.