В шаблонах C ++ можно указать, что определенный параметр типа является значением по умолчанию. Т.е., если явно не указано иное, будет использоваться тип T.
Можно ли это сделать или приблизить на C #?
Я ищу что-то вроде:
public class MyTemplate<T1, T2=string> {}
Таким образом, экземпляр типа, который явно не указывает T2
:
MyTemplate<int> t = new MyTemplate<int>();
Было бы по существу:
MyTemplate<int, string> t = new MyTemplate<int, string>();
В конечном итоге я рассматриваю случай, когда существует довольно широко используемый шаблон, но я рассматриваю возможность расширения с помощью дополнительного параметра типа. Думаю, я мог бы создать подкласс, но мне было любопытно, есть ли другие варианты в этом ключе.
overloadable
по количеству параметров.Одно из решений - создание подклассов. Другой, который я бы использовал вместо этого, - это фабричные методы (в сочетании с ключевым словом var).
public class MyTemplate<T1,T2> { public MyTemplate(..args..) { ... } // constructor } public static class MyTemplate{ public static MyTemplate<T1,T2> Create<T1,T2>(..args..) { return new MyTemplate<T1, T2>(... params ...); } public static MyTemplate<T1, string> Create<T1>(...args...) { return new MyTemplate<T1, string>(... params ...); } } var val1 = MyTemplate.Create<int,decimal>(); var val2 = MyTemplate.Create<int>();
В приведенном выше примере
val2
это тип,MyTemplate<int,string>
а не производный от него тип.Тип
class MyStringTemplate<T>:MyTemplate<T,string>
- это не тот же тип, что иMyTemplate<T,string>
. В определенных сценариях это может вызвать некоторые проблемы. Например, вы не можете привести экземплярMyTemplate<T,string>
кMyStringTemplate<T>
.источник
вы также можете создать класс Overload следующим образом
public class MyTemplate<T1, T2> { public T1 Prop1 { get; set; } public T2 Prop2 { get; set; } } public class MyTemplate<T1> : MyTemplate<T1, string>{}
источник
MyTemplate<T1>
это другой классMyTemplate<T1, T2>
, чем ни то, ни другоеAnotherTemplate<T1>
.MyTemplate<T1, string>
не может быть назначеноMyTemplate<T1>
, что может бытьC # не поддерживает такую функцию.
Как вы сказали, вы можете создать его подкласс (если он не запечатан, и продублировать все объявления конструктора), но это совершенно другое дело.
источник
К сожалению, C # не поддерживает то, что вы пытаетесь сделать. Эту функцию было бы сложно реализовать, учитывая, что тип по умолчанию для параметра должен соответствовать общим ограничениям и, скорее всего, вызовет головную боль, когда среда CLR попытается обеспечить безопасность типов.
источник