Можно ли предоставить несколько ограничений в качестве параметра типа?

2

У меня следующая ситуация:

public class SomeClass {/*… */}
public interface ISomeInterface {/*… */}

public T GetFirst<T>(){/*… gets the first object of type T */}
public void AddElement<T> () where T: SomeClass, ISomeInterface {/*… */}

То, что я хотел бы сделать, это вызвать GetFirst с параметром Type, являющимся чем-то, что происходит от SomeClass и ISomeInterface.

В качестве примера, если бы у меня были следующие классы:

class A : SomeClass, ISomeInterface { }
class B : SomeClass, ISomeInterface { }
class C : SomeClass, ISomeInterface { }

И я хочу указать параметр типа GetFirst() для возврата любого из A, B или C, чтобы результат мог удовлетворять ограничению типа AddElement:

void MyFunction()
{
    t result = GetFirst<t>() where t : SomeClass, ISomeInterface;
    AddElement(result);
}

Можно ли определить несколько ограничений типа при предоставлении параметра типа в С#?

  • 2
    У вас уже есть это ограничение для AddElement - я не уверен, почему вы не просто применяете это к GetFirst ...
  • 0
    Это не ограничение типа, это тип. Вы можете поставить только один.
Показать ещё 4 комментария
Теги:
generics
types

1 ответ

1
Лучший ответ

Приведенный вами пример использования возможен только в том случае, если:

  1. у вас есть известный тип, который вы ожидаете предоставить, или
  2. С# поддерживает типы пересечений (например, как TypeScript).

#1 может выглядеть так:

void MyFunction()
{
    KnownType result = GetFirst<KnownType>();
    AddElement(result);
}

public class KnownType: SomeClass, ISomeInterface {...}

public T GetFirst<T>() => this.objects.OfType<T>().First();

#2 в настоящее время не возможно, потому что С# не имеет типов пересечения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню