2011-08-12 4 views
8

He usado métodos de extensión en numerosas ocasiones y no me he encontrado con este problema. ¿Alguien tiene alguna idea de por qué esto arroja un error?Error al redondear la extensión en decimal: no se puede acceder con una referencia de instancia; califíquelo con un nombre de tipo en su lugar

/// <summary> 
/// Rounds the specified value. 
/// </summary> 
/// <param name="value">The value.</param> 
/// <param name="decimals">The decimals.</param> 
/// <returns></returns> 
public static decimal Round (this decimal value, int decimals) 
{ 
    return Math.Round(value, decimals); 
} 

Uso:

decimal newAmount = decimal.Parse("3.33333333333434343434"); 
this.rtbAmount.Text = newAmount.Round(3).ToString(); 

newAmount.Round (3) está lanzando el error del compilador:

Error 1 Member 'decimal.Round(decimal)' cannot be accessed with an instance  reference; qualify it with a type name instead 

Respuesta

8

El conflicto aquí es un conflicto entre su método de extensión y decimal.Round. La solución más simple aquí, como ya se descubrió, es usar un nombre diferente. Los métodos en el tipo siempre tienen prioridad sobre los métodos de extensión, incluso hasta el punto de entrar en conflicto con los métodos static.

+0

Gracias! Además, vea [Geert Verhoeven] (http://geertverhoeven.blogspot.com/) [Comportamiento extraño con métodos de extensión] (http://geertverhoeven.blogspot.com/2008/01/strange-behavior-with-extension -methods.html). –

2

Lo siento por responder a mi propia pregunta tan rápido. Un segundo después de publicar esto, caí en la cuenta de que tal vez al compilador no le gustaba el término "Ronda". Así que lo cambié a "RoundNew" y funcionó. Algún tipo de conflicto de nombres supongo ...'

Sin errores más:

/// <summary> 
/// Rounds the specified value. 
/// </summary> 
/// <param name="value">The value.</param> 
/// <param name="decimals">The decimals.</param> 
/// <returns></returns> 
public static decimal RoundNew (this decimal value, int decimals) 
{ 
    return Math.Round(value, decimals); 
} 

decimal newAmount = decimal.Parse("3.33333333333434343434"); 
this.rtbAmount.Text = newAmount.RoundNew(3).ToString(); 
+0

¿Es posible que nombrar el método de extensión "Redondear" de alguna manera esté en conflicto con el método Math.Round? Esto parece más un error con el compilador que un error verdadero. – mservidio

+2

El conflicto es decimal.Round: http://msdn.microsoft.com/en-us/library/k4e2bye2.aspx - no es un error del compilador –

+0

Oh, lo he pasado por alto totalmente. Por favor, envíe una respuesta para que pueda darle crédito. – mservidio

Cuestiones relacionadas