C # Generics - ограничение общего типа - PullRequest
0 голосов
/ 03 июня 2019

У меня есть следующая иерархия универсальных типов:

interface IGenericInterface<TId, TValue>
{…}

class A : IGenericInterface<long, string>

Я хочу разработать универсальный тип, который принимает IGenericInterface в качестве типа.Решение, разрешенное компилятором:

class SomeType<TType, TId, TValue> where TType : IGenericInterface<TId, TValue>

Когда мне нужно унаследовать такой тип, мне нужно указать:

class Derived : SomeType<A, long, string>

Это похоже на избыточность для указания 2-го и 3-говведите аргументы, потому что класс A уже имеет IGenericInterface<long, string>.

Есть ли способ добиться того, чего я хочу - получить класс более элегантным способом?

Ответы [ 3 ]

2 голосов
/ 03 июня 2019

Вы можете добавить промежуточный интерфейс и вместо этого установить ограничение SomeType.Что-то вроде:

interface IA : IGenericInterface<long,string> { }

class A : IA {}

class SomeType<TType> where TType : IA { }

class Derived : SomeType<A> { }
1 голос
/ 04 июня 2019

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

Функция Рослина

0 голосов
/ 05 июня 2019

Хотелось бы что-нибудь подобное? (Я думаю IEnumerable делает что-то подобное)

internal interface IGenericInterface
interface IGenericInterface <TId, TValue> : IGenericInterface
class SomeType<TType> where TType : IGenericInterface
...