L'Argument de type "void" n'est pas assignable à paramètre " type de Système.L'Action"
C'est mon code de test:
class PassingInActionStatement
{
static void Main(string[] args)
{
var dsufac = new DoSomethingUsefulForAChange();
dsufac.Do(WriteToConsole);
dsufac.Do2(s => WriteToConsoleWithSomethingExtra("Test"));
dsufac.Do(WriteToConsoleWithSomethingExtra("Test")); //Does not compile
}
internal static void WriteToConsole()
{
Console.WriteLine("Done");
}
internal static void WriteToConsoleWithSomethingExtra(String input)
{
Console.WriteLine(input);
}
}
internal class DoSomethingUsefulForAChange
{
internal void Do(Action action)
{
action();
}
internal void Do2(Action<String> action)
{
action("");
}
}
Les 2 premiers appels de travail, mais je me demande pourquoi le 3ème n'a pas. Je n'ai pas envie de le code à l'intérieur de Do2 comme il semble étrange que j'ai type type action("")
là pour le faire fonctionner.
Quelqu'un pourrait-il expliquer les 2 choses que je ne comprends pas, s'il vous plaît?
- Pourquoi je ne peux pas écrire à la troisième ligne comme ça avec l'appel Ne
- Pourquoi je dois écrire action("") afin de le faire fonctionner dans Do2
J'ai toujours marqué les réponses qui m'ont aidé. Si il n'y a pas une solution qui apporte quelque chose d'utile, je ne marquent pas jusqu'à ce que je reçois la réponse qui m'aide.
OriginalL'auteur Nyla Pareska | 2010-08-02
Vous devez vous connecter pour publier un commentaire.
appelle la fonction première (
WriteToConsoleWithSomethingExtra("Test")
), puis tente de passer le résultat dansDo
. Depuis il n'y a pas de résultat (void
), il n'est pas possible.Ce que vous voulez vraiment est-ce:
La partie intérieure déclare une fonction qui ne prend rien (le
() =>
bits), qui appelleWriteToConsoleWithSomethingExtra("Test")
lors de l'exécution. Puis votredsufac.Do
appel reçoivent une action, comme il attend.Comme pour
Do2
- vous avez déclaré que la prise deAction<String>
, ce qui signifie queaction
est une fonction qui prend un argument. Vous devez passer une chaîne de caractères. Cette chaîne peut être vide, comme dans votreaction("")
exemple, ou il peut être transmis de l'extérieur, comme dans quelque chose comme ceci:Merci pour le supplément de mise à jour.
OriginalL'auteur Roman Starkov
Dans votre code
est interprété comme suit
Que le type de retour de WriteToConsoleWithSomethingExtra("Test") est nulle, de sorte que vous ne peut pas vraiment passer à dsufac.Faire(). C'est pourquoi ses pas l'obtention de la compilation. Mais pour la première
vous n'êtes pas à l'appel de la fonction, plutôt que vous êtes de passage comme une méthode de groupe, qui sera plus tard appelé à le Faire() la méthode de dsufac objet. Mais si vous voulez écrire à la 3e ligne, le 1er, vous pouvez utiliser
OriginalL'auteur Anindya Chatterjee
Action
(c'est à dire la méthode qui prennent aucun paramètre et ne retourne aucune valeur). DoncWriteToConsoleWithSomethingExtra
n'est pas valide fit - prend un paramètre de chaîne.Action<T>
(c'est à dire la méthode qui prend un paramètre T et ne retourne aucune valeur). C'est pourquoi, lorsque vous appelez le délégué/action, vous devez fournir un paramètre de type T, voici Chaîne.OriginalL'auteur Gishu
Je faisais quelque chose comme ça pendant un moment dans une application Silverlight. Maintenant, lorsqu'il s'exécute, une partie de la cassure.
Ce qui se passe dans une Silverlight fenêtre enfant:
OriginalL'auteur Roger