112 votes

Une propriété ou un indexeur ne peut pas être passé en tant que paramètre out ou ref

Je reçois l'erreur ci-dessus et je n'arrive pas à la résoudre. J'ai fait quelques recherches mais je n'arrive pas à m'en débarrasser.

Scénario :

J'ai de la classe BudgetAllocate dont la propriété est budget qui est de double type.

Dans mon dataAccessLayer ,

C'est ce que j'essaie de faire dans l'une de mes classes :

double.TryParse(objReader[i].ToString(), out bd.Budget);

Ce qui provoque cette erreur :

Une propriété ou un indexeur ne peut pas être passé comme paramètre out ou ref à la commande moment de la compilation.

J'ai même essayé ceci :

double.TryParse(objReader[i].ToString().Equals(DBNull.Value) ? "" : objReader[i].ToString(), out bd.Budget);

Tout le reste fonctionne correctement et les références entre les couches sont présentes.

8voto

DanDan Points 426

Il s'agit d'un très ancien message, mais je modifie ce qui a été accepté, car il existe une façon encore plus pratique de procéder que je ne connaissais pas.

Il s'agit d'une déclaration en ligne qui a peut-être toujours été disponible (comme dans les déclarations d'utilisation) ou qui a peut-être été ajoutée avec C#6.0 ou C#7.0 pour de tels cas, je n'en suis pas sûr, mais elle fonctionne de toute façon comme un charme :

Inetad de cette

double temp;
double.TryParse(objReader[i].ToString(), out temp);
bd.Budget = temp;

utiliser ceci :

double.TryParse(objReader[i].ToString(), out double temp);
bd.Budget = temp;

2voto

astander Points 83138

Le budget est donc une propriété, n'est-ce pas ?

Il est préférable de la définir dans une variable locale, puis de lui attribuer la valeur de la propriété.

double t = 0;
double.TryParse(objReader[i].ToString(), out t); 
bd.Budget = t;

0voto

clamchoda Points 1430

En général, lorsque j'essaie de faire cela, c'est parce que je veux définir ma propriété ou la laisser à sa valeur par défaut. Avec l'aide de cette réponse y dynamic nous pouvons facilement créer une méthode d'extension de la chaîne de caractères pour que tout soit simple et cohérent.

public static dynamic ParseAny(this string text, Type type)
{
     var converter = TypeDescriptor.GetConverter(type);
     if (converter != null && converter.IsValid(text))
          return converter.ConvertFromString(text);
     else
          return Activator.CreateInstance(type);
}

Utiliser comme suit ;

bd.Budget = objReader[i].ToString().ParseAny(typeof(double));

// Examples
int intTest = "1234".ParseAny(typeof(int)); // Result: 1234
double doubleTest = "12.34".ParseAny(typeof(double)); // Result: 12.34
decimal pass = "12.34".ParseAny(typeof(decimal)); // Result: 12.34
decimal fail = "abc".ParseAny(typeof(decimal)); // Result: 0
string nullStr = null;
decimal failedNull = nullStr.ParseAny(typeof(decimal)); // Result: 0

En option

Par ailleurs, s'il s'agit d'une SQLDataReader vous pouvez également utiliser GetSafeString afin d'éviter les exceptions nulles de la part du lecteur.

public static string GetSafeString(this SqlDataReader reader, int colIndex)
{
     if (!reader.IsDBNull(colIndex))
          return reader.GetString(colIndex);
     return string.Empty;
}

public static string GetSafeString(this SqlDataReader reader, string colName)
{
     int colIndex = reader.GetOrdinal(colName);
     if (!reader.IsDBNull(colIndex))
          return reader.GetString(colIndex);
     return string.Empty;
}

Utiliser comme suit ;

bd.Budget = objReader.GetSafeString(i).ParseAny(typeof(double));
bd.Budget = objReader.GetSafeString("ColumnName").ParseAny(typeof(double));

0voto

J'ai eu le même problème (il y a 5 minutes) et je l'ai résolu en utilisant des propriétés à l'ancienne avec getter et setter, qui utilisent des variables. Mon code :

public List<int> bigField = new List<int>();
public List<int> BigField { get { return bigField; } set { bigField = value; } }

J'ai donc utilisé la variable bigField. Je ne suis pas programmeur, si j'ai mal compris la question, je suis vraiment désolé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X