Ограничение типа предназначено, чтобы использоваться с Интерфейсами. Ваш образец предлагает, чтобы Вы хотели позволить классы, которые наследовались интервалу и представляют в виде строки , который является видом ерунды. Я предлагаю, чтобы Вы разработали интерфейс, который содержит методы, Вы будете использовать в своем универсальном классе StatisticItemHits и использование, которые взаимодействуют через интерфейс как ограничение. Однако я действительно не вижу Ваших требований здесь, возможно, Вы могли отправить еще некоторые детали о своем сценарии?
Вы могли сделать StatisticItemHits<T>
абстрактный класс и создать два подкласса:
StatisticItemHitsInt : StatisticItemHits<int>{}
StatisticItemHitsString : StatisticItemHits<string>{}
Тем путем там может только быть международное и строковое представление StatisticItemHits
Как другие сказали, Вы не можете использовать ограничения типа таким образом. То, что можно сделать, должно специализироваться от базового типа следующим образом:
public class StatisticItemHits <T> { }
public class StringStatisticItemHits : StatisticItemHits<string> { }
public class IntegerStatisticItemHits : StatisticItemHits<int> { }
кроме того, поскольку Ваш базовый класс универсален, Вы не будете в состоянии использовать это для полиморфно. Если необходимо сделать, это заставляет StatisticItemHits реализовать интерфейс и использовать это для ссылочных экземпляров. Что-то как:
public class StatisticItemHits <T> : IStaticticItemHits { }
public interface IStatisticItemHits { }
Учитывая, что у Вас только есть два типа здесь, я спустился бы по маршруту OO здесь вместо этого и просто имел бы два класса для двух типов.
Дженерики лучше всего используются, где обстоятельства, при которых они могут быть применены, Вы знаете, универсальный . Они - намного меньше использования при обстоятельствах как это.
можно ограничить структурой или типами классов только, и я действительно думаю, что должны быть числовые или основанные на операторе ограничения (например, должен поддерживать + =)
, Интервал и строка действительно очень отличаются, конечно, более отличаются, чем интервал и дважды. Не имело бы большого количества смысла для универсального класса поддерживать неизменный ссылочный тип строки и тип значения интервала, также не поддерживая другие типы, более подобные ни одному из них.
Не возможный сделать это, с 'где'. Вы не можете сделать 'или'.
Вы не можете ограничить его для строкового представления и интервал от где пункт. Можно проверить его в конструктора, но это - вероятно, не хорошее место для проверки. Мой подход должен был бы специализировать класс и абстрагировать создание класса в (полу-) шаблон "фабрика":
class MyRestrictedGeneric<T>
{
protected MyRestrictedGeneric() { }
// Create the right class depending on type T
public static MyRestrictedGeneric<T> Create<T>()
{
if (typeof(T) == typeof(string))
return new StringImpl() as MyRestrictedGeneric<T>;
if (typeof(T) == typeof(int))
return new IntImpl() as MyRestrictedGeneric<T>;
throw new InvalidOperationException("Type not supported");
}
// The specialized implementation are protected away
protected class StringImpl : MyRestrictedGeneric<string> { }
protected class IntImpl : MyRestrictedGeneric<int> { }
}
Этот путь можно ограничить использование класса, чтобы просто представить в виде строки и интервал внутренне внутренняя часть класс.