10
votes

Comment traduire VB.NET'S CTYPE () en C #?

J'ai ce segment de code dans vb.net:

CType(pbImageHolder.Image, Bitmap).SetPixel(curPoint.X, curPoint.Y, Color.Purple)

p>Quel est le code approprié en C #? p> p>


0 commentaires

4 Réponses :


9
votes
((Bitmap)pbImageHolder.Image).SetPixel(curPoint.X, curPoint.Y, Color.Purple)

2 commentaires

Avec (((bitmap) pbimageholder.Image) Votre tentative de lancer PBIMageholder au bitmap, ce qui ne fonctionnera probablement pas. Ce qui suit va jeter l'image: (bitmap) (pbimageholder.Image)


@ Dennistraub: Vous avez tort, voir C # Spécification de la langue, section 7.3.1 "Prédication de l'opérateur et associativité" ( go.microsoft.com/fwlink/?LinkID=199552 ). Opérateur d'accès membre "." a la priorité sur l'opérateur de distribution, donc, des expressions telles que (typewichcasto) variable.Member évaluera de cette façon: 1) Accès membre de variable d'abord; 2) Ensuite, lancez membre sur typeewichcastto .



24
votes

dans vb.net CTYPE (objet, type) code> jette un objet à un type spécifique.

Il y a deux façons de l'accomplir en C #: P>

Bitmap image = (Bitmap)(pbImageHolder.Image);
image.SetPixel(curPoint.X, curPoint.Y, Color.Purple);


4 commentaires

1) La première option que vous avez fournie nécessite fortement une vérification nulle; comme n'est pas destiné aux cas d'utilisation sans vérification null du résultat et ne peut pas être positionné comme équivalent direct de VB CTYPE opérateur; 2) La deuxième option a des supports inutiles, voir la réponse à votre commentaire ci-dessous. Donc, vécu en bas, surtout pour comme Utilisation de négligence.


Comme Dennis dit, n'utilisez pas comme dans des cas comme celui-ci. Cela pourrait conduire à un NullReferenceException .


@Dennis est un bon conseil, mais vous n'avez pas besoin de bowervote uniquement à cause de cela. La réponse est toujours utile


CTYPE ne jette pas d'objet, il le convertit. DirectCast ou trycast sont les opérations de coulée. Par exemple, atteger = ctype ("1", entier) est valide, mais sombre i comme integer = DirectCast ("1", entier) n'est pas



2
votes

HI Ceci est le code après la conversion VB sur C # CODE:

((Bitmap)pbImageHolder.Image).SetPixel(curPoint.X, curPoint.Y, Color.Purple);


0 commentaires

-1
votes

Je suis surpris que aucune des réponses de ce sujet ne soit correcte, j'ai donc décidé de poster ici. Vous pouvez vérifier ce qui se passe en décompilant un programme VB.NET. La réponse dépend du type converti en.

pour les types de référence: p>

DIM VALEUR = CTYPE (x, référencétype) CODE> P>

VALEUR VAR = (référencétype) x; code> p>

pour les structures: p>

DIM VALEUR = CTYPE (x, Structype) code> P> valeur var = (x! = null)? ((Structype) x): défaut (Structype); code> p>

pour les mises prédéfinies: p>

DIM VALEUR = CDBL (x) CODE> p>

varume = microsoft.visalbasic.compilerservices.conversions.todouble (x) code> p>

qui ressemble à ceci: p>

internal static double ToDouble(object Value, NumberFormatInfo NumberFormat)
{
    if (Value == null)
    {
        return 0.0;
    }
    IConvertible convertible = Value as IConvertible;
    if (convertible != null)
    {
        switch (convertible.GetTypeCode())
        {
        case TypeCode.Boolean:
            if (Value is bool)
            {
                return 0 - (((bool)Value) ? 1 : 0);
            }
            return 0 - (convertible.ToBoolean(null) ? 1 : 0);
        case TypeCode.SByte:
            if (Value is sbyte)
            {
                return (sbyte)Value;
            }
            return convertible.ToSByte(null);
        case TypeCode.Byte:
            if (Value is byte)
            {
                return (int)(byte)Value;
            }
            return (int)convertible.ToByte(null);
        case TypeCode.Int16:
            if (Value is short)
            {
                return (short)Value;
            }
            return convertible.ToInt16(null);
        case TypeCode.UInt16:
            if (Value is ushort)
            {
                return (int)(ushort)Value;
            }
            return (int)convertible.ToUInt16(null);
        case TypeCode.Int32:
            if (Value is int)
            {
                return (int)Value;
            }
            return convertible.ToInt32(null);
        case TypeCode.UInt32:
            if (!(Value is uint))
            {
                return convertible.ToUInt32(null);
            }
            return (uint)Value;
        case TypeCode.Int64:
            if (Value is long)
            {
                return (long)Value;
            }
            return convertible.ToInt64(null);
        case TypeCode.UInt64:
            if (!(Value is ulong))
            {
                return convertible.ToUInt64(null);
            }
            return (ulong)Value;
        case TypeCode.Decimal:
            if (Value is decimal)
            {
                return convertible.ToDouble(null);
            }
            return Convert.ToDouble(convertible.ToDecimal(null));
        case TypeCode.Single:
            if (Value is float)
            {
                return (float)Value;
            }
            return convertible.ToSingle(null);
        case TypeCode.Double:
            if (Value is double)
            {
                return (double)Value;
            }
            return convertible.ToDouble(null);
        case TypeCode.String:
            return ToDouble(convertible.ToString(null), NumberFormat);
        }
    }
    throw new InvalidCastException(Utils.GetResourceString("InvalidCast_FromTo", Utils.VBFriendlyName(Value), "Double"));
}


0 commentaires