Существует ли способ указать что универсальный тип иметь один тип или другой тип?
public class SoftDrink<T>
where T : TypeOne or TypeTwo
{ }
Нет, потому что в этом нет никакого смысла. Если попытаться получить доступ к функции-члену "T", как компилятор может сказать, к какому базовому классу пытаться разрешить члены?
Можно попробовать создать общий интерфейс для TypeOne и TypeTwo и иметь ограничение, указывающее на этот интерфейс? Что именно вы пытаетесь сделать?
Вы не можете. Лучше всего вы можете сделать, это использовать общий базовый класс для двух, или общий интерфейс, реализованный как ограничение одним типом.
Нет, однако, вы можете ограничить класс на общей базе или интерфейсе.
В самом CLR, ограничения (за исключением специальных, таких как новое ограничение), хранятся довольно просто: просто список идентификаторов типа, в основном. Поэтому на самом деле нет «комнаты» для логических операций, таких как вы указали ... не без пересмотра спецификации CLR, или, возможно, некоторые действительно умные и уродливые уловки языка.
Вы можете извлечь общую функциональность типа и TypetWo в базовый класс или интерфейс и использовать этот базовый класс или интерфейс в качестве ограничение. В противном случае, как бы компилятор знал, что это может сделать с T
?
public interface IBelch
{
void Belch();
}
public class Coke : IBelch
{
public void Belch()
{
}
}
public class GatorAde : IBelch
{
public void Belch()
{
}
}
public class SoftDrink<T>
where T : IBelch
{
public void DrinkFast(T drink)
{
drink.Belch();
}
}
Вы всегда можете выполнить проверку времени выполнения против типа:
class TypeOne
{
int _integer = 0;
}
class TypeTwo
{
int _integer = 3;
}
class TypeThree
{
}
class SoftDrink<T>
{
public SoftDrink()
{
if (typeof(T) != typeof(TypeOne) && typeof(T) != typeof(TypeTwo))
{
throw (new Exception("Sorry, but T must be TypeOne or TypeTwo"));
}
}
}
//this works:
SoftDrink<TypeOne> t1 = new SoftDrink<TypeThree>();
//throws an exception:
SoftDrink<TypeThree> t3 = new SoftDrink<TypeThree>();
Вы можете наследовать интерфейс TypeOne и TypeTwo, а затем сделать следующее.
public class SoftDrink<T>
where T: IMyType
{}