2012-03-15 26 views
8

Al asignar un valor predeterminado a un parámetro uint en un argumento de método C#, como se muestra en el primer bloque de código a continuación, aparece el mensaje "Un valor de tipo 'int' no se puede usar como parámetro predeterminado porque hay no hay conversiones estándar para escribir 'uint' ", mientras que al asignar una variable int a uint en el cuerpo del método está bien.¿Por qué no es válido asignar un valor entero a un parámetro uint en un argumento de método C#?

El código se compila; la advertencia se proporciona por medio de los colores rojo, subrayando serpenteante en Visual Studio 2010.

void GetHistoricData(uint historyLength = 365) 
{ 
    uint i = 365; // this is valid 
} 

Esto se resuelve fácilmente mediante el uso de 365U en lugar de 365, por lo tanto:

void GetHistoricData(uint historyLength = 365U) 
{ 
    // method body 
} 

Me resulta es realmente difícil encontrar una buena explicación de por qué no es válido asignar un int al uint en el parámetro cuando es válido para hacerlo en otro lugar. ¿Alguien puede ayudarme con el momento de "bombilla" que estoy tratando de encontrar?

+1

El subrayado rojo significa que no se puede compilar. ¿Has intentado reiniciar VS? – Tsabo

+1

Creo que es específico para su configuración: las advertencias no se muestran en mi código con el "subrayado rojo, ondulado". –

+0

Un reinicio del estudio visual ha provocado que ReSharper muestre su bombilla a la izquierda cuando se resalta el subrayado, lo que indica que esta es solo una de esas advertencias de ReSharper. – Jason

Respuesta

1

Compila para mí, con versiones de compilación de 4.0.30319.1 y 4.0.30319.17379.

Si está utilizando una versión anterior o un compilador diferente (por ejemplo, uno Mono) entonces sospecho que es simplemente un error.

EDITAR: Si está compilando bien (y no puedo provocar una advertencia en absoluto del compilador) entonces sospecho es algún complemento, como ReSharper. (No es que lo esté viendo en ReSharper tampoco ...)

No puedo reproducir esto en VS2010.

Yo sugeriría que se hace actualizar el código para el uno sin el aviso, sólo en aras de la legibilidad - pero sigue siendo válida código sin el cambio.

+0

Cumple para mí también. Debería haber mencionado eso, así que actualizaré la pregunta. La advertencia es un mensaje de línea ondulada roja en VS2010 en lugar de un error de compilación. – Jason

+1

Esto puede deberse a la forma en que funcionan los parámetros opcionales, lo que sucede aquí es que el valor get se inyecta en el método de llamada, aparentemente el compilador cree que no es una buena idea hacer eso sin escupir una advertencia – ntziolis

+0

Parece ser un prompt de ReSharper después de todo; después de un reinicio de VS, la bombilla R # ahora ha comenzado a aparecer (a veces) cuando la línea ondulada está mousada. – Jason

1

Teniendo en cuenta que usted está haciendo un molde, por lo que posiblemente también truncar el valor, yo supongo , Visual Studio sólo se advierte que sobre un hecho del potencial problema podría suceder y invita a hacer que esplicit fundido . Especialmente si estamos hablando de parámetros predeterminados, el valor predeterminado debe estar claramente especificado. En cambio, en el caso de un lanzamiento no explícito, siempre hay un espacio en las dudas sobre cómo sería el valor del reparto.

1

El subrayado rojo generalmente significa que no puede compilar. El analizador de código en VS a veces falla, produciendo mensajes de error y advertencias falsas, que aún se compilan. Al reiniciarse, VS se deshace de ellos.

Cuestiones relacionadas