2014-09-18 1 views
5

Cette question (ou plus précisément cette answer) m'a fait me demander: quelles instructions sont valables en C# comme le corps d'une fonction avec n'importe quel type de retour?Déclarations valides en tant que corps d'une fonction avec n'importe quel type de retour

Ainsi, par exemple:

public void Foo() 
{ 
    while (true) { } 
} 

public int Foo() 
{ 
    while (true) { } 
} 

Les deux fonctions sont des fonctions valides C#, même si le second ne renvoie pas vraiment une int.

Donc, je sais que les boucles infinies (par exemple for(;;)) et throw new Exception() comme throw instructions sont valides comme le corps de toute fonction, mais y at-il plus d'instructions avec cette propriété?


Mise à jour:

Une autre solution est venue à mon esprit, une récursion infinie:

public string Foo() 
    { 
     return Foo(); 
    } 
+0

Downvoter soin de commenter? – qqbenq

+0

lemme voir si ma boule de downvoter magic 8 fonctionne ... * shake shake * Hmmm, dit essayer à nouveau. * Shake * Dit que ce n'est pas un problème que vous rencontrez et semble être une question de sondage sans une réponse définitive. – Will

Répondre

3

Intéressant, un exemple qui est pas vraiment différent de votre deuxième extrait serait :

public static int Foo() 
{ 
    do {} 
    while (true); 
} 

Mais je ne pense pas que compte vraiment comme "différent".

En outre, un autre exemple de la raison pour laquelle goto est le mal:

public static int Foo() 
{ 
    start: 
    goto start; 
} 

Il est également intéressant de noter que cela ne donne une erreur de compilation:

public static int Foo() 
{ 
    bool b = true; 
    while (b) 
    { 
    } 
} 

Même si b ne change pas. Mais si vous explicitement rendre constante:

public static int Foo() 
{ 
    const bool b = true; 
    while (b) 
    { 
    } 
} 

Il fonctionne à nouveau.

+0

Oui, je ne voulais pas inclure toutes les boucles infinies possibles dans ma question, donc je ne compterais pas-comme étant différent, mais je n'ai pas pensé à la solution goto. +1 – qqbenq

+1

Je ne suis pas sûr qu'il y aurait d'autres exemples que des boucles infinies (qui ne reviendront jamais) ou des exceptions, mais je suis très intéressé de voir ce que les autres pourraient proposer. Fichier sous "trucs stupides C#" –

+0

goto evil? J'aime ça. (Juste pour noter que goto a quelques défenseurs - pas intéressé à entrer dans une discussion à ce sujet.) – RenniePet

2

est presque le même que l'exemple goto mais avec un switch impliqué:

public int Foo() 
{ 
    switch (false) 
    { 
     case false: 
     goto case false; 
    } 
} 

Je ne sais pas si cela est considéré comme un nouveau.

Il est intéressant, ce qui suit ne compilera pas:

public static int Foo(bool b) 
{ 
    switch (b) 
    { 
     case true: 
     case false: 
      goto case false; 
    } 
} 

Evidemment le compilateur n'a pas « connaissance » qu'un booléen ne peut avoir deux valeurs possibles. Vous devez couvrir explicitement tous les résultats « possibles »:

public static int Foo(bool b) 
{ 
    switch (b) 
    { 
     case true: 
     case false: 
     default: 
      goto case true; 
    } 
} 

Ou dans sa forme la plus simple:

public static int Foo(bool b) 
{ 
    switch (b) 
    { 
     default: 
      goto default; 
    } 
} 

Ouais ... Je suis ennuyé au travail aujourd'hui.

1

Non-vide & no return;

public IEnumerable Foo() 
{ 
    yield break; 
} 
+2

Bien techniquement cela retourne une énumération vide qui est le type de retour de la méthode, vous ne vous en tirerez pas sans rien retourner. Je suis sûr que les boucles infinies ou les exceptions sont la seule réponse à la question du PO. Mais +1 en évitant 'retour' :) – InBetween

Questions connexes