Je ne peux pas donner une réponse précise quant à savoir si la spécification C#, mais je n'autorise peut fournir des exemples. D'abord, que faire si vous voulez une méthode pour retourner une interface? Dans vos exemples vous avez utilisé List<int>
mais que faire si vous l'avez changé en IList<int>
?Ou considérez cet exemple simplifié:
public interface IFoo
{
void Bar();
}
public class Foo1 : IFoo
{
public Foo1() { }
public void Bar() => Console.WriteLine("Foo1.Bar");
}
public class Foo2 : IFoo
{
private Foo2() { }
public static Foo2 Create => new Foo2();
public void Bar() => Console.WriteLine("Foo2.Bar");
}
Vous ne pouvez pas créer une instance d'une interface. Donc, cela est faux:
public IFoo BadFooCreate() => new IFoo(); // won't compile
Mais cela fonctionnerait, mais on peut se poser la question de savoir comment le compilateur sais que vous voulez Foo1 être le IFoo particulier qui est retourné:
public IFoo GoodFooCreate() => new Foo1(); // compiles okay
Cela fonctionne aussi:
public IFoo GoodFooCreate() => Foo2.Create(); // compiles okay
Mais depuis foo2 a un constructeur privé, cela ne fonctionne pas:
public IFoo BadFoo2Create() => new Foo2(); // won't compile
Un autre ensemble d'exemples tourne autour des classes abstraites. Tenir compte:
public abstract class Animal
{
public Animal() { }
public virtual string Name => "Generic Animal";
public abstract string Speak();
}
public class Dog : Animal
{
public override string Name => "Dog";
public override string Speak() => "Bark";
}
public class Cat : Animal
{
public override string Name => "Cat";
public override string Speak() => "Meow";
}
Ce serait une erreur parce que vous ne pouvez pas créer une instance d'une classe abstraite:
public Animal BadAnimalCreate() => new Animal(); // won't compile
mais cela fonctionne parfaitement bien:
public Animal GoodAnimalCreate() => new Dog(); // compiles okay
bien qu'encore une fois si la compilateur devaient créer automatiquement un type pour un programmeur paresseux, comment le compilateur sait-il utiliser Dog() et pas Cat()? Laisser le compilateur choisir en votre nom empiète sur la violation du Principle of Least Astonishment. Il y a de la paresse et ensuite on abdique votre responsabilité.
J'utilise 'List' à titre d'exemple - la question est valable pour tout type, générique ou non. –
Cela semble être une question X-Y. Pourquoi veux-tu faire cela? Quelle est l'utilisation prévue? –
Que faire si le type de retour de la méthode était une classe abstraite? –