Укажите Универсальное Ограничение C#, чтобы быть ClassA ИЛИ ClassB?

Существует ли способ указать что универсальный тип иметь один тип или другой тип?

public class SoftDrink<T>
    where T : TypeOne or TypeTwo
{ }
8
задан Scott 15 January 2010 в 19:25
поделиться

6 ответов

Нет, потому что в этом нет никакого смысла. Если попытаться получить доступ к функции-члену "T", как компилятор может сказать, к какому базовому классу пытаться разрешить члены?

Можно попробовать создать общий интерфейс для TypeOne и TypeTwo и иметь ограничение, указывающее на этот интерфейс? Что именно вы пытаетесь сделать?

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

Вы не можете. Лучше всего вы можете сделать, это использовать общий базовый класс для двух, или общий интерфейс, реализованный как ограничение одним типом.

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

Нет, однако, вы можете ограничить класс на общей базе или интерфейсе.

В самом CLR, ограничения (за исключением специальных, таких как новое ограничение), хранятся довольно просто: просто список идентификаторов типа, в основном. Поэтому на самом деле нет «комнаты» для логических операций, таких как вы указали ... не без пересмотра спецификации CLR, или, возможно, некоторые действительно умные и уродливые уловки языка.

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

Вы можете извлечь общую функциональность типа и 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();
    }
}
2
ответ дан 5 December 2019 в 10:03
поделиться

Вы всегда можете выполнить проверку времени выполнения против типа:

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>();
2
ответ дан 5 December 2019 в 10:03
поделиться

Вы можете наследовать интерфейс TypeOne и TypeTwo, а затем сделать следующее.

 public class SoftDrink<T>
    where T: IMyType
    {}
0
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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