Вот такой код на C#:
using System.Collections;
using System.Reflection;
class Program
{
static void Main()
{
Foo<IEnumerable>("");
}
static void Foo<T>(T x)
{
// if(T implements IEnumerable)
if(typeof (IEnumerable).IsAssignableFrom(typeof (T)))
{
// Bar<T>(x);
typeof (Program).GetMethod(
"Bar", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(typeof (T)).Invoke(
null, new object[] {x});
}
}
static void Bar<T>(T x) where T : IEnumerable
{
}
}
Видно, что хочется сделать: динамически (в runtime) проверить, удовлетворяет ли тип-параметр некоторому констрейнту, и если удовлетворяет, то передать его в качестве типа-аргумента в другой метод, статически требующий этого констрейнта. Насколько я понимаю, система типов в C# не позволяет сделать такой трюк, и вывернуться можно только с использованием рефлексии.
Вопрос: есть ли языки (не обязательно под .NET), которые поддерживают такое на уровне системы типов? Насколько это вообще здравая идея?