Дженерики C#, ограничьте к определенным структурам

Я использую Терминалы для удаленного соединения через Telnet, RDC, SSH... Объединения наиболее используемые протоколы в одной программе.

URL: http://www.codeplex.com/Terminals

5
задан Ben 29 November 2009 в 12:35
поделиться

4 ответа

Нет, поскольку структура запечатана (вы не можете создать подкласс ValueType).

Вместо этого подумайте о том, чтобы ваши структуры реализуют интерфейс, а затем используйте его как ограничение, например:

string Add (значение объекта, срок действия T), где T: struct, IMyInterface

7
ответ дан 18 December 2019 в 10:45
поделиться

Я полагаю, что перегрузка - ваш лучший вариант здесь:

string Add(object value, MyStruct1 expiration) {...}
string Add(object value, MyStruct2 expiration) {...}

Это даже более уместно, так как вы не можете создать подкласс структуры, поэтому только жизнеспособный T в вашем примере будет MyStruct1 и MyStruct2 - тогда также могут быть определенные методы.

Возврат к ограничению дженериков несколькими цитируемыми типами; не совсем - и даже если бы они были, название «Добавить» предполагает, что вы хотели бы использовать поддержку операторов, которой также нет в C # (3.0).

Однако в C # 4.0, динамический может быть здесь вариантом - это действует как оптимизированная форма утиной печати; вы не получите поддержки компилятора (проверки и т. д.), но она должна работать. Вы должны привести к dynamic внутри метод:

string Add<T>(object value, T expiration) where T : struct {
    dynamic valueDyn = value;
    valueDyn += expiration; // or similar
    // more code
}

Другой вариант (в .NET 3.

5
ответ дан 18 December 2019 в 10:45
поделиться

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

-3
ответ дан 18 December 2019 в 10:45
поделиться

Назначение универсальных шаблонов - создавать методы и типы, которые являются универсальными , отсюда и название. Если у вас есть только два возможных аргумента типа, просто напишите два метода.

Помните также, что универсальные шаблоны C # не являются шаблонами C ++. Когда вы вызываете метод для параметра типа, скажем, этот вызов метода будет точно таким же вызовом для каждой конструкции параметра типа. Это общий . Это не шаблон, в котором компилятор компилирует код два, три, тысячи раз, по одному для каждого аргумента типа, и заново определяет для каждого из них, что такое вызов метода.

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

7
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: