Je dois avoir le paramètre de type générique en tant qu'interface, mais je voudrais instancier le type dans la classe générique (SomeGenericType) comme suit:Problèmes avec les types abstraits et les interafaces comme paramètres de type génériques avec la contrainte new()
class Program
{
static void Main(string[] args)
{
var val = new SomeGenericType<ISomeInterface>();
Console.ReadKey();
}
}
internal class SomeGenericType<T> where T : new()
{
public SomeGenericType()
{
var test = new T();
}
}
public class SomeClass : ISomeInterface
{
public string TestVal { get; set; }
}
public interface ISomeInterface
{
string TestVal { get; set; }
}
Cela jette l'erreur de compilation suivante:
« ISomeInterface doit être un type non abstrait avec un constructeur parameterless public afin de l'utiliser comme paramètre « T » dans le type générique ou méthode SomeGenericType »
Je comprends pourquoi cela se produit, mais je me demandais s'il y avait moyen de contourner ce problème?
Merci.
L'ajout d'une contrainte supplémentaire serait-il utile? 'où T: ISomeInterface, new()'. Vous allez devoir fournir une implémentation concrète au générique, comme vous l'avez mentionné, car il n'y a pas d'autre moyen de garantir la contrainte 'new()'. – Sapph
Si vous avez Interface1, Class1: Interface1, Class2: Interface1, comment le compilateur doit-il deviner si vous voulez créer une instance de Class1 ou Class2? –