Доброго времени суток.
Есть Класс.
///
public class TelNumber
Я хочу, чтобы тип телефона мог быть мог быть либо string, либо TypeTelNumber
Пишу так:
///
Вопрос: Ругается на I, мол не такого типа (понятно и логично). Но как тогда сделать задуманное?
Ответ
Ваш код where T : string означает, что Т может быть только string, поскольку класс System.String объявлен как sealed
Чтобы скомпилировалось, достаточно объявить параметр I
public class TelNumber where T : string, TypeTelNumber
{
///
Но это не то, что вам нужно: в C# нет discriminated union-типов. Код where T : string, TypeTelNumber означает, что T должен быть одновременно и string, и TypeTelNumber. А поскольку string есть sealed, это означает, что ваш код не скомпилируется ни с каким типом.
Имеет смысл объявить просто два отдельных класса, реализующих общий интерфейс.
interface class ITelNumber
class StringTelNumber : ITelNumber
class CustomTelNumber : ITelNumber
А ограничения на типы налагать уже вашей бизнес-логикой, а не системой типов: в C# система типов такого (пока) не умеет.
Комментариев нет:
Отправить комментарий