Quand j'essaye d'utiliser prepare("", "");, j'obtiens une erreur de compilation pourquoi? J'ai défini la valeur par défaut null quel est le compilateur de points maintenant.J'ai dit que si je n'avais mis aucune classe là-bas, nul.

Erreur CS0411 Les arguments de type pour la méthode 'Program.prepare (string, string, T)' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier les arguments de type explicitement.

class Program
{
    static void Main(string[] args)
    {
        var person = prepare("", "");
    }

    private static Person prepare<T>(string test, string Url, T postData = null) 
        where T : class
    {
        //if postdata null do somethnig (post data can be any class it is 
         //not person class)

        //than return person
    }
}

class Person 
{
    public int age { get; set; }
    public string name { get; set; }
}
0
Snr 23 mai 2018 à 14:56

6 réponses

Meilleure réponse

Le problème est que le compilateur a besoin de savoir quel est le type T, même si vous ne le fournissez pas. Imaginez que votre méthode fasse n'importe quoi avec le paramètre fourni:

private static Person prepare<T>(string test, string Url, T postData = null) 
    where T : MyClass
{
    if(T != null) t.DoSomething();
    return new Person();
}

Maintenant, le compilateur doit déduire un type pour T et vous devez donc le fournir - même si au runtime vous fournissez null pour l'argument . Que postData est en fait null une information d'exécution , le compilateur n'a pas cette information - il ne regarde que les types , pas les valeurs réelles.

En dehors de cela, il est difficile de suggérer ce dont vous avez réellement besoin. En fonction de votre code réel et de ce que vous faites avec postData, vous n'aurez peut-être même pas besoin de génériques du tout.

4
HimBromBeere 23 mai 2018 à 12:04

Le type souhaité ne peut pas être déduit car l'argument postData, qui est le seul argument de type T, est facultatif et n'est pas utilisé dans l'incovation de la méthode. De plus, la fonction générique prepare n'utilise pas postData, ce qui signifie qu'elle pourrait être supprimée.

La suppression de l'argument de la définition de prepare serait une solution du problème, donner un argument du type souhaité dans la facture serait une solution différente du problème.

4
Codor 23 mai 2018 à 12:00

J'ai dit que si je n'avais mis aucune classe, mis nul

Ce n'est pas entièrement ainsi que fonctionnent les arguments par défaut. Ils sont compilés sur le site d'appel. L'appelant peut passer null, mais ne sait toujours pas quel "type" de null.

Étant donné que vous ne fournissez pas d'argument pour T postData, le type de T ne peut pas être déduit et doit être fourni explicitement.

Donc: prepare<Person>("", "").

4
CodeCaster 23 mai 2018 à 12:00

Cette erreur signifie essentiellement que le compilateur ne peut pas déterminer quel type est supposé être votre T, vous devez donc spécifier votre type générique. Ce n'est généralement pas nécessaire, mais dans votre exemple, vous utilisez T pour spécifier le type de postData et ensuite, lorsque vous essayez d'appeler votre méthode prepare(), vous n'avez pas spécifié {{ X4}} (et vous pouvez, car c'est la valeur par défaut null), donc le compilateur ne pourra pas savoir ce que vous T tapez:

var person = prepare<YourType>("", "");

OU

YourType postData = GetPostData();
var person = prepare("", "", postData);
1
SᴇM 23 mai 2018 à 12:19

Comme vous avez marqué la méthode prepare comme générique, vous devez définir un type. Je ne vois aucune raison pour les génériques là-bas.

0
Tomas Chabada 23 mai 2018 à 12:00

L'erreur du compilateur est assez claire - puisque tout type de référence peut être null, le compilateur ne peut pas déduire le type à partir de null.

Vous devez spécifier le type comme ceci: var person = prepare<SomeTypeHere>("", "");

Évidemment, remplacez SomeTypeHere par le type approprié. Comme il est nul et que votre seule contrainte générique est where T : class, vous pouvez probablement simplement utiliser object: var person = prepare<object>("", "");

3
Zohar Peled 23 mai 2018 à 12:00