Интересно, можно ли каким-либо образом специализировать методы интерфейса в С#? Я нашел похожие вопросы, но ничего подобного. Теперь я подозреваю, что ответ "Нет, вы не можете", но я хотел бы, чтобы это подтвердилось.
У меня есть что-то вроде следующего.
public interface IStorage
{
void Store<T>(T data);
}
public class Storage : IStorage
{
public void Store<T>(T data)
{
Console.WriteLine("Generic");
}
public void Store(int data)
{
Console.WriteLine("Specific");
}
}
class Program
{
static void Main(string[] args)
{
IStorage i = new Storage();
i.Store("somestring"); // Prints Generic
i.Store(1); // Prints Generic
Storage s = (Storage)i;
s.Store("somestring"); // Prints Generic
s.Store(1); // Prints Specific
}
}
Можно ли использовать специализированную версию Store при вызове через интерфейс? А если нет, то кто-нибудь знает точную причину, почему С# рассматривает общие аргументы таким образом?
Изменить: Проблема может быть решена, если это не так, что С# не может разрешить аргументы шаблона более чем на один шаг.
void Foo<T>(T t)
{
SubFoo(t);
}
void SubFoo<T>(T t)
{
Console.WriteLine("Generic");
}
void SubFoo(int t)
{
Console.WriteLine("Specific");
}
Вызов Foo (1) здесь также напечатает "Generic", не должен ли компилятор разрешить это? Или JIT предотвращает это?