Страницы

Поиск по вопросам

среда, 9 января 2019 г.

Работа со вложенными Generic - типами

Доброго времени суток.
Есть Класс.
///

/// Класс, являющийся "Номер Телефона". /// /// Тип, в котором хранится Тип Номера Телефона. // Кстати string не может быть ограничителем.
public class TelNumber where T : string { /// /// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public TypeTelNumber TypeTelNumber { get; set; } }
Я хочу, чтобы тип телефона мог быть мог быть либо string, либо TypeTelNumber
Пишу так:
/// /// Класс, являющийся "Номер Телефона". /// /// Тип, в котором хранится Тип Номера Телефона. public class TelNumber where T : string, TypeTelNumber { /// /// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public T TypeTelNumber { get; set; } }
Вопрос: Ругается на I, мол не такого типа (понятно и логично). Но как тогда сделать задуманное?


Ответ

Ваш код where T : string означает, что Т может быть только string, поскольку класс System.String объявлен как sealed
Чтобы скомпилировалось, достаточно объявить параметр I
public class TelNumber where T : string, TypeTelNumber { ///

/// ID Номер Телефона. /// public int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// public T TypeTelNumber { get; set; } }
Но это не то, что вам нужно: в C# нет discriminated union-типов. Код where T : string, TypeTelNumber означает, что T должен быть одновременно и string, и TypeTelNumber. А поскольку string есть sealed, это означает, что ваш код не скомпилируется ни с каким типом.
Имеет смысл объявить просто два отдельных класса, реализующих общий интерфейс.
interface class ITelNumber { /// /// ID Номер Телефона. /// int TelNumberID { get; set; } /// /// Тип Номер Телефона. /// T TypeTelNumber { get; set; } }
class StringTelNumber : ITelNumber { public int TelNumberID { get; set; } public string TypeTelNumber { get; set; } }
class CustomTelNumber : ITelNumber> { public int TelNumberID { get; set; } public TypeTelNumber TypeTelNumber { get; set; } }
А ограничения на типы налагать уже вашей бизнес-логикой, а не системой типов: в C# система типов такого (пока) не умеет.

Комментариев нет:

Отправить комментарий