-1
votes

Alternative à Isnullorempty pour des types nullables?

Y a-t-il un moyen d'utiliser isnullorempty avec des types nullables? Le code ci-dessus génère une erreur de construction lors de l'utilisation de isnullorempty avec string? Rundate xxx


4 commentaires

Sauf si vous utilisez actuellement l'aperçu C # 8, ? n'est pas légal à utiliser avec des types de référence. N'a rien à voir avec isnullorempty. ? est strictement autorisé à être utilisé avec des types de valeur avant c # 8.


@ Lassevågsætherkarlsen Je paierais de voir que c # 8 Aperçu fonctionnel sur VS 2010, selon les balises :)


Eh bien, les gens intelligents ont déjà piraté le studio Visual Studio, je ne les aurais pas déjà passé.


Est-ce que quelqu'un sait pourquoi on m'a donné 2 bowvotes?


4 Réponses :


1
votes

Il doit être String? Rundate = null cette ligne. Vous n'avez pas besoin de déclarer la chaîne comme type nullable type String? car String est un type de référence et par défaut sur null . Il peut simplement être xxx


0 commentaires

-2
votes

L'opérateur ? est utilisé pour déclarer des types non nullables comme nullables, et le compilateur les compile à être de type nullable . .

Le system.string est un type de référence est donc nullable.

Supprimer le ? L'opérateur et les choses doivent fonctionner.


1 commentaires

@Avimeltser c'est pas redondant. Ce n'est pas un fait. Pour que cela soit redondant, il faudrait que ce soit équivalent à ne pas le faire, et ce n'est pas le cas, car il est erroné, de sorte que fait contre elle.



2
votes

On dirait que vous avez l'intention d'utiliser ? code> comme dans TypeScript dans lequel elle implique une valeur optionnelle; Mais ce n'est pas le cas en C #. En C #, la syntaxe code> t? Code> sténographie pour nullable code>. Le nullable code> struct a une contrainte sur t code> tel t code> doit également être une structure. system.string code> est un class code> et non a struct code>, il ne peut donc pas être utilisé avec nullable code> .

Le but de nullable code> est de contenir une valeur de type t code> ou null code>, puisque struct Les valeurs basées ne peuvent pas être des références nuls elles-mêmes. Toutes les valeurs basées sur la classe code> peuvent déjà contenir des références nulles, de sorte qu'il n'a pas de sens de les utiliser avec nullable code>. P>

Essayez de réécrire votre code comme celui-ci: P>

public int MyMethod(string RunDate = null)
    {

        string sql = string.Empty;
        int rowsChanged = -1;
        if (String.IsNullOrEmpty(RunDate))
        {
            //do stuff
        }
     }


0 commentaires

0
votes

Réponse rapide, non.

Réponse plus longue, pas encore.

À l'heure actuelle, avant que ce # 8 soit libéré (puits aussi longtemps que vous n'utilisez pas l'aperçu C # 8), Le symbole ? Lorsqu'il est utilisé pour spécifier des types de référence nullables, est une erreur de syntaxe. Ignorons c # 8 pour le moment étant.

type? est traduit en nullable et le nullable < / code> struct est déclaré comme ceci: xxx

en d'autres termes, t ne peut pas être string , donc ceci, chaîne? n'est pas légal. C'est ce qui vous donne l'erreur de syntaxe.

jusqu'à ce que c # 8 est libéré, ou vous commencez à utiliser l'aperçu C # 8, vous ne pouvez rien faire, sauf supprimer le point d'interrogation.


Que se passe-t-il lorsque c # 8 est libéré?

Eh bien, type? pour Types de référence ne sera pas Traduire NULLLABLE mais plutôt sur T avec des connaissances sur la nullabilité. Pour les champs, les propriétés, les paramètres, les types de retour, essentiellement tout ce qui n'est pas une variable locale, cela se traduira par une déclaration avec un attribut indiquant la nullabilité. Pour les variables locales, le compilateur gardera une trace de la nullabilité.

donc dans ce cas, string.isnullorempty fonctionnera en fait car le paramètre sera toujours fondamentalement une chaîne, elle juste être une chaîne avec la connaissance de la nullabilité attachée à elle.


1 commentaires

Maintenant, cela sera-t-il pris en charge par Visual Studio 2010? Non, ce ne sera pas. Vous pourriez être capable de tromper le compilateur à l'aide de la bonne version, mais Intellisense sera bouchée et que vous ne pouvez rien faire à ce sujet à l'exception de la mise à niveau.