Me pregunto si de alguna manera es posible especializar métodos de interfaz genéricos de alguna manera en C#? He encontrado preguntas similares, pero nada exactamente como esto. Ahora sospecho que la respuesta es "No, no puedes", pero me gustaría que se confirme.especialización de interfaz genérica C#
Lo que tengo es algo como lo siguiente.
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
}
}
¿Hay alguna manera de hacer que utilice la versión especializada de la Tienda cuando se llama a través de la interfaz? Y si no, ¿alguien sabe la razón exacta por la cual C# trata los argumentos genéricos de esta manera?
Editar: El problema podría solucionarse si no fuera así para que C# no pueda resolver los argumentos de la plantilla en más de un paso.
void Foo<T>(T t)
{
SubFoo(t);
}
void SubFoo<T>(T t)
{
Console.WriteLine("Generic");
}
void SubFoo(int t)
{
Console.WriteLine("Specific");
}
Una llamada a Foo (1) que aquí se imprimirá "genérico", además, no debe el compilador ser capaz de resolver esto? ¿O el JIT previene esto?
Posible duplicado de [Cómo hacer plantilla especialización en C#] (http://stackoverflow.com/questions/600978/how-to-do-template-specialization-in-c-sharp) –