Existe-t-il quelque chose comme ] en C # pour indiquer au compilateur que la méthode ne renverra jamais de valeur?

Pour certains de mes codes, j’utilise une méthode qui ressemble à ceci:

public static void Throw(ssortingng message) where TException : Exception { throw (TException) Activator.CreateInstance(typeof(TException), message); } 

et je veux l’utiliser comme ceci (exemple simple):

 public int MyMethod() { if(...) { return 42; } ThrowHelper.Throw("Test"); // I would have to put "return -1;" or anything like that here for the code to comstack. } 

maintenant, évidemment, je sais qu’il est impossible que MyMethod ne retourne jamais rien, car il MyMethod toujours (indirectement) une exception. Mais bien sûr, je reçois la valeur du compilateur “tous les chemins ne renvoient pas de valeur”.

C’est pourquoi je demande s’il existe quelque chose comme l’atsortingbut C ++ [[noreturn]] que je pourrais utiliser pour indiquer au compilateur que le code est réellement valide ?


EDIT: La raison pour laquelle je veux utiliser une classe d’assistance de projection au lieu de lancer directement ou d’utiliser un générateur d’exceptions est la suivante :

Les membres qui lancent des exceptions ne sont pas en ligne. Le fait de déplacer l’instruction à l’intérieur du générateur peut permettre au membre d’être en ligne.

En fait, j’ai mesuré le code et je bénéficierais (un peu) de l’inline, alors je serais heureux de trouver des moyens d’y parvenir.

La façon habituelle de procéder consiste à lever une exception sans créer de twig. Quelque chose comme ça:

 public int MyMethod() { //Other code here. throw new InvalidOperationException(); } 

J’ai en fait pensé à un moyen de faire ce que tu veux:

 public class Thrower { public static TRet Throw(ssortingng message) where TException : Exception { throw (TException)Activator.CreateInstance(typeof(TException), message); } public int MyMethod() { if (new Random().Next() == 2) { return 42; } return Throw("Test"); // I would have to put "return -1;" or anything like that here for the code to comstack. } } 

Non, il est impossible de faire comprendre au compilateur que la méthode lève toujours une exception et marque ainsi la fin de l’exécution du code.

Vous êtes obligé de

  1. Appelez la méthode comme le tout dernier énoncé de votre méthode (si votre méthode est void )
  2. Ou ajoutez les instructions de contrôle de stream nécessaires après l’appel de la méthode pour terminer l’exécution, même si le code ne sera jamais réellement exécuté .

Comme vous l’avez indiqué, dans une méthode avec un type de retour, vous serez obligé d’écrire le return X; approprié return X; instruction où X est une valeur appropriée pour le type de retour de votre méthode.

Il n’y a pas moyen de contourner cela.