Sunteți pe pagina 1din 2344

Visual Studio 2005 Visual C#

Copyright© 2016 Microsoft Corporation

El contenido de este documento se ha retirado y ya no se actualiza o admite. Algunos vínculos podrían no funcionar. El contenido retirado
representa la versión más reciente actualizada de este contenido.
Visual C#
Microsoft Visual C# 2005 es un lenguaje de programación diseñado para crear una amplia gama de aplicaciones que se
ejecutan en .NET Framework. C# es simple, eficaz, con seguridad de tipos y orientado a objetos. Con sus diversas innovaciones,
C# permite desarrollar aplicaciones rápidamente y mantiene la expresividad y elegancia de los lenguajes de tipo C.
Visual Studio admite Visual C# con un editor de código completo, plantillas de proyecto, diseñadores, asistentes para código,
un depurador eficaz y fácil de usar, además de otras herramientas. La biblioteca de clases .NET Framework ofrece acceso a una
amplia gama de servicios de sistema operativo y a otras clases útiles y adecuadamente diseñadas que aceleran el ciclo de
desarrollo de manera significativa.
En esta sección
Introducción a Visual C#
Introduce las funciones de C# 2.0 para los programadores sin experiencia previa con este lenguaje o con Visual Studio, y
ofrece una guía para encontrar ayuda en Visual Studio. Aquí es también donde se buscan las páginas "Cómo".
Utilizar el entorno IDE de Visual C#
Introduce el entorno de desarrollo de Visual C#.
Escribir aplicaciones con Visual C#
Proporciona una orientación de alto nivel que cubre las tareas de programación comunes utilizando C# y .NET Framework,
con vínculos a documentación más detallada.
Migrar a Visual C#
Compara el lenguaje C# con Java y C++, y describe cómo utilizar el Ayudante para la conversión del lenguaje Java para
convertir aplicaciones de Java y Visual J++ a Visual C#.
Guía de programación de C#
Proporciona información y ejemplos prácticos sobre cómo utilizar las construcciones de lenguaje C#.
Referencia de C#
Proporciona información de referencia detallada sobre conceptos de programación de C#, palabras clave, tipos, operadores,
atributos, directivas de preprocesador, modificadores de compiladores y errores y advertencias del compilador.
Especificación del lenguaje C#
Se vincula a la última versión de las características técnicas de C# en formato Microsoft Word.
Ejemplos de Visual C#
Código fuente de ejemplo que muestra cómo programar con Visual C#.
Secciones relacionadas
Lo nuevo en el lenguaje y el compilador de C# 2.0
Describe las nuevas características del lenguaje.
Lo nuevo en Visual C# 2005
Describe las nuevas funciones del editor de código, entorno de desarrollo, asistente para código y depuración.
Actualizar las aplicaciones de Visual C# a Visual Studio 2005
Describe cómo actualizar los proyectos existentes a Microsoft Visual Studio 2005.
Vea también
Otros recursos
Visual Studio
Introducción a Visual C#

Introducción a Visual C#
Los temas siguientes son de gran ayuda para desarrollar aplicaciones mediante el uso de Microsoft Visual C# 2005. También
muestran las numerosas funciones nuevas de Microsoft Visual Studio 2005 y la versión 2.0 del lenguaje C#.
En esta sección
Guía de orientación de la documentación de Visual C#
Proporciona una orientación de alto nivel del contenido de la documentación de Visual C#.
Introducción al lenguaje C# y .NET Framework
Proporciona información general sobre el lenguaje C# y la plataforma .NET.
Lo nuevo en Visual C# 2005
Lo nuevo en Microsoft Visual C# 2005.
Lo nuevo en el lenguaje y el compilador de C# 2.0
Lo nuevo en la versión 2.0 de C#.
Actualizar las aplicaciones de Visual C# a Visual Studio 2005
Actualizar los proyectos existentes a Microsoft Visual Studio 2005.
Crear la primera aplicación de C#
Escribir, compilar y ejecutar una aplicación sencilla en C#.
Utilizar Starter Kits de C#
Utilizar Starter Kits de C#.
Recursos adicionales de ayuda (Visual C#)
Vínculos a otros recursos de ayuda.
Cómo se utiliza C#
Vínculos a temas que muestran la forma de realizar una gran variedad de tareas concretas.
Secciones relacionadas
Utilizar el entorno IDE de Visual C#
Guía para utilizar el entorno de desarrollo de Visual C#.
Migrar a Visual C#
Convertir aplicaciones de Java y Visual J++ a Visual C#.
Escribir aplicaciones con Visual C#
Proporciona información general sobre tareas de programación comunes al utilizar C# y .NET Framework, y vínculos a
documentación más detallada.
Guía de programación de C#
Proporciona información sobre conceptos de programación en C# y describe la forma de realizar diversas tareas en este
lenguaje.
Referencia de C#
Proporciona información de referencia detallada sobre palabras clave, operadores, directivas de preprocesador,
modificadores del compilador, y errores y advertencias del compilador de C#.
Ejemplos de Visual C#
Código fuente de ejemplo que muestra cómo se programa con Visual C#.
Terminología de C#
Glosario de términos de C#.
Vea también
Otros recursos
Visual C#
Visual Studio
Introducción a Visual C#

Guía de orientación de la documentación de Visual C#


La documentación de Microsoft Visual C# 2005 contiene información específica del lenguaje C#, como palabras clave,
opciones del compilador, mensajes de error y conceptos de programación. Esta documentación también ofrece una
descripción general de cómo utilizar el entorno de desarrollo integrado (IDE). Además, hay muchos vínculos a la ayuda
detallada de las clases de .NET Framework, el desarrollo Web en ASP.NET, la depuración y la programación con bases de datos
SQL, entre otros temas.
El diagrama siguiente ofrece una visión conceptual del contenido de la documentación de Visual C# y de las relaciones de
dicho contenido con otras secciones relevantes de la documentación de Visual Studio y de MSDN Online.

Vínculos rápidos a la documentación específica de C#


Introducción a Visual C#
Cómo se utiliza C#
Migrar a Visual C#
Utilizar el entorno IDE de Visual C#
Escribir aplicaciones con Visual C#
Referencia de C#
Ejemplos de Visual C#
Opciones del compilador de C#
Vínculos rápidos a la documentación relacionada
Para obtener más información sobre la creación de aplicaciones para Windows, vea
Aplicaciones, componentes y servicios basados en Windows.
Para obtener más información sobre la creación de aplicaciones Web, vea Visual Web Developer.
Para obtener más información sobre la biblioteca de clases de .NET Framework, vea
Información general de la biblioteca de clases de .NET Framework.
Para obtener más información sobre Common Language Runtime de .NET Framework, el sistema de tipos común y otros
conceptos relacionados, vea Información general acerca de .NET Framework.
Vea también
Otros recursos
Visual Studio
Introducción a Visual C#

Introducción al lenguaje C# y .NET Framework


C# es un lenguaje orientado a objetos elegante y con seguridad de tipos que permite a los desarrolladores crear una amplia
gama de aplicaciones sólidas y seguras que se ejecutan en .NET Framework. Puede utilizar este lenguaje para crear
aplicaciones cliente para Windows tradicionales, servicios Web XML, componentes distribuidos, aplicaciones cliente-servidor,
aplicaciones de base de datos, y muchas tareas más. Microsoft Visual C# 2005 proporciona un editor de código avanzado,
diseñadores de interfaz de usuario prácticos, un depurador integrado y muchas otras herramientas para facilitar un rápido
desarrollo de la aplicación basado en la versión 2.0 del lenguaje C# y en .NET Framework.
Nota
La documentación de Visual C# supone que se conocen los conceptos básicos de programación. Si es un principiante en la m
ateria, puede explorar Visual C# Express, que está disponible en el Web. También puede aprovechar cualquiera de los excelen
tes libros y recursos Web sobre C# para obtener conocimientos prácticos de programación.

Lenguaje C#
La sintaxis de C# es muy expresiva, aunque cuenta con menos de 90 palabras clave; también es sencilla y fácil de aprender. La
sintaxis de C# basada en signos de llave podrá ser reconocida inmediatamente por cualquier persona familiarizada con C, C++
o Java. Los desarrolladores que conocen cualquiera de estos lenguajes pueden empezar a trabajar de forma productiva en C#
en un plazo muy breve. La sintaxis de C# simplifica muchas de las complejidades de C++ y, a la vez, ofrece funciones eficaces
tales como tipos de valores que aceptan valores NULL, enumeraciones, delegados, métodos anónimos y acceso directo a
memoria, que no se encuentran en Java. C# también admite métodos y tipos genéricos, que proporcionan mayor rendimiento
y seguridad de tipos, e iteradores, que permiten a los implementadores de clases de colección definir comportamientos de
iteración personalizados que el código de cliente puede utilizar fácilmente.
Como lenguaje orientado a objetos, C# admite los conceptos de encapsulación, herencia y polimorfismo. Todas las variables y
métodos, incluido el método Main que es el punto de entrada de la aplicación, se encapsulan dentro de definiciones de clase.
Una clase puede heredar directamente de una clase primaria, pero puede implementar cualquier número de interfaces. Los
métodos que reemplazan a los métodos virtuales en una clase primaria requieren la palabra clave override como medio para
evitar redefiniciones accidentales. En C#, una estructura es como una clase sencilla; es un tipo asignado en la pila que puede
implementar interfaces pero que no admite la herencia.
Además de estos principios básicos orientados a objetos, C# facilita el desarrollo de componentes de software a través de
varias construcciones de lenguaje innovadoras, entre las que se incluyen:
Firmas de métodos encapsulados denominadas delegados, que permiten notificaciones de eventos con seguridad de
tipos.
Propiedades, que actúan como descriptores de acceso para variables miembro privadas.
Atributos, que proporcionan metadatos declarativos sobre tipos en tiempo de ejecución.
Comentarios en línea de documentación XML.
Si necesita interactuar con otro software de Windows, como objetos COM o archivos DLL nativos de Win32, podrá hacerlo en
C# mediante un proceso denominado "interoperabilidad". La interoperabilidad permite que los programas de C# realicen
prácticamente lo mismo que una aplicación de C++ nativa. C# admite incluso el uso de punteros y el concepto de código "no
seguro" en los casos en que el acceso directo a la memoria es absolutamente crítico.
El proceso de generación de C# es simple en comparación con el de C y C++, y es más flexible que en Java. No hay archivos de
encabezado independientes, ni se requiere que los métodos y los tipos se declaren en un orden determinado. Un archivo de
código fuente de C# puede definir cualquier número de clases, estructuras, interfaces y eventos.
A continuación se enumeran otros recursos de C#:
Para disponer de una introducción general al lenguaje, vea el capítulo 1 de Especificación del lenguaje C#.
Para obtener información detallada sobre aspectos concretos del lenguaje C#, vea Referencia de C#.
Para tener una comparación entre la sintaxis de C# y las de Java y C++, vea
Lenguaje de programación C# para desarrolladores de Java y C# para los desarrolladores de C++.
Arquitectura de la plataforma .NET Framework
Los programas de C# se ejecutan en .NET Framework, un componente que forma parte de Windows y que incluye un sistema
de ejecución virtual denominado Common Language Runtime (CLR) y un conjunto unificado de bibliotecas de clases. CLR es la
implementación comercial de Microsoft de Common Language Infrastructure (CLI), norma internacional que constituye la base
para crear entornos de ejecución y desarrollo en los que los lenguajes y las bibliotecas trabajan juntos sin problemas.
El código fuente escrito en C# se compila en un lenguaje intermedio (IL) conforme con la especificación CLI. El código de
lenguaje intermedio, junto con recursos tales como mapas de bits y cadenas, se almacena en disco en un archivo ejecutable
denominado ensamblado, cuya extensión es .exe o .dll generalmente. Un ensamblado contiene un manifiesto que ofrece
información sobre los tipos, la versión, la referencia cultural y los requisitos de seguridad del ensamblado.
Cuando se ejecuta un programa de C#, el ensamblado se carga en CLR, con lo que se pueden realizar diversas acciones en
función de la información del manifiesto. A continuación, si se cumplen los requisitos de seguridad, CLR realiza una
compilación Just In Time (JIT) para convertir el código de lenguaje intermedio en instrucciones máquina nativas. CLR también
proporciona otros servicios relacionados con la recolección automática de elementos no utilizados, el control de excepciones y
la administración de recursos. El código ejecutado por CLR se denomina algunas veces "código administrado", en
contraposición al "código no administrado" que se compila en lenguaje máquina nativo destinado a un sistema específico. En
el diagrama siguiente se muestran las relaciones en tiempo de compilación y tiempo de ejecución de los archivos de código
fuente de C#, las bibliotecas de clases base, los ensamblados y CLR.

La interoperabilidad del lenguaje es una función clave de .NET Framework. Como el código de lenguaje intermedio generado
por el compilador de C# cumple la especificación de tipos común (CTS), este código generado en C# puede interactuar con el
código generado en las versiones .NET de Visual Basic, Visual C++, Visual J# o cualquiera de los más de 20 lenguajes
conformes con CTS. Un único ensamblado puede contener varios módulos escritos en diferentes lenguajes .NET, y los tipos
admiten referencias entre sí como si estuvieran escritos en el mismo lenguaje.
Además de los servicios en tiempo de ejecución, .NET Framework también incluye una amplia biblioteca de más de 4.000
clases organizada en espacios de nombres que ofrecen una diversidad de funciones útiles para la entrada y salida de archivos,
la manipulación de cadenas, el análisis de archivos XML y los controles de formularios Windows Forms. La aplicación de C#
típica utiliza continuamente la biblioteca de clases de .NET Framework para el tratamiento de las tareas comunes de
"infraestructura".
Para obtener más información sobre la plataforma .NET Framework, consulte Información general acerca de .NET Framework.
Vea también
Otros recursos
Visual C#
Escribir aplicaciones con Visual C#
Introducción a Visual C#

Lo nuevo en Visual C# 2005


Microsoft Visual C# 2005 incluye nuevas características en las áreas siguientes:
Lenguaje y compilador
Editor de código
Entorno de desarrollo
Documentación y especificaciones del lenguaje
Depuración
Lenguaje y compilador
El lenguaje de C# admite ahora tipos genéricos, iteradores y tipos parciales. La versión última del compilador de C# también
incluye nuevas características y opciones. Para obtener más información, vea
Lo nuevo en el lenguaje y el compilador de C# 2.0.
Editor de código
El editor de código contiene las siguientes nuevas características para Visual C# 2005.
Fragmentos de código
Los fragmentos de código aceleran la entrada de construcciones de código común mediante una plantilla que se puede
cumplimentar. Los fragmentos de código se almacenan como archivos XML que se modifican y personalizan con facilidad.
Fragmentos de código (C#)
Cómo: Utilizar fragmentos de código (C#)
Cómo: Utilizar fragmentos de código envolventes
Refactorización
Las herramientas de refactorización reestructuran automáticamente el código fuente, por ejemplo, promocionando variables
locales a parámetros o convirtiendo un bloque de código en un método.
Cómo: Promocionar una variable local a parámetro
Extraer método
Encapsular campo
Extraer interfaz
Cambiar nombre
Quitar parámetros
Reordenar parámetros
Entorno de desarrollo
El entorno de desarrollo incluye las siguientes mejoras para Visual C# 2005.
IntelliSense
IntelliSense se ha optimizado con estas nuevas características:
La lista de finalización de la Lista de miembros aparece automáticamente cuando el cursor retrocede a un operador de
ámbito que precede a un objeto o cuando deshace la acción de finalización.
Cuando se escribe código de control de errores, la Lista de miembros ayuda a descubrir la excepción que se debe
detectar filtrando los miembros irrelevantes de la lista de finalización en una cláusula catch.
Cuando sea preciso insertar código normalizado, Generación automática de código permite pedir a IntelliSense que
inserte el código.
IntelliSense está disponible cuando se crean aplicaciones Web.
Diseñador de clases
El Diseñador de clases es un nuevo editor que muestra clases y tipos gráficamente, y permite agregar o modificar métodos.
También se pueden utilizar las herramientas de refactorización de la ventana Diseñador de clases.
Vea Diseñar y ver clases y tipos.
Herramienta de prueba de objetos
La Herramienta de prueba de objetos está diseñada para llevar a cabo pruebas sencillas en el nivel de objetos. Permite crear
una instancia de un objeto y llamar a sus métodos.
Vea Herramienta de prueba de objetos.
Implementación ClickOnce
La implementación de ClickOnce permite publicar aplicaciones para Windows en un servidor Web o recurso compartido de
red con el fin de simplificar la instalación.
Vea Implementación ClickOnce.
Soporte de herramientas para ensamblados con nombre seguro
Se ha rediseñado el cuadro de diálogo Propiedades del proyecto, que ahora incluye compatibilidad para firmar
ensamblados.
Vea Propiedades del proyecto.
Asistentes para código
Los siguientes asistentes de código están obsoletos:
Asistente para métodos de C#
Asistente para propiedades de C#
Asistente para campos de C#
Asistente para indizadores de C#
Documentación y especificaciones del lenguaje
La documentación de referencia de C# se ha revisado exhaustivamente para dar una información completa sobre cuestiones
de uso simples y avanzadas que los desarrolladores se planteen durante la creación de aplicaciones en C#.
La especificación de lenguaje C# ya no se integra en el entorno de Ayuda, sino que se proporciona en dos archivos .doc. Estos
archivos se instalan de forma predeterminada bajo \\Microsoft Visual Studio 8\vcsharp\specifications\1033\. Las
versiones más actualizadas se pueden descargar del Centro para desarrolladores de C# en MSDN. Para obtener más
información, vea Especificación del lenguaje C#.
Mejoras de depuración específicas de C#
Se han agregado características nuevas, como Editar y continuar, para ayudar al desarrollador de C#.
Vea Lo nuevo en el depurador de Visual Studio 2005.
Vea también
Conceptos
Lo nuevo en Visual Studio 2005
Otros recursos
Visual C#
Introducción a Visual C#
Utilizar el entorno IDE de Visual C#
Introducción a Visual C#

Lo nuevo en el lenguaje y el compilador de C# 2.0


Con el lanzamiento de Visual Studio 2005, el lenguaje C# se ha actualizado a la versión 2.0, que admite las siguientes
características nuevas:
Genéricos
Los tipos genéricos se agregan al lenguaje para permitir a los programadores alcanzar un alto nivel de reutilización del
código y rendimiento mejorado para las clases de colección. Los tipos genéricos sólo pueden diferenciarse en la aridad.
También es posible forzar los parámetros para que sean tipos específicos. Para obtener más información, vea
Parámetros de tipo genérico.
Iteradores
Los iteradores permiten disponer cómo un bucle foreach recorrerá en iteración el contenido de una colección.
Clases parciales
Las definiciones de tipo parcial permiten que un tipo único, como una clase, se divida en varios archivos. El diseñador de
Visual Studio utiliza esta característica para separar el código generado del código de usuario.
Tipos que aceptan valores NULL
Los tipos que aceptan valores NULL permiten que una variable contenga un valor indefinido. Los tipos que aceptan valores
NULL son útiles cuando se trabaja con bases de datos y otras estructuras de datos que pueden contener elementos que no
tienen ningún valor específico.
Métodos anónimos
Ahora es posible pasar un bloque de código como parámetro. Siempre que se espere un delegado, se puede utilizar un
bloque de código en su lugar: no hay necesidad de definir un nuevo método.
Calificador de alias de espacio de nombres
El calificador de alias de espacio de nombres (::) proporciona más control sobre cómo tener acceso a los miembros de
espacio de nombres. El alias global :: permite tener acceso al espacio de nombres de raíz que puede ser ocultado por una
entidad en el código.
Clases estáticas
Las clases estáticas son una manera segura y conveniente de declarar una clase que contiene métodos estáticos de los que
no se pueden crear instancias. En la versión 1.2 de C#, se habría definido el constructor de clase como privado para evitar
que se crearan instancias de la clase.
Alias del ensamblado externo
Haga referencia a las diferentes versiones del mismo componente contenidas en el mismo ensamblado con este uso
expandido de la palabra clave extern.
Accesibilidad del descriptor de acceso de propiedades
Ahora es posible definir niveles diferentes de accesibilidad para los descriptores de acceso get y set en propiedades.
Covarianza y contravarianza en delegados
El método pasado a un delegado ahora puede tener mayor flexibilidad en cuanto al tipo de valor devuelto y los parámetros.
Cómo: Declarar un delegado, crear instancias del mismo y utilizarlo
La conversión de grupo de métodos proporciona una sintaxis simplificada para declarar los delegados.
Búferes de tamaño fijo
En un bloque de código no seguro, ahora es posible declarar estructuras de tamaño fijo con matrices incrustadas.
Ensamblados de confianza
Los ensamblados pueden proporcionar acceso a tipos no públicos en otros ensamblados.
Control de alertas en el código
La directiva de advertencia #pragma se puede utilizar para deshabilitar y habilitar ciertas advertencias del compilador.
volatile
La palabra clave volatile ahora se puede aplicar IntPtr y UIntPtr.
En esta versión, el compilador de C# presenta los siguientes cambios y adiciones:
Opción /errorreport
Se puede utilizar para indicar a Microsoft errores internos del compilador a través de Internet.
Opción /incremental
Se ha quitado.
Opciones /keycontainer y /keyfile
Compatibilidad que especifica claves criptográficas.
Opción /langversion
Se puede utilizar para especificar la compatibilidad con una versión concreta del lenguaje.
Opción /linkresource
Contiene opciones adicionales.
Opción /moduleassemblyname
Permite generar un archivo .netmodule y obtener acceso a tipos no públicos en un ensamblado existente.
Opción /pdb
Especifica el nombre y ubicación del archivo .pdb.
Opción /platform
Permite seleccionar como destino arquitecturas de la familia Itanium (IPF) y x64.
#pragma warning
Se utiliza para deshabilitar y habilitar advertencias individuales en el código.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Especificación del lenguaje C#
Referencia de C#
Introducción a Visual C#

Actualizar las aplicaciones de Visual C# a Visual Studio 2005


Cuando abra un archivo de proyecto o de solución creado con una versión anterior de Visual Studio, el Asistente para
actualización le guiará a través del proceso de convertir el proyecto a Visual Studio 2005. El Asistente para actualización lleva a
cabo automáticamente muchas tareas: crear nuevas propiedades y atributos, eliminar las propiedades y atributos obsoletos,
etc. Pero, al haberse reforzado la comprobación de errores, pueden aparecer nuevos mensajes de error o advertencia que no
se generaban en la versión anterior del compilador. Por lo tanto, el paso final para actualizar una aplicación existente es
realizar los cambios de código necesarios para resolver los nuevos errores.
Con frecuencia, el código que generaba un mensaje en las versiones anteriores del compilador de C# genera un mensaje
diferente en la versión actual. Normalmente, esto es debido a que se ha reemplazado un mensaje general por otro más
específico. Dado que se requiere ningún cambio en el código, estas diferencias no están documentadas.
A continuación se enumeran los nuevos mensajes que genera el Asistente para actualización debido a que la comprobación de
errores es más estricta.
Nuevos mensajes de error y de advertencia
CS0121: Llamada ambigua
Debido a una conversión implícita, el compilador no pudo llamar a una forma de un método sobrecargado. Puede resolver
este error de las siguientes maneras:
Especifique los parámetros del método de tal manera que una conversión implícita no pueda tener lugar.
Elimine todas las sobrecargas del método.
Convierta al tipo apropiado antes de llamar al método.
CS0122: Método inaccesible debido a su nivel de protección
Este error puede generarse cuando se hace referencia a un tipo en un ensamblado compilado por C++ con la opción del
compilador /d1PrivateNativeTypes.
Este error aparece porque en la versión actual, un ensamblado de C++ genera una firma que utiliza un tipo no marcado como
público.
Puede evitar este problema utilizando la opción /test:AllowBadRetTypeAccess del compilador. Esta opción se eliminará
cuando se solucione esta característica.
CS0429: Se ha detectado un código de expresión al que no se puede tener acceso
Este error aparece siempre que no se puede tener acceso a parte de una expresión del código. Por ejemplo, la condición false
&& myTest() cumple este criterio porque el método myTest() nunca se evalúa, ya que el lado izquierdo de la operación &&
siempre es falso. Para corregir este problema, cambie la comprobación lógica para eliminar el código inalcanzable.
CS0441: Una clase no puede ser static y sealed
Todas las clases static son también clases sealed. La especificación del lenguaje C# prohíbe especificar ambos modificadores en
una clase, y ahora el compilador genera un error.
Para corregir este error, quite sealed de la clase.
CS1699: Advertencia sobre el uso de los atributos de firma del ensamblado
Los atributos de ensamblado que especifican la firma se han eliminado del código y se indican ahora en forma de opciones del
compilador. El uso de los atributos AssemblyKeyFile o AssemblyKeyName genera ahora esta advertencia.
En lugar de estos atributos, deberá utilizar las siguientes opciones del compilador:
utilice la opción del compilador /keyfile (Especificar archivo clave con nombre seguro) (Opciones del compilador de C#)
en lugar del atributo AssemblyKeyFile, y
/keycontainer (Especificar contenedor de claves con nombre seguro) (Opciones del compilador de C#) en lugar de
AssemblyKeyName.

Si no se cambia a las opciones de la línea de comandos, se puede dificultar el diagnóstico del compilador cuando se utilizan
ensamblados de confianza.
Si utiliza /warnaserror (Tratar advertencias como errores) (Opciones del compilador de C#), puede volver a convertirlo en una
advertencia agregando /warnaserror-:1699
a la línea de comandos del compilador. Si es necesario, puede utilizar
/nowarn:1699 para desactivar la advertencia.
Eliminación de la compilación incremental
Se ha eliminado la opción del compilador /incremental. La característica Editar y continuar reemplaza esta
funcionalidad.

Vea también
Otros recursos
Opciones del compilador de C#
Introducción a Visual C#

Crear la primera aplicación de C#


Sólo lleva un minuto crear una aplicación de C#. Siga estos pasos para crear un programa que abre una ventana y reacciona al
presionar un botón.
Procedimientos
Para crear una aplicación de C#
1. En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
2. Asegúrese que la plantilla Aplicación para Windows está seleccionada; en el campo Name, escriba MyProject, y haga
clic en Aceptar.
Aparecerá un formulario Windows Forms en el diseñador de Windows Forms. Ésta es la interfaz de usuario de la
aplicación.
3. En el menú Ver, haga clic en Cuadro de herramientas para ver la lista de controles.
4. Expanda la lista Controles comunes y arrastre el control de etiqueta hacia el formulario.
5. También en la lista del Cuadro de herramientas Controles comunes, arrastre un botón al formulario, junto a la etiqueta.
6. Haga doble clic en el nuevo botón para abrir el Editor de código. Visual C# Express ha insertado un método denominado
button1_Click que se ejecuta al hacer clic en el botón.

7. Cambie el método para que se parezca a esto:

private void button1_Click(object sender, EventArgs e)


{
label1.Text = "Hello, World!";
}

8. Presione F5 para compilar y ejecutar la aplicación.


Cuando haga clic en el botón, aparece un mensaje de texto. ¡Enhorabuena! Acaba de escribir su primera aplicación de C#.
Vea también
Otros recursos
Visual C#
Introducción a Visual C#
Introducción a Visual C#

Plantillas de proyecto en las ediciones de Visual C#


Cuando se crea un nuevo proyecto, los iconos de los cuadros de diálogo Nuevo proyecto y Nuevo sitio Web representan
los tipos de proyecto disponibles y sus plantillas. La plantilla de proyecto que elija determina el tipo de salida y otras opciones
disponibles para ese proyecto. No todas las plantillas de proyecto están disponibles en todas las ediciones de Visual C#.
Nota
La documentación para las características que no están disponibles en Visual C# Express o Visual C# Standard Edition puede
estar incluida en la documentación de estas ediciones.

Plantillas de proyecto de Visual C#


La siguiente tabla muestra qué plantillas de proyecto de Visual C# están disponibles en las distintas ediciones de Visual Studio.
Plantilla Microsoft Visual C# E Visual Studio 2005 St Visual Studio 2005 Professional y s
xpress andard uperiores
Sitio Web ASP.NET X X

Servicio Web ASP.NET X X

Sitio Web ASP.NET Crystal Reports X

Biblioteca de clases X X X

Aplicación de consola X X X

Aplicación Crystal Reports X

Aplicación de dispositivo X X

Proyecto vacío X X X

Sitio Web vacío X X

Plantilla de Excel X

Libro de Excel X

Starter Kit de la colección de películas X X X

Complemento de Outlook X

Starter Kit de sitios Web personales X X

Pocket PC 2003: Biblioteca de clases X X

Pocket PC 2003: Biblioteca de clases (1 X X


.0)

Pocket PC 2003: Aplicación de consola X X

Pocket PC 2003: Aplicación de consola X X


(1.0)
Pocket PC 2003: Biblioteca de controle X X
s

Pocket PC 2003: Aplicación de disposit X X


ivo

Pocket PC 2003: Aplicación de disposit X X


ivo (1.0)

Pocket PC 2003: Proyecto vacío X X

Pocket PC 2003: Proyecto vacío (1.0) X X

Starter Kit del protector de pantalla X X X

Proyecto de SQL Server X

Smartphone 2003: Biblioteca de clases X X


(1.0)

Smartphone 2003: Aplicación de cons X X


ola (1.0)

Smartphone 2003: Aplicación de dispo X X


sitivo (1.0)

Smartphone 2003: Proyecto vacío (1.0 X X


)

Proyecto de prueba X

Biblioteca de controles Web X X

Aplicación para Windows X X X

Windows CE 5.0: Biblioteca de clases X X

Windows CE 5.0: Aplicación de consol X X


a

Windows CE 5.0: Biblioteca de control X X


es

Windows CE 5.0: Aplicación de disposi X X


tivo

Windows CE 5.0: Proyecto vacío X X

Biblioteca de controles de Windows X X

Servicio de Windows X

Documento de Word X
Plantilla de Word X
Vea también
Conceptos
Aspectos básicos de instalación y configuración
Lo nuevo en Visual Studio 2005
Lo nuevo en Visual C# 2005
Otros recursos
Escribir aplicaciones con Visual C#
Introducción a Visual C#

Utilizar Starter Kits de C#


Un Starter Kit es una aplicación completa y autónoma, lista para cargar y generar. Un Starter Kit incluye su propia
documentación, con descripciones de las técnicas de programación y sugerencias de personalización. Los Starter Kits son un
modo excelente de ver una aplicación de C# en acción.
Para cargar y generar un Starter Kit de Visual C#
1. En el menú Archivo, haga clic en Nuevo proyecto.
Aparecerá el cuadro de diálogo Nuevo proyecto. Este cuadro de diálogo muestra la lista de los diferentes tipos de
aplicación predeterminados que puede crear Visual C#.
2. Seleccione un tipo de aplicación de Starter Kit y haga clic en Aceptar.
Los Starter Kits se cargan en Visual C#.
3. Para generar e iniciar el proyecto Starter Kit, presione F5.
Vea también
Otros recursos
Visual C#
Introducción a Visual C#
Introducción a Visual C#

Recursos adicionales de ayuda (Visual C#)


Los siguientes sitios y grupos de noticias le ayudarán a encontrar la solución a los problemas frecuentes y a los no tan
comunes.
Recursos de Microsoft
A continuación, se muestran sitios Web que mantiene Microsoft donde se alojan artículos y grupos de discusión sobre temas
de interés para desarrolladores de C#.
En el Web
Ayuda y soporte técnico de Microsoft
Proporciona acceso a los artículos de Knowledge Base (KB), a las descargas y actualizaciones, difusiones por Web del servicio
de soporte técnico y otros servicios.
Microsoft Visual C# Developer Center
Proporciona ejemplos de código, información de actualización y contenido técnico.
Grupos de discusión de MSDN
Ofrece un modo de ponerse en contacto como una comunidad de expertos de todo el mundo.
Foros
Foros técnicos de Microsoft
Foros de discusión en el Web para diversas tecnologías de Microsoft, incluidos C# y .NET Framework.
Grupos de noticias
microsoft.public.dotnet.languages.csharpmicrosoft.public.dotnet.languages.csharp
Ofrece un foro de preguntas y discusión en general sobre Visual C#.
microsoft.public.vsnet.generalmicrosoft.public.vsnet.general
Ofrece un foro de preguntas y problemas de Visual Studio.
microsoft.public.vsnet.idemicrosoft.public.vsnet.ide
Proporciona un foro de preguntas sobre el trabajo en el entorno de Visual Studio.
microsoft.public.vsnet.documentationmicrosoft.public.vsnet.documentation
Ofrece un foro de preguntas y temas relacionados con la documentación de Visual C#.
Recursos de otros fabricantes
El sitio Web de MSDN proporciona información sobre sitios de otros fabricantes y grupos de noticias de interés. Para obtener
la lista de recursos disponibles más reciente, consulte el sitio Web de la comunidad MSDN.
Vea también
Otros recursos
Visual C#
Introducción a Visual C#
Utilizar la Ayuda en Visual Studio
Interactuar con otros desarrolladores
Compatibilidad de productos y accesibilidad
Introducción a Visual C#

Cómo se utiliza C#
Este tema "Cómo..." es su puerta de enlace a los temas más importantes basados en tareas sobre programación en C# y
desarrollo de aplicaciones. Las categorías esenciales de lo que puede hacer con C# se muestran en este tema. Los vínculos
proporcionan punteros a páginas importantes de Ayuda sobre procedimientos.
Lenguaje C#
Especificación del lenguaje C#... Subprocesamiento... Genéricos... Fragmentos de código de ejemplo... Ejemplos... etc.
.NET Framework
E/S de archivo… Cadenas… Colecciones… Serialización… Componentes… Ensamblados y dominios de aplicación… etc.
Aplicaciones para Windows
Generar aplicaciones para Windows... Controles... Formularios Windows Forms... Dibujar... etc.
Páginas Web y servicios Web
Páginas Web ASP.NET… Servicios Web XML… etc.
Depuración
Uso del depurador de VS… Clase Trace de .NET Framework… Depuración de transacciones SQL… etc.
Acceso a datos
Conectar a orígenes de datos… SQL Server... Enlace de datos… etc.
Diseñar clases
Diseñador de clases… Trabajar con clases y otros tipos... Crear y modificar miembros de tipos… Instrucciones de diseño de
bibliotecas de clases… etc.
Seguridad
Seguridad de acceso a código… Procedimientos recomendados de directivas de seguridad... Conjuntos de permisos... etc.
Programación de Office
Programación de Office... Controles... Word... Excel... etc.
Dispositivos inteligentes
Lo nuevo en proyectos de Smart Device... Programar dispositivos inteligentes... Depuración de dispositivos inteligentes... etc.
Implementación
ClickOnce… Windows Installer
Recursos adicionales
Los sitios siguientes requieren una conexión a Internet.
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza
regularmente con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con
nuevo contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se
actualiza regularmente con nuevo contenido.
Vea también
Otros recursos
Introducción a Visual C#
Introducción a Visual C#

Lenguaje C# (Cómo se utiliza C#)


Esta página proporciona vínculos a la ayuda de las tareas más habituales del lenguaje C#. Para ver otras categorías de tareas
frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
El lenguaje C#
Lo nuevo en el lenguaje y el compilador de C# 2.0
Contiene información sobre las nuevas características, incluidos los genéricos, los iteradores, los métodos anónimos y los
tipos parciales.
Utilizar Starter Kits de C#
Explica cómo cargar y generar un Starter Kit de Visual C#.
Especificación del lenguaje C#
Punteros a la última versión de las características técnicas en formato Microsoft Word.
Línea de comandos
Main() y argumentos de línea de comandos (Guía de programación de C#)
Explica el método Main, que es el punto de entrada del programa donde se crean objetos e invocan otros métodos. En un
programa de C#, sólo puede haber un punto de entrada.
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Proporciona un ejemplo de código que muestra cómo obtener acceso a los parámetros de la línea de comandos.
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Explica cómo mostrar a los argumentos de la línea de comandos a través de la matriz de cadena args.
Valores devueltos de Main() (Guía de programación de C#)
Explica los posibles valores devueltos del método principal.
Clases y herencia
base (Referencia de C#)
Explica cómo especificar el constructor de la clase base al que se realiza la llamada cuando se crean instancias de una clase
derivada.
Cómo: Saber las diferencias entre pasar a un método una estructura y una referencia a clase (Guía de programación de C#)
Contiene un ejemplo de código que muestra que cuando una estructura se pasa a un método, lo que se pasa realmente es
una copia de la estructura; sin embargo, cuando se pasa una instancia de una clase, lo que se pasa es una referencia.
Constructores de instancias (Guía de programación de C#)
Describe los constructores de clase y la herencia.
Cómo: Escribir un constructor Copy (Guía de programación de C#)
Contiene un ejemplo de código que muestra cómo un constructor de una clase toma otro objeto como argumento.
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Contiene un ejemplo de código que define dos estructuras y muestra las conversiones entre ellas.
Tipos de datos
Conversión boxing (Guía de programación de C#)
Contiene un ejemplo que muestra cómo un tipo de valor y un objeto empaquetado pueden almacenar valores diferentes.
Conversión unboxing (Guía de programación de C#)
Contiene un ejemplo de código que ilustra cómo mostrar un mensaje de error para un caso de conversión boxing no válida.
Matrices
Utilizar matrices como objetos (Guía de programación de C#)
Contiene un ejemplo de código que muestra el número de dimensiones de una matriz.
Matrices escalonadas (Guía de programación de C#)
Contiene un ejemplo de código que genera una matriz cuyos elementos son también matrices.
Pasar matrices como parámetros (Guía de programación de C#)
Contiene ejemplos de código que inicializan una matriz de cadenas y la pasan como parámetro al método PrintArray, donde
se muestran sus elementos.
Pasar matrices mediante Ref y Out (Guía de programación de C#)
Contiene ejemplos de código que muestran la diferencia entre out y ref cuando se utilizan para pasar matrices a métodos.
Propiedades
Cómo: Declarar y utilizar propiedades de lectura y escritura (Guía de programación de C#)
Contiene un ejemplo que muestra cómo declarar y utilizar las propiedades de lectura y escritura.
Cómo: Definir propiedades abstractas (Guía de programación de C#)
Contiene un ejemplo de código que muestra cómo definir propiedades abstractas.
Métodos
Pasar parámetros de tipo de valor (Guía de programación de C#)
Contiene ejemplos de código que muestran las distintas formas de pasar tipos de valor.
Pasar parámetros Reference-Type (Guía de programación de C#)
Contiene ejemplos de código que muestran las distintas formas de pasar tipos de referencia.
Eventos
Cómo: Suscribir y cancelar la suscripción a eventos (Guía de programación de C#)
Muestra cómo suscribirse a eventos publicados por otras clases, incluidos formularios, botones, cuadros de lista, etc.
Cómo: Publicar eventos que cumplan las directrices de .NET Framework (Guía de programación de C#)
Muestra cómo crear eventos basados en EventHandler y EventHandler<T>.
Cómo: Implementar eventos de interfaz (Guía de programación de C#)
Muestra cómo implementar eventos declarados en interfaces.
Cómo: Utilizar un diccionario para almacenar instancias de eventos (Guía de programación de C#)
Explica cómo utilizar una tabla hash para almacenar las instancias del evento.
Cómo: Producir eventos de una clase base en clases derivadas (Guía de programación de C#)
Muestra cómo ajustar eventos de clase base en métodos virtuales protegidos para que puedan llamarse desde clases
derivadas.
Interfaces
Cómo: Implementar explícitamente miembros de interfaz (Guía de programación de C#)
Muestra cómo declarar una clase que implementa explícitamente una interfaz y cómo obtener acceso a los miembros a
través de la instancia de la interfaz.
Cómo: Implementar explícitamente miembros de interfaz con herencia (Guía de programación de C#)
Proporciona un ejemplo que muestra las dimensiones de un cuadro, tanto en unidades métricas como inglesas.
Genéricos
Una introducción a los genéricos de C#
Describe cómo los genéricos permiten definir clases de colección con seguridad de tipos. La clase genérica sólo se
implementa una vez, pero se puede declarar y utilizar con cualquier tipo.
Genéricos en .NET Framework
Explica las características y uso del nuevo conjunto de colecciones genéricas en el espacio de nombres
System.Collections.Generic.
Palabra clave predeterminada en código genérico (Guía de programación de C#)
Ofrece un ejemplo de código que muestra cómo utilizar la palabra clave predeterminada para los parámetros de tipo.
Ofrece un ejemplo de código que muestra cómo utilizar la palabra clave predeterminada para los parámetros de tipo.
Métodos genéricos (Guía de programación de C#)
Presenta la sintaxis para declarar una definición de método genérico. También muestra un ejemplo de cómo utilizar métodos
genéricos en una aplicación.
Restricciones de tipos de parámetros (Guía de programación de C#)
Muestra cómo restringir los parámetros de tipo para permitir el acceso a los métodos y propiedades de los tipos utilizados
para crear instancias de la clase genérica.
Delegados genéricos (Guía de programación de C#)
Contiene la sintaxis para declarar delegados genéricos. También incluye comentarios importantes acerca de la creación de
instancias y el uso de delegados genéricos así como ejemplos de código.
Espacios de nombres
Cómo: Utilizar el calificador de alias del espacio de nombres (Guía de programación de C#)
Explica la posibilidad de tener acceso a un miembro en el espacio de nombres global cuando otra entidad con el mismo
nombre puede ocultar el miembro.
Iteradores
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Ofrece un ejemplo en el que se utiliza una matriz de enteros para generar la lista SampleCollection. Un bucle for recorre en
iteración la colección y obtiene el valor de cada elemento. A continuación, se utiliza un bucle foreach para mostrar los
elementos de la colección.
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Ofrece un ejemplo en el que una clase genérica Stack< T > implementa una interfaz genérica IEnumerator<T>. Se declara
una matriz del tipo T y se asignan valores con el método Push. En el método GetEnumerator, los valores de la matriz se
devuelven utilizando la instrucción yield return.
Delegados
Cómo: Combinar delegados (delegados de multidifusión) (Guía de programación de C#)
Ofrece un ejemplo que muestra cómo componer delegados de multidifusión.
Cómo: Declarar un delegado, crear instancias del mismo y utilizarlo (Guía de programación de C#)
Ofrece un ejemplo que muestra cómo declarar un delegado, crear instancias y utilizarlo.
Sobrecarga de operadores
Cómo: Utilizar la sobrecarga de operadores para crear una clase de números complejos (Guía de programación de C#)
Muestra cómo utilizar la sobrecarga de operadores para crear una clase de números complejos Complex que define la suma
compleja.
Interoperabilidad
Cómo: Utilizar la interoperabilidad COM para corregir la ortografía con Word (Guía de programación de C#)
En este ejemplo se muestra cómo utilizar el corrector ortográfico de Word de una aplicación de C#.
Cómo: Utilizar la interoperabilidad COM para crear una hoja de cálculo Excel (Guía de programación de C#)
En este ejemplo se muestra cómo abrir una hoja de cálculo de Excel existente en C# mediante la función COM interop de
.NET Framework.
Cómo: Utilizar código administrado como complemento de automatización de Excel (Guía de programación de C#)
En este ejemplo se muestra cómo crear un complemento de C# para calcular el tipo del impuesto sobre la renta en una hoja
de cálculo de Excel.
Cómo: Utilizar la invocación de plataforma para reproducir un archivo de onda (Guía de programación de C#)
En este ejemplo se muestra cómo utilizar los servicios de invocación de plataforma para reproducir un archivo de sonido de
onda en la plataforma de Windows.
Código no seguro
Cómo: Utilizar punteros para copiar una matriz de bytes (Guía de programación de C#)
Muestra cómo utilizar punteros para copiar bytes de una matriz a otra.
Muestra cómo utilizar punteros para copiar bytes de una matriz a otra.
Cómo: Utilizar la función ReadFile de Windows (Guía de programación de C#)
Muestra cómo llamar a la función ReadFile de Windows, que requiere el uso de un contexto no seguro porque el búfer de
lectura requiere usar un puntero como parámetro.
Subprocesos
Utilizar subprocesos y subprocesamiento
Proporciona una lista de temas que explican la creación y administración de subprocesos administrados y cómo evitar
consecuencias no intencionadas.
Cómo: Crear y terminar subprocesos (Guía de programación de C#)
Ofrece un ejemplo que muestra cómo crear e iniciar un subproceso, y presenta la interacción entre dos subprocesos que se
ejecutan simultáneamente dentro del mismo proceso.
Cómo: Sincronizar un subproceso productor y un subproceso consumidor (Guía de programación de C#)
Ofrece un ejemplo que muestra cómo se puede lograr la sincronización utilizando la palabra clave lock de C# y el método
Pulse del objeto Monitor.
Cómo: Utilizar un grupo de subprocesos (Guía de programación de C#)
Explica un ejemplo que muestra cómo se utiliza un grupo de subprocesos.
Cadenas
Cómo: Buscar cadenas mediante expresiones regulares (Guía de programación de C#)
Explica cómo utilizar la clase Regex para buscar cadenas. Estas búsquedas pueden tener distinta complejidad, desde ser muy
sencillas hasta hacer un gran uso de expresiones regulares.
Cómo: Unir varias cadenas (Guía de programación de C#)
Contiene un ejemplo de código que muestra cómo unir varias cadenas.
Cómo: Buscar cadenas mediante los métodos String (Guía de programación de C#)
Contiene un ejemplo de código que muestra cómo utilizar los métodos String para buscar una cadena.
Cómo: Analizar cadenas con el método Split (Guía de programación de C#)
Contiene un ejemplo de código que muestra cómo se puede analizar una cadena con el método System.String.Split.
Cómo: Modificar el contenido de cadenas (Guía de programación de C#)
Contiene un ejemplo de código que extrae el contenido de una cadena en una matriz y, a continuación, modifica algunos
elementos de la matriz.
Atributos
Cómo: Crear una unión de C/C++ mediante atributos (Guía de programación de C#)
Contiene un ejemplo que utiliza el atributo Serializable para aplicar una característica concreta a una clase.
Trabajar con archivos DLL
Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#)
Muestra la generación y el uso de un archivo DLL utilizando un escenario de ejemplo.
Ensamblados
Cómo: Determinar si un archivo es un ensamblado (Guía de programación de C#)
Contiene un ejemplo que prueba un archivo DLL para ver si es un ensamblado.
Cómo: Cargar y descargar ensamblados (Guía de programación de C#)
Explica cómo se pueden cargar ensamblados concretos en el dominio de la aplicación actual en tiempo de ejecución.
Cómo: Compartir un ensamblado con otras aplicaciones (Guía de programación de C#)
Explica cómo compartir un ensamblado con otras aplicaciones.
Dominios de aplicación
Ejecutar código en otro dominio de aplicación (Guía de programación de C#)
Muestra cómo ejecutar un ensamblado que se ha cargado en otro dominio de aplicación.
Muestra cómo ejecutar un ensamblado que se ha cargado en otro dominio de aplicación.
Cómo: Crear y utilizar un dominio de aplicación (Guía de programación de C#)
Muestra cómo puede utilizarse la sobrecarga de operadores para implementar un tipo lógico de tres valores.
Ejemplos
Ejemplos de Visual C#
Contiene vínculos para abrir o copiar los archivos de ejemplo desde Ejemplo Hello World hasta
Ejemplo de clases genéricas (C#).
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

.NET Framework (Cómo se utiliza en C#)


Esta página proporciona vínculos a la Ayuda de las tareas más frecuentes de .NET Framework. Para ver otras categorías de
tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
General
Introducción al lenguaje C# y .NET Framework
Describe la relación entre el lenguaje C# y las bibliotecas de clases y el motor de ejecución de .NET Framework.
Información general acerca de .NET Framework
Proporciona introducciones generales a los conceptos de las principales características de .NET Framework, incluyendo
Common Language Runtime, la biblioteca de clases de .NET Framework y la interoperabilidad entre lenguajes.
Buscador rápido de tecnologías
Proporciona una referencia rápida a las áreas de tecnología principales de .NET Framework.
E/S de archivo
Cómo: Crear una lista de directorios
Crear un nuevo directorio.
Cómo: Leer y escribir en un archivo de datos recién creado
Leer y escribir en un archivo de datos recién creado.
Cómo: Abrir y anexar a un archivo de registro
Abrir un archivo de registro y anexarle texto.
Cómo: Escribir texto en un archivo
Escribir texto en un archivo.
Cómo: Leer texto de un archivo
Leer texto de un archivo.
Cómo: Leer caracteres de una cadena
Leer caracteres de una cadena.
Cómo: Escribir caracteres en una cadena
Escribir caracteres en una cadena.
Cómo: Agregar o quitar entradas de la lista de control de acceso
Agregar o quitar entradas de la lista de control de acceso (ACL) para mejorar la seguridad.
Cadenas
Crear cadenas nuevas
Cómo crear una nueva cadena.
Recortar y quitar caracteres
Cómo quitar caracteres del principio o fin de una cadena.
Cadenas de relleno
Cómo agregar tabulaciones o espacios al principio o fin de las cadenas.
Comparar cadenas
Cómo comparar dos cadenas para ver si son iguales.
Cambiar mayúsculas y minúsculas
Cómo cambiar letras mayúsculas por minúsculas, y viceversa.
Utilizar la clase StringBuilder
Técnicas eficaces de manipulación de cadenas de caracteres.
Cómo: Llevar a cabo manipulaciones de cadenas mediante operaciones de cadena básicas
Cómo dividir cadenas, anexar una cadena a otra, etc.
Cómo: Convertir tipos de datos mediante System.Convert
Contiene un ejemplo que utiliza la clase Convert para transformar un valor de cadena en un valor Boolean.
Cómo: Quitar caracteres no válidos de una cadena
Contiene un ejemplo que utiliza el método estático Regex.Replace para quitar los caracteres no válidos de una cadena.
Cómo: Comprobar si las cadenas tienen un formato de correo electrónico válido
Contiene un ejemplo que utiliza el método estático Regex.IsMatch para comprobar si una cadena tiene un formato válido de
correo electrónico.
Colecciones
Colecciones y estructuras de datos
Información general de las clases de colección de .NET Framework.
Seleccionar una clase de colección
Cómo elegir el tipo de colección que se va a utilizar.
Cuándo utilizar colecciones genéricas
Explica las ventajas de las clases de colección genéricas sobre las no genéricas.
System.Collections.Generic
Página de portal a las clases de colección genéricas.
List
Proporciona código de ejemplo que muestra cómo agregar y quitar elementos de una colección List<T>.
SortedDictionary
Proporciona código de ejemplo que muestra cómo agregar y quitar pares de clave y valor de una colección
SortedDictionary<K,V>.
Excepciones
Cómo: Utilizar excepciones específicas en un bloque Catch
Contiene un ejemplo que utiliza un bloque try/catch para detectar una excepción InvalidCastException.
Cómo: Utilizar el bloque Try/Catch para detectar excepciones
Contiene un ejemplo que utiliza un bloque try/catch para detectar una posible excepción.
Cómo: Crear excepciones definidas por el usuario
Contiene un ejemplo en el que una nueva clase de excepción, EmployeeListNotFoundException, se deriva de Exception.
Cómo: Utilizar bloques Finally
Contiene un ejemplo que utiliza un bloque try/catch para detectar una excepción ArgumentOutOfRangeException.
Cómo: Iniciar excepciones explícitamente
Contiene un ejemplo que utiliza un bloque try/catch para detectar una posible excepción FileNotFoundException.
Eventos
Cómo: Consumir eventos en una aplicación de Windows Forms
Contiene ejemplos que muestran cómo controlar un evento de clic de botón en un formulario Windows Forms.
Cómo: Conectar métodos controlador de eventos a eventos
Contiene ejemplos que muestran cómo agregar un método controlador de eventos para un evento.
Cómo: Provocar y utilizar eventos
Contiene un ejemplo que utiliza los conceptos descritos en detalle en Eventos y delegados y en Provocar un evento.
Cómo: Controlar varios eventos mediante propiedades de eventos
Contiene un ejemplo que muestra cómo controlar varios eventos mediante propiedades de evento.
Cómo: Implementar eventos en una clase
Contiene procedimientos que describen cómo implementar un evento en una clase.
Depuración
Vea Depurar (Cómo se procede en C#).
Implementación
Vea Seguridad (Cómo se implementa en C#).
Componentes a los que se proporciona servicio
Cómo crear un administrador de compensación de recursos (CRM)
Incluye ejemplos de código que muestran cómo crear un Administrador de compensación de recursos
Cómo crear un componente con servicio
Contiene un procedimiento que describe cómo crear un nuevo componente con servicio.
Cómo aplicar el atributo Description a un ensamblado
Muestra cómo aplicar el atributo DescriptionAttribute para establecer la descripción de un ensamblado.
Cómo usar los métodos SetAbort y SetComplete
Muestra cómo utilizar los métodos estáticos SetComplete y SetAbort de la clase ContextUtil.
Cómo aplicar el atributo ApplicationID a un ensamblado
Muestra cómo aplicar el atributo ApplicationID a un ensamblado.
Cómo crear un objeto agrupado y establecer sus límites de tamaño y tiempo de espera
Muestra cómo crear un objeto agrupado y establecer su tamaño y límites en tiempo de espera.
Cómo crear un método de servicio Web que utilice transacciones automáticas
Describe cómo crear un método de servicio Web que utiliza transacciones automáticas.
Cómo establecer la propiedad SoapRoot de una aplicación
Muestra cómo establecer la propiedad SoapVRoot en "MyVRoot".
Cómo establecer el tiempo de espera de las transacciones
Muestra cómo establecer el tiempo de espera de transacciones en 10 segundos.
Cómo establecer el nombre de la aplicación mediante el uso del atributo ApplicationName
Muestra cómo proporcionar el nombre de aplicación utilizando el atributo ApplicationName de nivel de ensamblado.
Cómo usar la característica Transacciones manuales de COM+
Contiene procedimientos que muestran la forma en que una clase derivada de la clase ServicedComponent puede utilizar
la característica BYOT de COM+ para tener acceso al Coordinador de transacciones distribuidas (DTC).
Cómo crear un componente privado
Muestra cómo utilizar el atributo PrivateComponentAttribute en una clase.
Cómo establecer el tipo de activación de una aplicación
Muestra cómo establecer el tipo de activación en "servidor".
Cómo habilitar la sincronización en instancias de una clase
Muestra cómo habilitar la sincronización en las instancias de la clase TestSync.
Cómo usar transacciones automáticas en una clase de .NET Framework
Describe cómo preparar una clase para participar en una transacción automática.
Cómo habilitar la activación JIT
Muestra cómo habilitar la activación y desactivación de JIT en y fuera de una clase.
Cómo establecer el atributo AutoComplete en una clase relacionada con transacciones
Muestra la posición del atributo AutoComplete en una clase relacionada con transacciones.
Cómo implementar un componente en cola que muestre un mensaje de manera asincrónica
Muestra cómo implementar un componente en cola que muestra de forma asincrónica un mensaje.
Cómo implementar eventos de correspondencia imprecisa
Contiene procedimientos que muestran cómo implementar una clase de evento y un receptor de eventos que implementan
una interfaz común de eventos y un editor para desencadenar el evento.
Cómo configurar la construcción de objetos
Contiene un procedimiento y un ejemplo que describen cómo configurar la construcción de objetos y establecer la cadena
de inicialización predeterminada de la clase TestObjectConstruct en "Initial Catalog=Northwind;Data
Source=.\\SQLServerInstance;Trusted_Connection=yes".
Dominios de aplicación y ensamblados
Cómo: Obtener información sobre tipos y miembros desde un ensamblado
Contiene un ejemplo que obtiene información de tipo y de miembro de un ensamblado.
Cómo: Generar un ensamblado de un solo archivo
Contiene un procedimiento que muestra cómo se crean ensamblados de un único archivo mediante compiladores de la línea
de comandos.
Cómo: Crear un dominio de aplicación
Crea un nuevo dominio de aplicación, le asigna el nombre MyDomain y, a continuación, imprime en la consola el nombre del
dominio host y el dominio de aplicación secundario recién creado.
Cómo: Determinar el nombre completo de un ensamblado
Muestra la forma de presentar el nombre completo de un ensamblado que contiene una clase especificada en la consola.
Cómo: Configurar un dominio de aplicación
Crea una instancia de la clase AppDomainSetup, utiliza esta clase para crear un nuevo dominio de aplicación, escribe la
información en la consola y, después, descarga el dominio de aplicación.
Cómo: Ver el contenido de un ensamblado
Contiene un ejemplo que comienza con un programa básico "Hello, World" y muestra cómo utilizar Ildasm.exe para
desensamblar el ensamblado Hello.exe y ver el manifiesto del ensamblado.
Cómo: Hacer referencia a un ensamblado con nombre seguro
Crea un ensamblado llamado myAssembly.dll que hace referencia a un ensamblado con nombre seguro llamado
myLibAssembly.dll desde un módulo de código llamado myAssembly.cs.
Cómo: Descargar un dominio de aplicación
Crea un nuevo dominio de aplicación denominado MyDomain, imprime cierta información en la consola y, a continuación,
descarga el dominio de aplicación.
Cómo: Quitar un ensamblado de la Caché de ensamblados global
Contiene un ejemplo que quita un ensamblado denominado hello.dll de la caché de ensamblados global.
Cómo: Instalar un ensamblado en la Caché de ensamblados global
Contiene un ejemplo que instala un ensamblado con el nombre de archivo hello.dll en la caché de ensamblados global.
Cómo: Generar un ensamblado de varios archivos
Describe el procedimiento utilizado para crear un ensamblado de archivo múltiple y proporciona un ejemplo completo que
ilustra cada uno de los pasos del procedimiento.
Cómo: Cargar ensamblados en un dominio de aplicación
Contiene un ejemplo que carga un ensamblado en el dominio de aplicación actual y, a continuación, ejecuta dicho
ensamblado.
Cómo: Firmar un ensamblado con un nombre seguro
Contiene un ejemplo que firma el ensamblado MyAssembly.dll con un nombre seguro utilizando el archivo de clave
sgKey.snk.
Cómo: Consultar el contenido de la Caché de ensamblados global
Muestra cómo utilizar la herramienta Caché de ensamblados global (Gacutil.exe) para ver el contenido de la caché de
ensamblados global.
Cómo: Crear un par de claves privada y pública
Muestra cómo firmar un ensamblado con un nombre seguro y cómo crear un par de claves mediante la herramienta de
nombre seguro (Sn.exe).
Interoperación
Cómo: Incrustar bibliotecas de tipos como recursos de Win32 en aplicaciones basadas en .NET
Muestra cómo incrustar una biblioteca de tipos como un recurso Win32 en una aplicación .NET Framework.
Cómo: Generar ensamblados de interoperabilidad primarios mediante Tlbimp.exe
Ofrece ejemplos que generan ensamblados de interoperabilidad primarios mediante Tlbimp.exe.
Cómo: Crear ensamblados de interoperabilidad primarios manualmente
Ofrece un ejemplo para crear manualmente ensamblados de interoperabilidad primarios.
Cómo: Generar ensamblados de interoperabilidad a partir de bibliotecas de tipos
Ofrece ejemplos para generar un ensamblado de interoperabilidad a partir de una biblioteca de tipos.
Cómo: Generar eventos controlados por un receptor COM
Ofrece un ejemplo que muestra un servidor administrado como el origen de eventos y un cliente COM como el receptor de
eventos.
Cómo: Personalizar contenedores a los que se puede llamar en tiempo de ejecución
Muestra cómo personalizar los contenedores a los que se puede llamar en tiempo de ejecución modificando el origen de IDL
o modificando un ensamblado importado.
Cómo: Configurar componentes basados en .NET para la activación sin registro
Explica cómo configurar los componentes basados en .NET Framework para la activación sin registro.
Cómo: Implementar funciones de devolución de llamada
Muestra la forma en que una aplicación administrada, utilizando la invocación de plataforma, puede imprimir el valor del
identificador de cada ventana en el equipo local.
Cómo: Asignar resultados HRESULT y excepciones
Contiene un ejemplo para crear una nueva clase de excepción llamada NoAccessException y asignarla a HRESULT
E_ACCESSDENIED.
Cómo: Editar ensamblados de interoperabilidad
Muestra cómo especificar cambios de cálculo de referencias en el Lenguaje intermedio de Microsoft (MSIL)
Cómo: Agregar referencias a bibliotecas de tipos
Explica los pasos necesarios para agregar una referencia a una biblioteca de tipos.
Cómo: Controlar eventos provocados por un origen COM
Incluye un ejemplo que muestra cómo se abre una ventana de Internet Explorer y se conectan los eventos provocados por el
objeto InternetExplorer con controladores de eventos implementados en código administrado.
Cómo: Crear contenedores manualmente
Muestra un ejemplo de la interfaz ISATest y de la clase SATest en IDL y los tipos correspondientes en código fuente de C#.
Cómo: Registrar ensamblados de interoperabilidad primarios
Incluye un ejemplo para registrar el ensamblado de interoperabilidad primario de CompanyA.UtilLib.dll.
Cómo: Incluir varias versiones de bibliotecas de tipos
Explica cómo incluir más de una versión de una biblioteca de tipos.
Seguridad
Vea Seguridad (Cómo se implementa en C#).
Serialización
Cómo deserializar un objeto
Ofrece un ejemplo que deserializa un objeto en un archivo.
Cómo utilizar la herramienta Definición de esquemas XML para generar clases y documentos de esquema XML
Proporciona procedimientos que muestran cómo utilizar la herramienta de definición de esquema XML para generar clases y
documentos de esquema XML.
Cómo especificar el nombre de un elemento alternativo para una secuencia XML
Muestra cómo generar más de una secuencia XML con el mismo conjunto de clases.
Cómo controlar la serialización de las clases derivadas
Ofrece un ejemplo que muestra cómo controlar la serialización de clases derivadas.
Cómo serializar un objeto como secuencia XML con codificación SOAP
Proporciona un procedimiento y un ejemplo para serializar un objeto como secuencia XML con codificación SOAP.
Cómo fragmentar datos serializados
Proporciona un procedimiento y un ejemplo para implementar la fragmentación en el servidor y
el procesamiento en el cliente.
Cómo serializar un objeto
Proporciona un procedimiento para serializar un objeto.
Cómo completar los nombres de elementos y atributos XML
Proporciona un procedimiento y un ejemplo para crear nombres completos en un documento XML.
Cómo reemplazar la serialización XML con codificación SOAP
Proporciona un procedimiento y un ejemplo para reemplazar la serialización de objetos como mensajes SOAP.
Codificación y localización
Cómo: Analizar dígitos Unicode
Proporciona un ejemplo que utiliza el método Decimal.Parse para analizar cadenas de valores de códigos Unicode que
especifican dígitos en diferentes sistemas de escritura.
Cómo: Crear referencias culturales personalizadas
Proporciona un procedimiento para definir y crear una referencia cultural personalizada.
Programación avanzada
Cómo: Definir y ejecutar métodos dinámicos
Muestra cómo definir y ejecutar un método dinámico simple y un método dinámico enlazado a una instancia de una clase.
Cómo: Examinar y crear instancias de tipos genéricos mediante la reflexión
Proporciona procedimientos que muestran cómo descubrir y manipular tipos genéricos.
Cómo: Definir un método genérico con Reflection Emit
Proporciona procedimientos que muestran cómo definir un método genérico con emisión de reflexión.
Cómo: Utilizar la firma total para asignar un nombre seguro a un ensamblado dinámico
Muestra cómo utilizar la firma completa para dar un nombre seguro a un ensamblado dinámico.
Cómo: Cargar ensamblados en el contexto de sólo reflexión
Proporciona un procedimiento y un ejemplo de código que muestran cómo cargar los ensamblados en el contexto de sólo
reflexión.
Cómo: Definir un tipo genérico con Reflection Emit
Muestra cómo crear un tipo genérico simple con dos parámetros de tipo, cómo aplicar restricciones de clase, restricciones de
interfaz y restricciones especiales a los parámetros de tipo y cómo crear miembros que utilizan los parámetros de tipo de la
clase como tipos de parámetro y tipos devueltos.
Tutoriales de .NET Framework
Tutorial: Agregar etiquetas inteligentes a un componente de formularios Windows Forms
Muestra cómo agregar etiquetas inteligentes utilizando código a partir de un control de ejemplo, ColorLabel, que se deriva
del control Label estándar de formularios Windows Forms.
Tutorial: Alterar el mensaje SOAP mediante extensiones SOAP
Muestra cómo generar y ejecutar una extensión SOAP.
Tutorial: Generar servicios Web XML básicos mediante ASP.NET
Muestra como generar un servicio Web XML básico con ASP.NET.
Tutorial: Personalizar páginas Web de ASP.NET Mobile para dispositivos específicos
Muestra cómo personalizar para dispositivos concretos.
Tutorial:Personalizar la generación de descripciones de servicio y clases de proxy
Muestra cómo personalizar la generación de Descripciones de servicio y clases de proxy.
Tutorial: Implementar manualmente una aplicación ClickOnce
Describe los pasos necesarios para crear una implementación completa de ClickOnce utilizando la línea de comandos o la
versión gráfica de la herramienta de generación y edición de manifiestos (Mage).
Tutorial: Descargar ensamblados a petición con la API de implementación de ClickOnce
Muestra cómo marcar determinados ensamblados de la aplicación como "opcional" y cómo descargarlos utilizando clases en
el espacio de nombres System.Deployment.Application cuando el Common Language Runtime (CLR) los solicite.
Tutorial: Implementar un editor de tipos con interfaz de usuario
Explica cómo puede crear su propio editor de tipos de interfaz de usuario para un tipo personalizado y mostrar la interfaz de
edición utilizando PropertyGrid.
Recursos adicionales
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza
regularmente con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con
nuevo contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se
actualiza regularmente con nuevo contenido.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Aplicaciones para Windows (Cómo se procede en C#)


Esta página proporciona vínculos a la ayuda de las tareas de aplicaciones para Windows más habituales. Para ver otras categorías de
tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
General
Información general de aplicaciones basadas en Windows
Ofrece una descripción general de las aplicaciones para Windows que se pueden crear con Microsoft Visual Studio 2005.
Elegir entre formularios Windows Forms y formularios Web Forms
Explica las características de cada tecnología para ayudarle a determinar qué es mejor para su aplicación.
Trabajar con formularios
Diseñador de Windows Forms
Cómo: Elegir el formulario de inicio en una aplicación para Windows
Proporciona información sobre cómo establecer el formulario de inicio en una aplicación para Windows.
Cómo: Conectar varios eventos con un único controlador de eventos en formularios Windows Forms
Explica cómo conectar varios eventos a un mismo controlador de eventos en una aplicación de Windows Forms utilizando la vista
Eventos de la ventana Propiedades en C#.
Cómo: Crear una interfaz de usuario de varios paneles con formularios Windows Forms
Explica cómo crear una interfaz de usuario multipanel similar a la que se utiliza en Microsoft Outlook, con una lista de carpetas, un
panel de mensajes y un panel de vista previa.
Cómo: Agregar imágenes de fondo a formularios Windows Forms
Explica cómo colocar una imagen de fondo en un control o en el mismo formulario. Puede lograrlo fácilmente utilizando la ventana
Propiedades.
Cómo: Establecer información sobre herramientas en controles de un formulario Windows Forms en tiempo de diseño
Explica cómo establecer una cadena de información sobre herramientas en el código o en el Diseñador de Windows Forms.
Cómo: Agregar controles ActiveX a formularios Windows Forms
Explica cómo colocar controles ActiveX en formularios Windows Forms.
Cómo: Crear teclas de acceso para controles de Windows Forms
Explica cómo crear una tecla de acceso en el texto de un menú, un elemento de menú o la etiqueta de un control tal como un botón.
Trabajar con formularios Windows Forms en tiempo de ejecución
Cómo: Agregar o quitar controles de una colección en tiempo de ejecución
Explica las tareas comunes en el desarrollo de aplicaciones, como agregar y quitar controles de cualquier control contenedor en un
formulario.
Cómo: Habilitar estilos visuales en Windows XP
Muestra cómo habilitar los estilos visuales en el área de cliente de un formulario Windows Forms.
Cómo: Hacer invisible un formulario Windows Forms de inicio
Muestra cómo hacer que el formulario principal de una aplicación basada en Windows sea invisible cuando la aplicación se inicializa.
Cómo: Mantener un formulario Windows Forms en primer plano
Muestra cómo hacer que un formulario sea de nivel superior en una aplicación de Windows Forms en tiempo de diseño o mediante
programación.
Cómo: Mostrar formularios Windows Forms modales y no modales
Muestra cómo mostrar un formulario como cuadro de diálogo modal o no modal.
Controles
Controles TextBox
Cómo: Seleccionar texto en el control TextBox de formularios Windows Forms
Muestra cómo seleccionar texto mediante programación en el control TextBox de los formularios Windows Forms.
Cómo: Insertar comillas en una cadena (formularios Windows Forms)
Muestra cómo colocar comillas ("") en una cadena de texto.
Cómo: Crear un cuadro de texto de sólo lectura (formularios Windows Forms)
Muestra cómo transformar un cuadro de texto modificable de formularios Windows Forms en un control de sólo lectura.
Cómo: Crear un cuadro de texto de contraseña con el control TextBox de formularios Windows Forms
Muestra cómo crear un cuadro de texto de contraseña con el control TextBox de los formularios Windows Forms.
Cómo: Controlar el punto de inserción en un control TextBox de formularios Windows Forms
Muestra cómo controlar el punto de inserción en un control TextBox.
Cómo: Enlazar datos al control MaskedTextBox
Muestra cómo enlazar datos a un control MaskedTextBox.
Tutorial: Trabajar con el control MaskedTextBox
Muestra la manera de realizar las tareas siguientes:
Inicializar el control MaskedTextBox.
Avisar al usuario cuando un carácter no es conforme a la máscara.
Avisar al usuario cuando el valor que intenta confirmar no es válido para el tipo.
Controles RichTextBox
Cómo: Cargar archivos en el control RichTextBox de formularios Windows Forms
Explica cómo cargar archivos en un control RichTextBox de formularios Windows Forms capaz de mostrar un archivo de texto sin
formato, texto sin formato Unicode o formato de texto enriquecido (RTF).
Cómo: Mostrar barras de desplazamiento en el control RichTextBox de formularios Windows Forms
Ofrece siete valores posibles para la propiedad ScrollBars del control RichTextBox, que se describen en la tabla siguiente.
Cómo: Establecer atributos de fuente para el control RichTextBox de formularios Windows Forms
Explica cómo mostrar los caracteres en negrita, subrayados o en cursiva mediante la propiedad SelectionFont.
Cómo: Establecer sangrías, sangrías francesas y párrafos con viñetas con el control RichTextBox de formularios Windows Forms
Explica cómo dar a los párrafos seleccionados el formato de lista con viñeta, estableciendo la propiedad SelectionBullet. También puede
utilizar las propiedades SelectionIndent, SelectionRightIndent y SelectionHangingIndent para establecer la sangría de los párrafos con
respecto a los bordes izquierdo y derecho del control, así como al borde izquierdo de las demás líneas de texto.
Cómo: Habilitar operaciones de arrastrar y colocar con el control RichTextBox de formularios Windows Forms
Explica cómo habilitar las operaciones de arrastrar y colocar con el control RichTextBox de formularios Windows Forms controlando los
eventos DragEnter y DragDrop.
Cómo: Mostrar vínculos de estilo Web con el control RichTextBox de formularios Windows Forms
Explica cómo escribir código que abra una ventana de exploración que muestre el sitio Web especificado en el texto del vínculo, al hacer
clic en el vínculo.
Controles Button
Cómo: Responder a clics de botones en formularios Windows Forms
Explica el uso más básico de un control Button de formularios Windows Forms, que consiste en ejecutar código cuando se haga clic en
el botón.
Cómo: Designar un botón de formularios Windows Forms como botón para aceptar mediante el Diseñador
Explica cómo designar un control Button como el botón que se utiliza para aceptar (también conocido como botón predeterminado).
Siempre que el usuario presione la tecla ENTRAR hará clic en el botón predeterminado, independientemente del control del formulario
que tenga el foco.
Cómo: Designar un botón de formularios Windows Forms como botón para cancelar mediante el Diseñador
Explica cómo designar un control Button para ser el botón de cancelación. Siempre que el usuario presione la tecla ESC hará clic en el
botón para cancelar, independientemente del control del formulario que tenga el foco. Habitualmente, este botón se programa para
permitir que el usuario salga rápidamente de una operación sin confirmar ninguna acción.
Controles CheckBox
Cómo: Establecer opciones con los controles CheckBox de formularios Windows Forms
Ofrece información sobre cómo un control CheckBox de los formularios Windows Forms se utiliza para ofrecer a los usuarios opciones
de tipo Verdadero/Falso o Sí/No. El control muestra una marca de verificación cuando está seleccionado.
Cómo: Responder a clics en casillas de verificación de formularios Windows Forms
Explica cómo programar la aplicación para que ejecute una acción determinada, dependiendo del estado de la casilla de verificación.
Control RadioButton
Cómo: Agrupar controles RadioButton de formularios Windows Forms para que funcionen como un conjunto
Explica cómo agrupar botones de opción dibujándolos dentro de un contenedor, por ejemplo, un control Panel, un control GroupBox o
un formulario.
Controles ListBox, ComboBox y CheckedListBox
Cómo: Enlazar un control ComboBox o ListBox de formularios Windows Forms a datos
Explica cómo enlazar a datos los controles ComboBox y ListBox para realizar tareas como examinar los datos de una base de datos,
escribir nuevos datos o modificar datos existentes.
Cómo: Crear una tabla de búsqueda para un control ComboBox, ListBox o CheckedListBox de Windows Forms
Proporciona tablas que muestran un ejemplo de cómo almacenar y mostrar datos de un formulario de pedido sobre comida.
Cómo: Agregar y quitar elementos de un control ComboBox, CheckedListBox o ListBox de formularios Windows Forms
Proporciona un ejemplo sobre cómo agregar elementos a un cuadro combinado, cuadro de lista o cuadro de lista activado de un
formulario Windows Forms. Sin embargo, este tema muestra el método más sencillo y no necesita ningún enlace de datos.
Cómo: Obtener acceso a elementos específicos de un control ComboBox, CheckedListBox o ListBox de formularios Windows Forms
Muestra cómo obtener acceso a elementos concretos de un cuadro combinado, cuadro de lista o cuadro de lista activado de un
formulario Windows Forms. Permite determinar mediante programación qué hay en una lista, en cualquier posición dada.
Cómo: Ordenar el contenido de un control ComboBox, CheckedListBox o ListBox de formularios Windows Forms
Muestra el uso de los orígenes de datos que permiten ordenar: vistas de datos, administradores de vistas de datos y matrices
ordenadas.
Control CheckedListBox
Cómo: Determinar los elementos activados en el control CheckedListBox de formularios Windows Forms
Muestra cómo determinar qué elementos están activados en el control CheckedListBox de formularios Windows Forms recorriendo en
iteración la colección almacenada en la propiedad CheckedItems o recorriendo la lista con el método GetItemChecked.
Controles DataGridView
Cómo: Enlazar datos al control DataGridView de formularios Windows Forms mediante el diseñador
Explica cómo utilizar el diseñador para conectar el control DataGridView a orígenes de datos de distinto tipo, como bases de datos,
objetos comerciales o servicios Web.
Cómo: Validar datos en el control DataGridView de formularios Windows Forms
Muestra cómo validar los datos escritos por un usuario en un control DataGridView.
Cómo: Controlar los errores que se producen durante la entrada de datos en el control DataGridView de formularios Windows Forms
Muestra cómo utilizar el control DataGridView para notificar al usuario los errores de entrada de datos.
Cómo: Especificar valores predeterminados para nuevas filas en el control DataGridView de formularios Windows Forms
Muestra cómo especificar los valores predeterminados para las nuevas filas utilizando el evento DefaultValuesNeeded.
Cómo: Crear un control DataGridView no enlazado en formularios Windows Forms
Muestra cómo rellenar mediante programación un control DataGridView sin enlazarlo a un origen de datos.
Cómo: Agregar una columna independiente a un control DataGridView de formularios Windows Forms enlazado a datos
Muestra cómo crear una columna independiente de botones Detalles para mostrar una tabla secundaria relacionada con una fila
concreta de una tabla primaria cuando se implementa un escenario principal/detalle.
Cómo: Mostrar imágenes en celdas del control DataGridView de formularios Windows Forms
Muestra cómo extraer un icono de un recurso incrustado y convertirlo a un mapa de bits para mostrarlo en todas las celdas de una
columna de imagen.
Cómo: Alojar controles en celdas DataGridView de formularios Windows Forms
Muestra cómo crear una columna de calendario. Las celdas de esta columna muestran fechas en celdas de cuadro de texto normales,
pero cuando el usuario edita una celda, aparece un control DateTimePicker.
Tutorial: Validar datos en el control DataGridView de formularios Windows Forms
Muestra cómo recuperar filas de la tabla de clientes de la base de datos de ejemplo Northwind y mostrarlas en un control
DataGridView. Cuando se edita una celda en la columna CompanyName y se intenta salir de ella, se comprueba la cadena del nuevo
nombre de empresa para asegurarse de que no está vacía; si el nuevo valor es una cadena vacía, el control DataGridView impedirá que
el cursor salga de la celda hasta que se escriba una cadena no vacía.
Tutorial: Controlar los errores que se producen durante la entrada de datos en el control DataGridView de formularios Windows Forms
Muestra cómo recuperar filas de la tabla de clientes de la base de datos de ejemplo Northwind y mostrarlas en un control
DataGridView. Cuando se detecta un valor CustomerID duplicado en una nueva fila o en una fila existente modificada, se produce el
evento DataError, que se controla mostrando un cuadro MessageBox en el que se indica la excepción.
Tutorial: Crear un control DataGridView sin enlazar en formularios Windows Forms
Muestra cómo rellenar un control DataGridView y administrar la adición y eliminación de filas en modo "independiente."
Diseño y formato de DataGridView
Cómo: Crear columnas de sólo lectura en el control DataGridView de formularios Windows Forms mediante el Diseñador
Muestra un procedimiento para hacer que las columnas que contienen los datos sean de sólo lectura.
Cómo: Habilitar la reordenación de columnas en el control DataGridView de formularios Windows Forms mediante el Diseñador
Muestra cómo permitir a los usuarios reordenar las columnas. Cuando se habilita la reordenación de columnas, los usuarios pueden
mover una columna a una nueva posición arrastrando el encabezado de columna con el mouse.
Cómo: Cambiar el orden de las columnas en el control DataGridView de formularios Windows Forms mediante el Diseñador
Explica cómo cambiar el orden de las columnas en el control DataGridView de formularios Windows Forms mediante el diseñador
Cómo: Agregar y quitar columnas en el control DataGridView de formularios Windows Forms mediante el Diseñador
Explica cómo agregar o quitar columnas en el control DataGridView de formularios Windows Forms mediante el diseñador.
Enlace de datos con controles
Cómo: Controlar errores y excepciones que se producen con el enlace de datos
Muestra cómo controlar los errores y excepciones que aparecen durante una operación de vínculo de datos.
Controles BindingSource
Cómo: Enlazar controles de Windows Forms con el componente BindingSource mediante el Diseñador
Muestra cómo enlazar un control en tiempo de diseño.
Cómo: Crear una tabla de búsqueda con el componente BindingSource de formularios Windows Forms
Muestra cómo utilizar un control ComboBox para mostrar el campo con la relación de clave externa del elemento primario a la tabla
secundaria.
Cómo: Reflejar las actualizaciones de los orígenes de datos en un control de Windows Forms con BindingSource
Muestra cómo utilizar el método ResetBindings para notificar a un control enlazado una actualización del origen de datos.
Cómo: Ordenar y filtrar datos ADO.NET con el componente BindingSource de formularios Windows Forms
Muestra cómo ordenar y filtrar los datos con BindingSource.
Cómo: Enlazar a un servicio Web mediante el componente BindingSource de formularios Windows Forms
Muestra cómo crear y enlazar a un proxy de cliente.
Examinador de vínculos
Cómo: Explorar datos con el control BindingNavigator de formularios Windows Forms
Explica cómo preparar el control BindingNavigator.
Cómo: Desplazarse por un conjunto de datos con el control BindingNavigator de formularios Windows Forms
Muestra cómo utilizar un control BindingNavigator para desplazarse a través de los resultados de una consulta de base de datos.
ListView
Cómo: Agregar y quitar elementos con el control ListView de Windows Forms
Explica el proceso de agregar y quitar un elemento a un control ListView de formularios Windows Forms. Puede agregar o quitar
elementos de la lista en cualquier momento.
Cómo: Agregar capacidades de búsqueda a un control ListView
Muestra cómo crear en poco tiempo aplicaciones con aspecto profesional en formularios Windows Forms.
Cómo: Seleccionar un elemento del control ListView de formularios Windows Forms
Muestra cómo seleccionar mediante programación un elemento en un control ListView de formularios Windows Forms.
Cómo: Mostrar iconos del control ListView de formularios Windows Forms
Muestra cómo mostrar imágenes en una vista de lista.
Cómo: Mostrar subelementos en columnas con el control ListView de formularios Windows Forms
Muestra cómo agregar subelementos a un elemento de lista.
TreeView
Cómo: Establecer iconos del control TreeView de formularios Windows Forms
Muestra cómo mostrar imágenes en una vista de árbol.
Cómo: Agregar y quitar nodos con el control TreeView de formularios Windows Forms
Muestra cómo agregar y quitar nodos de una vista de árbol mediante programación.
Cómo: Determinar en qué nodo de TreeView se hizo clic (formularios Windows Forms)
Muestra cómo determinar en qué nodo de TreeView se hizo clic.
Controles contenedores
Cómo: Dividir una ventana horizontalmente
Explica cómo implementar el divisor que divide horizontalmente el control SplitContainer.
Cómo: Crear una interfaz de usuario de varios paneles con formularios Windows Forms
Muestra cómo crear una interfaz de usuario multipanel similar a la que se utiliza en Microsoft Outlook, con una lista de carpetas, un
panel de mensajes y un panel de vista previa.
Cómo: Abarcar filas y columnas en un control TableLayoutPanel
Muestra la forma en que los controles de un control TableLayoutPanel pueden abarcar filas adyacentes y columnas.
Tutorial: Organizar controles en formularios Windows Forms mediante TableLayoutPanel
Muestra la manera de realizar las tareas siguientes:
Crear un proyecto de formularios Windows Forms.
Organizar controles en filas y columnas.
Establecer propiedades de fila y columna.
Abarcar filas y columnas con un control.
Control automático de desbordamientos.
Insertar controles haciendo doble clic en ellos en el Cuadro de herramientas.
Insertar un control dibujando su contorno.
Volver a asignar controles existentes a un control primario diferente.
Tutorial: Organizar controles en formularios Windows Forms mediante FlowLayoutPanel
Muestra la manera de realizar las tareas siguientes:
Crear un proyecto de formularios Windows Forms.
Organizar controles horizontalmente y verticalmente.
Cambiar la dirección de flujo.
Insertar saltos de flujo.
Organizar controles mediante el relleno y márgenes.
Insertar controles haciendo doble clic en ellos en el Cuadro de herramientas.
Insertar un control dibujando su contorno.
Insertar controles mediante el símbolo de intercalación.
Volver a asignar controles existentes a un control primario diferente.
Controles Picture e Image
Cómo: Cargar una imagen mediante el Diseñador (formularios Windows Forms)
Explica cómo cargar y mostrar en tiempo de diseño una imagen en un formulario estableciendo la propiedad Image en una imagen
válida.
Cómo: Establecer imágenes en tiempo de ejecución (formularios Windows Forms)
Explica cómo establecer mediante programación la imagen que muestra un control PictureBox de formularios Windows Forms.
Cómo: Modificar el tamaño o la situación de una imagen en tiempo de ejecución (formularios Windows Forms)
Explica cómo establecer la propiedad SizeMode de un control PictureBox de formularios Windows Forms en distintos valores
DateTimePicker
Cómo: Establecer y devolver fechas con el control DateTimePicker de formularios Windows Forms
Explica cómo establecer la propiedad Value antes de que el control se muestre para determinar qué fecha se seleccionará inicialmente
en el control.
Cómo: Mostrar una fecha en un formato personalizado con el control DateTimePicker de formularios Windows Forms
Explica cómo mostrar un formato personalizado y establecer la propiedad CustomFormat en una cadena de formato.
MonthCalendar
Cómo: Seleccionar un intervalo de fechas en el control MonthCalendar de formularios Windows Forms
Muestra cómo establecer un intervalo de fechas u obtener un intervalo de selección establecido por el usuario con propiedades del
control MonthCalendar.
Cómo: Mostrar días específicos en negrita con el control MonthCalendar de formularios Windows Forms
Muestra cómo hacer que una fecha aparezca en negrita o en la fuente normal.
Cómo: Mostrar más de un mes en el control MonthCalendar de formularios Windows Forms
Muestra cómo mostrar varios meses en un control MonthCalendar de formularios Windows Forms.
Cómo: Cambiar la apariencia del control MonthCalendar de formularios Windows Forms
Muestra cómo cambiar la combinación de colores del calendario de meses para mostrar la fecha actual en la parte inferior del control y
para mostrar números de semana.
Acceso a datos (para formularios Windows Forms)
Tutorial: Pasar datos entre formularios en una aplicación para Windows
Proporciona instrucciones detalladas para pasar datos desde un formulario a un método de un segundo formulario.
Tutorial: Mostrar datos en un formulario en una aplicación para Windows
Crea un formulario simple que muestra los datos de una tabla única en varios controles individuales.
Tutorial: Crear un formulario para buscar datos en una aplicación para Windows
Muestra cómo crear un formulario Windows Forms para buscar datos
ToolStrip
Cómo: Situar un control ToolStripItem en un control ToolStrip
Explica cómo desplazar o agregar un elemento ToolStripItem a la izquierda o a la derecha de un control ToolStrip.
Cómo: Deshabilitar ToolStripMenuItems mediante el Diseñador
Explica cómo deshabilitar en tiempo de diseño un elemento de menú.
Cómo: Mover elementos ToolStripMenuItems
Explica cómo mover los menús completos de nivel superior y sus elementos de menú a otro lugar de MenuStrip. También puede mover
elementos de menú individuales entre los menús de nivel superior o cambiar la posición de los elementos de menú dentro de un menú.
Cómo: Cambiar la apariencia del texto y las imágenes de ToolStrip en formularios Windows Forms
Explica cómo controlar si el texto y las imágenes se muestran en un elemento ToolStripItem y cómo se alinean con respecto a sí mismos
y a ToolStrip.
Menús contextuales
Cómo: Asociar un menú contextual con un componente NotifyIcon de formularios Windows Forms
Muestra cómo: Asociar un menú contextual con un componente NotifyIcon de formularios Windows Forms.
Cómo: Agregar y quitar elementos de menú con el componente ContextMenu de formularios Windows Forms
Explica cómo agregar y quitar elementos de un menú contextual en formularios Windows Forms.
Imprimir
Cómo: Crear trabajos de impresión estándar de formularios Windows Forms
Muestra cómo especificar qué imprimir y cómo imprimirlo escribiendo código para controlar el evento PrintPage.
Cómo: Completar trabajos de impresión de formularios Windows Forms
Muestra cómo finalizar un trabajo de impresión controlando el evento EndPrint del componente PrintDocument.
Cómo: Imprimir un archivo de texto de varias páginas en formularios Windows Forms
Muestra cómo imprimir texto en un formulario Windows Forms mediante métodos para dibujar objetos (gráficos o texto) en un
dispositivo, como una pantalla o impresora.
Cómo: Seleccionar las impresoras conectadas al equipo de un usuario en formularios Windows Forms
Muestra cómo elegir una impresora y, a continuación, imprimir un archivo.
Cómo: Capturar datos proporcionados por el usuario de un componente PrintDialog en tiempo de ejecución
Muestra cómo cambiar las opciones de impresión en tiempo de ejecución. Para ello se utiliza el componente PrintDialog y la clase
PrinterSettings.
Controles de usuario y controles personalizados
Agregar controles al control de usuario
Muestra cómo agregar controles al control de usuario.
Agregar código al control de usuario
Muestra cómo agregar código al control de usuario.
Interfaz de múltiples documentos (MDI)
Cómo: Crear formularios principales MDI
Muestra cómo crear un formulario MDI primario en tiempo de diseño.
Cómo: Crear formularios MDI secundarios
Muestra cómo crear formularios MDI secundarios que muestran un control RichTextBox, similar a la mayoría de las aplicaciones de
procesamiento de textos.
Cómo: Organizar formularios MDI secundarios
Muestra cómo mostrar los formularios secundarios en cascada, en mosaico horizontal o vertical, o en forma de iconos de formularios
secundarios dispuestos a lo largo de la parte inferior del formulario MDI.
Cómo: Determinar el formulario secundario MDI activo
Muestra cómo determinar el formulario secundario MDI activo y copiar el texto que contiene en el Portapapeles.
Cómo: Enviar datos al formulario secundario MDI activo
Muestra cómo enviar datos a la ventana secundaria MDI activa desde el Portapapeles.
Gráficos
Cómo: Dibujar una forma con contorno
Muestra la forma de dibujar elipses y rectángulos con contorno en un formulario.
Cómo: Crear un degradado lineal
Muestra cómo rellenar una línea, una elipse y un rectángulo con un pincel degradado lineal horizontal.
Cómo: Crear un degradado de trazado
Muestra cómo personalizar el modo de rellenar una forma con colores que cambian gradualmente.
Cómo: Crear figuras a partir de líneas, curvas y formas
Explica cómo crear un trazado compuesto por una o varias figuras.
Cómo: Crear objetos Graphics para dibujar
Explica cómo crear objetos gráficos para dibujar.
Cómo: Crear imágenes en miniatura
Muestra cómo construir un objeto de imagen a partir de un archivo de mapa de bits.
Cómo: Crear texto vertical
Muestra cómo utilizar un objeto StringFormat para especificar que el texto se dibuje en vertical y no en horizontal.
Cómo: Alinear texto dibujado
Muestra cómo dibujar texto en un rectángulo. Todas las líneas del texto están centradas y todo el bloque de texto está centrado en el
rectángulo.
Cómo: Dibujar una línea en un formulario Windows Forms
Muestra cómo dibujar una línea en un formulario.
Cómo: Girar, reflejar y sesgar imágenes
Muestra cómo rotar, reflejar y sesgar una imagen especificando puntos de destino para las esquinas superior izquierda, superior
derecha e inferior izquierda de la imagen original.
Cómo: Dibujar texto en un formulario Windows Forms
Muestra cómo utilizar el método DrawString de los gráficos para dibujar texto en un formulario.
Cómo: Cargar y mostrar mapas de bits
Muestra cómo cargar un mapa de bits de un archivo y mostrarlo en la pantalla.
Cómo: Cargar y mostrar metarchivos
Muestra cómo utilizar los métodos de la clase Metafile para registrar, mostrar y examinar imágenes vectoriales.
Adaptar y globalizar formularios Windows Forms
Tutorial: Adaptar formularios Windows Forms
Muestra los procesos de localización de un proyecto de aplicación para Windows.
Cómo: Admitir la localización en formularios Windows Forms mediante AutoSize y el control TableLayoutPanel
Muestra cómo habilitar un diseño que se adapta a distintos tamaños de cadenas.
Cómo: Establecer la referencia cultural y la referencia cultural de la interfaz de usuario para la globalización de formularios Windows Forms
Muestra cómo establecer opciones de formato apropiadas para una referencia cultural determinada.
Cómo: Mostrar texto de derecha a izquierda en formularios Windows Forms para la globalización
Muestra cómo obtener una presentación de derecha a izquierda
Recursos adicionales
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza regularmente
con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con nuevo
contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se actualiza
regularmente con nuevo contenido.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Páginas Web y servicios Web (Cómo se crean en C#)


Esta página proporciona vínculos a la ayuda de las tareas más habituales de aplicaciones Web. Para ver otras categorías de
tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
Páginas Web
Lo nuevo en el desarrollo Web de Visual Studio
Introducción a Visual Web Developer, la herramienta de desarrollo para crear páginas Web ASP.NET.
Introducción a páginas Web de ASP.NET
Proporciona información general sobre las características fundamentales de funcionamiento de las páginas Web de ASP.NET
en aplicaciones Web.
Servicios Web
Documentos y datos XML
Vínculos a artículos sobre la lectura y escritura de documentos y datos XML.
Servicios Web XML en código administrado
Vínculos a artículos sobre la creación e implementación de servicios Web XML y el acceso a servicios Web XML en código
administrado.
Introducción a los servicios Web XML en Visual Basic y Visual C#
Describe la forma en que Visual Studio y los servicios Web XML proporcionan un modelo sencillo, flexible y basado en
estándares que permite a los programadores ensamblar aplicaciones con independencia de la plataforma, el lenguaje de
programación y el modelo de objetos.
Cómo: Obtener acceso a un servicio Web XML en código administrado
Describe cómo tener acceso a los servicios Web.
Cómo: Obtener acceso a un servicio Web XML de manera asincrónica en código administrado
Describe el enfoque asincrónico para tener acceso a los servicios Web.
Cómo tener acceso a servicios Web XML desde un explorador
Describe cómo tener acceso a los servicios Web XML desde un explorador.
Cómo: Explorar el contenido de un servicio Web XML
Describe cómo explorar el contenido del servicio Web XML.
Cómo: Crear un proyecto Servicio Web ASP.NET
Describe cómo crear proyectos de servicio Web ASP.NET.
Cómo: Utilizar el atributo WebService
Describe cómo utilizar el atributo WebService para especificar el espacio de nombres y texto descriptivo para el servicio Web
XML.
Cómo: Heredar de la clase WebService
Describe cómo heredar de la clase WebService.
Cómo: Crear un método de servicio Web XML
Describe cómo crear un método de servicio Web XML.
Cómo: Utilizar el atributo WebMethod
Describe cómo utilizar el atributo WebMethod para indicar que desea que el método se exponga como parte del servicio
Web XML.
Cómo: Depurar servicios Web XML en código administrado
Describe cómo depurar los servicios Web XML en código administrado.
Cómo: Implementar servicios Web XML en código administrado
Describe cómo implementar servicios Web XML en código administrado.
Cómo: Generar un proxy de servicio Web XML
Describe cómo generar un servidor proxy del servicio Web XML.
Cómo crear un cliente de aplicación de consola
Describe cómo crear un cliente de servicio Web para una aplicación de consola.
Cómo controlar excepciones iniciadas por un método de servicio Web
Describe cómo controlar las excepciones producidas por un método de servicio Web.
Cómo implementar un cliente de servicios Web asincrónicos con la técnica de devolución de llamada
Describe cómo implementar un cliente de servicio Web asincrónico mediante la técnica de devolución de llamada.
Cómo implementar un cliente de servicios Web asincrónicos con la técnica de espera
Describe cómo implementar un cliente de servicio Web asincrónico mediante la técnica Wait.
Tutorial: Redirigir una aplicación para que apunte a un servicio Web XML diferente en la instalación
Muestra cómo crear una aplicación Web que se pueda redirigir a un servicio Web XML diferente utilizando la propiedad de
comportamiento de dirección URL, una clase de instalador, y un proyecto de programa de instalación Web.
Proteger servicios Web XML creados mediante ASP.NET
Resume las opciones de autenticación y autorización disponibles para lo servicios Web generados con ASP.NET.
Recursos adicionales
Estos sitios requieren una conexión a Internet.
Centro para desarrolladores de servicios Web de MSDN y otras tecnologías distribuidas
Artículos, ejemplos de código y muchos otros recursos para desarrollar y conectar a los servicios Web.
Centro para desarrolladores de XML en MSDN
Artículos, ejemplos de código y muchos otros recursos para trabajar con datos XML.
Centro para desarrolladores de Microsoft ASP.NET
Artículos, ejemplos de código y muchos otros recursos para crear páginas Web ASP.NET.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Depurar (Cómo se procede en C#)


Esta página proporciona vínculos a la ayuda de las tareas de depuración más habituales. Para ver otras categorías de tareas
frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
Utilizar el depurador de Visual Studio
Generación de aplicaciones en Visual Studio
Describe las herramientas para probar y depurar continuamente las aplicaciones a medida que se generan.
Depurar en Visual Studio
Explica los fundamentos del uso del depurador de Visual Studio.
Guía básica del depurador
Vínculos a artículos sobre tareas básicas de depuración y características del depurador.
Funcionalidad de seguimiento de .NET Framework
Cómo: Agregar instrucciones de seguimiento al código de una aplicación
Explica cómo utilizar los métodos Write, WriteIf, WriteLine, WriteLineIf, Assert y Fail para hacer el seguimiento de la
aplicación.
Cómo: Crear e inicializar agentes de escucha de seguimiento
Explica cómo crear e inicializar agentes de escucha de seguimiento.
Cómo: Utilizar TraceSource y filtros con agentes de escucha de seguimiento
Describe el uso de TraceSource asociado a un archivo de configuración de la aplicación.
Cómo: Crear e inicializar modificadores de seguimiento
Explica cómo crear e inicializar un modificador de seguimiento.
Cómo: Realizar compilación condicional con Trace y Debug
Explica como especificar de varias formas las opciones del compilador para una aplicación.
Cómo: Crear e inicializar orígenes de seguimiento
Explica cómo utilizar los archivos de configuración para facilitar la reconfiguración del seguimiento producido por los
orígenes de seguimiento en tiempo de ejecución.
Mejorar la depuración con los atributos de visualización del depurador
Explica cómo mejorar la depuración con los atributos de visualización del depurador.
Cómo: Realizar el seguimiento del código en una aplicación
Explica cómo utilizar la clase Trace, que permite instrumentar la aplicación.
Cómo: Configurar modificadores de seguimiento
Explica cómo utilizar el archivo .config para configurar los modificadores.
Depurar servicios Web
Tutorial: Depurar un servicio Web XML
Describe los pasos necesarios para depurar servicios Web.
Depurar formularios Windows Forms
Tutorial: Depurar un formulario Windows Forms
Describe cómo depurar aplicaciones de Windows Forms.
Depurar aplicaciones de SQL
Tutorial: Depurar una función con valores de tabla definida por el usuario de SQL CLR
Muestra cómo depurar una función con valores de tabla definida por el usuario (UDF) de SQL CLR.
Tutorial: Depurar un desencadenador de SQL CLR
Muestra cómo depurar un desencadenador de SQL CLR. Utiliza la tabla Contact de la base de datos de ejemplo
AdventureWorks, que es una de las bases de datos que se instalan con SQL Server 2005. El ejemplo crea un nuevo
desencadenador de inserción de CLR en la tabla Contact.
Tutorial: Depurar un tipo definido por el usuario de SQL CLR
Muestra cómo depurar un tipo definido por el usuario de SQL/CLR. Se crea un nuevo tipo de SQL/CLR en la base de datos
de ejemplo Adventureworks. A continuación se utiliza el tipo en una definición de tabla, una instrucción INSERT y una
instrucción SELECT.
Tutorial: Depurar una función escalar definida por el usuario de SQL CLR
Muestra cómo depurar una función definida por el usuario (UDF) de SQL CLR. Crea una nueva función definida por el
usuario de SQL CLR en la base de datos de ejemplo Adventureworks.
Tutorial: Depurar un agregado definido por el usuario de SQL CLR
Muestra cómo depurar un agregado definido por el usuario de CLR SQL. En este ejemplo se crea en la base de datos de
ejemplo Adventureworks una nueva función agregada de CLR SQL denominada Concatenar. Cuando esta función se
invoca en una instrucción SQL, concatenará todos los valores de la columna especificada como parámetro de entrada.
Depuración de bases de datos de T-SQL
Describe los procedimientos de instalación necesarios y proporciona un ejemplo que muestra cómo depurar una aplicación
de base de datos de varios niveles.
Tutorial: Depurar un desencadenador de T-SQL
Describe un ejemplo que utiliza la base de datos Adventureworks, que tiene una tabla Sales.Currency con un
desencadenador UPDATE. El ejemplo incluye un procedimiento almacenado que actualiza una fila en la tabla, lo que activará
al desencadenador. Establezca los puntos de interrupción en el desencadenador y, a través de la ejecución con diferentes
parámetros del procedimiento almacenado, puede seguir las diferentes rutas de acceso de ejecución en el desencadenador.
Tutorial: Depurar una función definida por el usuario de T-SQL
Describe un ejemplo que utiliza la función definida por el usuario (UDF) existente en la base de datos AdventureWorks con
nombre ufnGetStock, esta función devuelve un recuento de elementos en existencia para un ProductID determinado.
Tutorial: Depurar un procedimiento almacenado de T-SQL
Muestra cómo crear y depurar un procedimiento almacenado de T-SQL mediante la depuración de base de datos directa; es
decir, a través del Explorador de servidores. También se muestran diferentes técnicas de depuración como establecer puntos
de interrupción, ver elementos de datos, etc.
Recursos adicionales
Este sitio requiere una conexión a Internet.
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones. Este sitio se actualiza regularmente
con nuevo contenido.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Acceso a datos (Cómo se utiliza en C#)


Esta página proporciona vínculos a la ayuda de las tareas de acceso a datos más habituales. Para ver otras categorías de tareas
frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
General
Cómo: Instalar bases de datos de ejemplo
Describe los pasos necesarios para instalar una base de datos de ejemplo, como Northwind, SQL Server Express (SSE), MSDE
o una versión de Access de Northwind.
Tutorial: Crear una aplicación de datos sencilla
Ofrece un procedimiento paso a paso para crear una aplicación de datos.
Conectarse a datos en Visual Studio
Conectarse a datos en Información general de Visual Studio
Ofrece información sobre cómo conectar la aplicación a los datos de muchos orígenes diferentes, como bases de datos,
servicios Web y objetos.
Tutorial: Conexión a los datos de una base de datos
Describe un procedimiento para conectar la aplicación a los datos en Visual Studio utilizando el Asistente para la
configuración de orígenes de datos.
Tutorial: Conectarse a datos en un servicio Web
Describe un procedimiento para conectar la aplicación al servicio Web de los datos utilizando el Asistente para la
configuración de orígenes de datos.
Tutorial: Conectarse a datos en una base de datos de Access
Describe un procedimiento para conectar la aplicación a los datos de una base de datos de Access utilizando el Asistente
para la configuración de orígenes de datos.
Crear y diseñar conjuntos de datos con tipo
Cómo: Crear un conjunto de datos con tipo
Explica cómo crear un conjunto de datos con tipo mediante el Asistente para la configuración de orígenes de datos o el
Diseñador de DataSet.
Tutorial: Crear un conjunto de datos con el Diseñador de Dataset
Describe un procedimiento para crear un conjunto de datos mediante el Diseñador de DataSet.
Tutorial: Crear un DataTable en el Diseñador de Dataset
Describe un procedimiento para crear un objeto DataTable mediante el Diseñador de DataSet.
Tutorial: Crear una relación entre tablas de datos
Explica cómo crear dos tablas de datos sin TableAdapters utilizando el Diseñador de DataSet y creando una relación entre
ellas.
TableAdapters
Información general sobre TableAdapter
Ofrece una descripción general de los TableAdapters, que proporcionan comunicación entre la aplicación y una base de
datos.
Tutorial: Crear un objeto TableAdapter con varias consultas
Describe un procedimiento para crear un TableAdapter en un conjunto de datos utilizando el Asistente para la configuración
de orígenes de datos. El tutorial le acompañará a lo largo del proceso de crear una segunda consulta en el TableAdapter
utilizando el Asistente para la configuración de consultas de TableAdapter dentro del Diseñador de DataSet.
Rellenar conjuntos de datos y ejecutar consultas
Información general sobre cómo rellenar conjuntos de datos y consultar datos
Explica cómo ejecutar instrucciones SQL o procedimientos almacenados contra un origen de datos mediante TableAdapters
u objetos de comando.
Tutorial: Rellenar un conjunto de datos con datos
Muestra cómo crear un conjunto de datos con una tabla de datos y rellenarla con datos de la tabla de clientes de la base de
datos de ejemplo Northwind.
Tutorial: Leer datos XML e introducirlos en un conjunto de datos
Muestra cómo crear una aplicación para Windows que cargará datos XML en un conjunto de datos.
Mostrar datos en formularios Windows Forms
Información general sobre la presentación de datos
Ofrece un resumen de las tareas, objetos y cuadros de diálogo necesarios para crear aplicaciones para Windows enlazadas a
datos.
Tutorial: Mostrar datos en un formulario en una aplicación para Windows
Describe un procedimiento para crear un formulario simple que muestra los datos de una tabla única en varios controles
individuales.
Tutorial: Mostrar datos relacionados en un formulario en una aplicación para Windows
Ofrece un procedimiento para trabajar con datos procedentes de más que una tabla y, a menudo, de tablas relacionadas.
Tutorial: Crear un formulario para buscar datos en una aplicación para Windows
Muestra cómo crear una consulta que devuelve los clientes de una ciudad específica y modifica la interfaz de usuario para
que los usuarios puedan escribir el nombre de una ciudad y presionar un botón para ejecutar la consulta.
Tutorial: Crear una tabla de búsqueda
Describe un procedimiento para mostrar información de una tabla basada en el valor de un campo de clave externa en otra
tabla.
Enlace de datos
Tutorial: Crear un control de usuario que admita el enlace de datos simple
Muestra cómo crear un control que implementa DefaultBindingPropertyAttribute. Este control puede contener una
propiedad que se puede enlazar a datos; es similar a TextBox o CheckBox.
Tutorial: Crear un control de usuario que admita el enlace de datos complejo
Muestra cómo crear un control que implementa ComplexBindingPropertiesAttribute. Este control contiene una propiedad
DataSource y DataMember que se puede enlazar a datos; similar a DataGridView o ListBox.
Tutorial: Crear un control de usuario que admita el enlace de datos de búsqueda
Muestra cómo crear un control que implementa LookupBindingPropertiesAttribute. Este control contiene tres propiedades
que se pueden enlazar a datos; similar a ComboBox.
Enlace de objetos en Visual Studio
Explica las herramientas en tiempo de diseño necesarias para trabajar con objetos personalizados (a diferencia de los
conjuntos de datos y servicios Web) como origen de datos de la aplicación.
Editar datos en conjuntos de datos (DataTables)
Información general sobre la edición de datos en conjuntos de datos
Muestra una tabla que contiene los vínculos a las tareas comunes asociadas con la edición y consulta de datos en un
conjunto de datos.
Validar datos
Información general sobre validación de datos
Ofrece una descripción general de la validación de datos, el proceso de confirmar que los valores que se especifican en los
objetos de datos son compatibles con las restricciones dentro de un esquema del conjunto de datos, al igual que las reglas
establecidas para su aplicación.
Tutorial: Agregar validación a un conjunto de datos
Explica cómo utilizar el evento ColumnChanging para comprobar que se especifica un valor aceptable en el registro.
Guardar datos
Información general sobre cómo guardar datos
Explica la forma en que el proceso de escribir información en el origen de datos original es independiente del proceso de
modificar los datos en el conjunto de datos.
Control de concurrencia en ADO.NET
Explica los métodos comunes de control de concurrencia, así como características específicas de ADO.NET para controlar los
errores de concurrencia.
Tutorial: Guardar datos con los métodos DBDirect de un TableAdapter
Ofrece instrucciones detalladas para ejecutar directamente las instrucciones SQL contra una base de datos utilizando los
métodos DbDirect de un TableAdapter.
Tutorial: Controlar una excepción de concurrencia
Contiene un procedimiento para crear una aplicación para Windows que ilustra cómo detectar una excepción
DBConcurrency, ubicar la fila que produjo el error y una estrategia para controlarlo.
Recursos de datos
Elementos de la interfaz de usuario de datos
Incluye información sobre todos los cuadros de diálogo y asistentes utilizados para diseñar accesos a datos en sus
aplicaciones.
Adaptadores de datos ADO.NET
Ofrece información acerca de los objetos adaptadores de datos de ADO.NET y de cómo trabajar con ellos en Visual Studio.
Crear objetos de SQL Server 2005 en código administrado
Proyectos de SQL Server
Explica cómo utilizar los lenguajes .NET además del lenguaje de programación Transact-SQL para crear objetos de base de
datos como procedimientos almacenados y desencadenadores, y para recuperar y actualizar datos para bases de datos de
Microsoft SQL Server 2005.
Tutorial: Crear un procedimiento almacenado en código administrado
Ofrece instrucciones paso paso para las siguientes tareas:
Crear un procedimiento almacenado en código administrado.
Implementar el procedimiento almacenado en una base de datos de SQL Server 2005.
Crear una secuencia de comandos para probar el procedimiento almacenado en la base de datos.
Consultar datos en la base de datos para confirmar que el procedimiento almacenado se ha ejecutado correctamente.
Recursos adicionales
Los sitios siguientes requieren una conexión a Internet.
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza
regularmente con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con
nuevo contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se
actualiza regularmente con nuevo contenido.
Centro para desarrolladores de acceso a datos y almacenamiento
Contiene muchos artículos y recursos sobre cómo utilizar las tecnologías de acceso a datos de Microsoft en sus aplicaciones
Centro para desarrolladores de SQL Server
Contiene muchos artículos y recursos sobre cómo utilizar SQL Server.
Contiene muchos artículos y recursos sobre cómo utilizar SQL Server.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Diseñar clases (Cómo se procede en C#)


Esta página proporciona vínculos a la ayuda de las tareas más habituales del Diseñador de clases de C#. Para ver otras
categorías de tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
Diseñador de clases
Cómo: Crear tipos en diagramas de clase
Describe cómo crear los nuevos tipos, como clases, enumeraciones, interfaces, estructuras y delegados.
Crear y configurar miembros de tipo
Describe cómo trabajar con miembros de tipos.
Cómo: Heredar de un tipo genérico
Explica cómo establecer una relación en la que una clase hereda de un genérico.
Cómo: Definir la herencia entre tipos
Explica cómo utilizar el Diseñador de clases para definir una relación de herencia entre dos tipos que aparecen en un
diagrama de clase.
Cómo: Definir asociaciones entre tipos
Explica cómo definir una asociación. En el Diseñador de clases, las líneas de asociación muestran la forma en que se
relacionan las clases en un diagrama.
Cómo: Eliminar formas de tipos y código asociado de los diagramas de clase
Describe cómo eliminar una forma, o bien la forma y el código, del diagrama de clase.
Cómo: Aplicar atributos personalizados a tipos y miembros de tipo
Explica cómo aplicar un atributo personalizado a un tipo o a un miembro de un tipo.
Trabajar con clases y otros tipos
Cómo: Ver la herencia entre tipos
Muestra cómo mostrar el tipo base de un tipo seleccionado, suponiendo que exista una relación de herencia entre el tipo y
su tipo base.
Cómo: Ver tipos derivados
Muestra los tipos derivados de un tipo seleccionado. Se supone que existe una relación de herencia entre el tipo y su clase o
interfaz base.
Cómo: Quitar formas de tipo de diagramas de clase
Contiene un procedimiento que muestra cómo quitar una forma de un diagrama.
Cómo: Ver compartimientos en formas de tipo
Contiene un procedimiento que muestra cómo mostrar u ocultar un compartimiento.
Cómo: Ver detalles de tipo
Contiene un procedimiento que muestra cómo mostrar detalles de un tipo.
Cómo: Cambiar entre notación de miembro y notación de asociación
Contiene un procedimiento que muestra cómo cambiar entre la notación de miembro y una asociación.
Cómo: Ver miembros de tipo
Contiene un procedimiento que muestra cómo mostrar u ocultar un miembro dentro de un tipo.
Cómo: Agregar diagramas de clase a proyectos
Contiene un procedimiento que muestra cómo agregar un diagrama de clase a un proyecto.
Cómo: Ver tipos existentes
Contiene un procedimiento que muestra cómo visualizar los tipos existentes en la superficie de diseño.
Cómo: Agregar diagramas de clase a proyectos
Contiene un procedimiento que muestra cómo agregar un diagrama de clase a un proyecto.
Comprender el código escrito por otro
Explica cómo utilizar el Diseñador de clases de Visual Studio como herramienta para entender las clases y tipos escritos por
otros. La herramienta muestra una representación gráfica del código. Puede personalizar esta vista para adaptarla a sus
preferencias.
Cómo: Agrupar miembros de tipo
Contiene un procedimiento que muestra cómo agrupar miembros por tipo o modificador de acceso o cómo ordenarlos
alfabéticamente.
Cómo: Agregar comentarios a diagramas de clase
Contiene un procedimiento que muestra cómo utilizar formas de comentario para anotar diagramas de clase.
Personalizar diagramas de clase
Contiene un procedimiento que muestra cómo cambiar la forma en que los diagramas de clase muestran información sobre
el proyecto.
Cómo: Copiar elementos del diagrama de clase en un documento de Microsoft Office
Contiene un procedimiento que muestra cómo copiar una, varias o todas las formas de un diagrama de clase a otros
documentos.
Cómo: Imprimir diagramas de clase
Contiene un procedimiento que muestra cómo imprimir un diagrama de clase mediante la función de impresión de Visual
Studio.
Cómo: Reemplazar los miembros de tipo
Contiene un procedimiento que muestra cómo utilizar el Diseñador de clases para que un miembro de una clase secundaria
reemplace (proporcione una nueva implementación) a un miembro heredado de una clase base.
Cómo: Cambiar el nombre de tipos y miembros de tipo
Contiene un procedimiento que muestra cómo cambiar el nombre de un tipo o de un miembro de tipo con el Diseñador de
clases, la ventana Detalles de clase o la ventana Propiedades.
Cómo: Mover un miembro de tipo de un tipo a otro
Contiene un procedimiento que muestra cómo mover un miembro de tipo de un tipo a otro si ambos son visibles en el
diagrama de clase actual.
Cómo: Implementar una interfaz
Explica cómo utilizar el Diseñador de clases para crear, implementar y eliminar interfaces.
Cómo: Implementar una clase abstracta
Contiene un procedimiento que muestra cómo utilizar el Diseñador de clases para implementar una clase abstracta.
Cómo: Extraer a la interfaz (sólo C#)
Contiene un procedimiento que muestra cómo extraer uno o varios miembros públicos de un tipo en una nueva interfaz.
Cómo: Reorganizar parámetros (Sólo C#)
Contiene un procedimiento que muestra cómo reordenar los parámetros de métodos de los tipos mostrados en el
Diseñador de clases.
Crear y modificar miembros de tipos
Cómo: Abrir la ventana Detalles de clase
Describe la forma en que la ventana Detalles de clase permite configurar los miembros de un tipo.
Elementos de la ventana Detalles de clase
Describe los aspectos de las filas mostrados en la ventana Detalles de clase.
Cómo: Crear un miembro
Explica cómo crear un miembro utilizando cualquiera de las herramientas siguientes: Diseñador de clases, barra de
herramientas de la ventana Detalles de clase o ventana Detalles de clase.
Cómo: Agregar un parámetro a un método
Explica cómo agregar un parámetro a un método a través de la ventana Detalles de clase.
Cómo: Modificar los miembros de tipo
Describe cómo modificar los miembros de un tipo creado en el Diseñador de clases utilizando la ventana Detalles de clase.
Notas de utilización de la ventana Detalles de clase
Ofrece sugerencias sobre cómo utilizar la ventana Detalles de clase.
Mostrar información de sólo lectura
Explica la forma en que el Diseñador de clases y la ventana Detalles de clase pueden mostrar los tipos (y miembros de tipos)
de un proyecto o de un proyecto o ensamblado al que se hace referencia desde un proyecto.
Guía de diseño de bibliotecas de clases
Cómo: Implementar un diseñador para un control
Describe cómo implementar un diseñador (HelpLabelDesigner) para el control proveedor extensor HelpLabel.
Cómo: Crear y configurar componentes en modo de diseño
Muestra cómo utilizar los servicios del diseñador para crear e inicializar componentes en el diseñador personalizado.
Cómo: Obtener acceso a las funciones en tiempo de diseño de formularios Windows Forms
Describe los pasos necesarios para obtener acceso a la compatibilidad en tiempo de diseño que proporciona .NET
Framework.
Cómo: Implementar un proveedor extensor HelpLabel
Muestra cómo generar un proveedor extensor mediante la creación del control HelpLabel.
Cómo: Obtener acceso a servicios en tiempo de diseño
Muestra como obtener acceso al variado conjunto de servicios de .NET Framework para poder integrar componentes y
controles en el entorno de diseño.
Cómo: Serializar colecciones de tipos estándar con DesignerSerializationVisibilityAttribute
Muestra cómo se utiliza la clase DesignerSerializationVisibilityAttribute para controlar cómo se serializa una colección en
tiempo de diseño.
Cómo: Llevar a cabo una inicialización personalizada de controles en modo de diseño
Muestra cómo inicializar un control cuando lo crea el entorno de diseño.
Cómo: Implementar un convertidor de tipos
Muestra cómo utilizar un convertidor de tipos para convertir valores entre tipos de datos, y ayudar en la configuración de
propiedades en tiempo de diseño al proporcionar una conversión de texto a valor o una lista desplegable de valores que se
pueden seleccionar.
Cómo: Implementar un editor de tipos de interfaz de usuario
Muestra cómo implementar un editor de tipos de interfaz de usuario personalizado para formularios Windows Forms.
Cómo: Extender la apariencia y el comportamiento de los controles en modo de diseño
Muestra cómo crear un diseñador personalizado que extiende la interfaz de usuario (UI) para diseñar un control
personalizado.
Cómo: Crear un control de formularios Windows Forms que aproveche las características en tiempo de diseño
Muestra cómo crear un control personalizado y un diseñador personalizado asociado. Una vez generada la biblioteca, podrá
generar implementaciones MarqueeControl que se ejecuten en un formulario.
Cómo: Asociar etiquetas inteligentes a un componente de formularios Windows Forms
Muestra cómo agregar compatibilidad para etiquetas inteligentes a los componentes y controles personalizados.
Cómo: Ajustar los atributos, eventos y propiedades de un componente en modo de diseño
Muestra cómo crear un diseñador personalizado que ajusta los atributos, eventos y propiedades de un componente.
Recursos adicionales
Los sitios siguientes requieren una conexión a Internet.
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza
regularmente con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con
nuevo contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se
actualiza regularmente con nuevo contenido.
Centro para desarrolladores de Microsoft Patterns and Practices
Recomendaciones específicas del escenario que muestran cómo diseñar, desarrollar, implementar y operar aplicaciones
arquitectónicamente legítimas para la plataforma Microsoft .NET.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Seguridad (Cómo se implementa en C#)


Esta página proporciona vínculos a la ayuda de las tareas más habituales de seguridad e implementación. Para ver otras categorías
de tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
General
Seguridad en Visual Studio
Proporciona conocimientos básicos sobre técnicas de codificación segura.
Conceptos básicos sobre la seguridad de acceso a código
Explica los conceptos de seguridad de acceso a código a fin de escribir aplicaciones eficaces para utilizarlas en el Common
Language Runtime.
Centro para desarrolladores de seguridad de Microsoft
Proporciona información actualizada sobre problemas de seguridad que ayudan a desarrollar código seguro.
Las nuevas tecnologías le ayudan a proteger aún más sus servicios Web
Explica la importancia de la buena seguridad y sus efectos en los servicios Web.
Determinar cuándo utilizar Windows Installer o XCOPY
Examina y compara dos enfoques para implementar aplicaciones de Microsoft .NET: el comando de DOS XCOPY y la tecnología
Microsoft Windows Installer.
Procedimientos recomendados para directivas de seguridad
Explica los conceptos básicos de administración y se describen algunos de los procedimientos recomendados que se deben utilizar
en la administración de la directiva de seguridad de acceso a código.
Acceso a código y conjuntos de permisos
Cómo: Utilizar la protección de datos
Proporciona procedimientos para cifrar o descifrar datos en memoria, o un archivo o una secuencia mediante protección de datos.
Cómo: Agregar permisos personalizados a directivas de seguridad
Proporciona un procedimiento para agregar un permiso personalizado a la directiva de seguridad.
Cómo: Habilitar la configuración de seguridad de Internet Explorer para la ejecución administrada
Proporciona un procedimiento para habilitar la configuración de seguridad de Internet Explorer.
Cómo: Solicitar permisos mínimos mediante el indicador RequestMinimum
Proporciona un ejemplo que solicita FileIOPermission mediante el indicador RequestMinimum.
Cómo: Crear objetos GenericPrincipal y GenericIdentity
Proporciona un ejemplo de cómo utilizar la clase GenericIdentity junto con la clase GenericPrincipal para crear un esquema de
autorización que sea independiente del dominio de Windows NT o de Windows 2000.
Cómo: Crear un objeto WindowsPrincipal
Proporciona dos formas de crear un objeto WindowsPrincipal, dependiendo de si el código debe realizar repetidamente la
validación basada en funciones o si sólo tiene que realizarla una vez.
Cómo: Realizar comprobaciones de seguridad imperativas
Proporciona un ejemplo que utiliza una comprobación imperativa para asegurarse de que una clase GenericPrincipal coincide con
el objeto PrincipalPermission.
Cómo: Rechazar permisos mediante el indicador RequestRefuse
Proporciona un ejemplo que utiliza RequestRefuse para rechazar FileIOPermission en el sistema de seguridad de Common
Language Runtime.
Cómo: Solicitar permiso para obtener acceso a código no administrado
Proporciona un ejemplo que muestra cómo solicitar permiso para obtener acceso a código no administrado.
Cómo: Solicitar permiso para un conjunto de permisos con nombre
Proporciona un ejemplo que muestra la sintaxis utilizada para solicitar permiso para un conjunto de permisos con nombre.
Cómo: Solicitar permisos opcionales mediante el indicador RequestOptional
Proporciona un ejemplo que solicita FileIOPermission mediante el indicador SecurityAction.RequestOptional, rechazando
indirectamente todos los demás permisos.
Cómo: Almacenar claves asimétricas en un contenedor de claves
Muestra cómo crear una clave asimétrica, guardarla en un contenedor de claves, recuperar la clave posteriormente y eliminarla del
contenedor.
Cómo: Agregar ensamblados a una directiva de seguridad mediante Caspol.exe
Explica cómo agregar un ensamblado que implementa un objeto de seguridad personalizado a la lista de ensamblados de
confianza total
Cómo: Ver grupos de código mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para ver una lista sencilla de
grupos de código que pertenecen a un nivel de directiva o una lista con los nombres y descripciones de los grupos de código.
Cómo: Modificar permisos en un conjunto de permisos
Explica cómo utilizar la herramienta .NET Framework Configuration (Mscorcfg.msc) para modificar un permiso en un conjunto de
permisos.
Cómo: Agregar permisos a un conjunto de permisos
Explica cómo utilizar la herramienta Configuración de .NET Framework (Mscorcfg.msc) para agregar un permiso a un conjunto de
permisos.
Cómo: Suprimir advertencias de cambio de directiva mediante Caspol.exe
Explica cómo suprimir advertencias de cambio de directiva mediante Caspol.exe.
Cómo: Cambiar la condición de pertenencia de un grupo de código
Explica cómo utilizar Mscorcfg.msc para cambiar las condiciones de pertenencia respecto a los grupos de código.
Cómo: Ver grupos de código y conjuntos de permisos mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para mostrar todos los grupos de
código a los que pertenece un ensamblado.
Cómo: Administrar directivas de seguridad para usuarios no predeterminados mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para administrar una directiva de
usuario para otros usuarios aparte del actual.
Cómo: Cambiar los conjuntos de permisos asociados a un grupo de código existente
Explica cómo utilizar Mscorcfg.msc para cambiar conjuntos de permisos.
Cómo: Analizar problemas con los permisos de ensamblado mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para solucionar problemas que
podrían hacer que un ensamblado no se ejecute, que obtenga acceso a recursos protegidos o que se ejecute cuando no debe.
Cómo: Ver conjuntos de permisos mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para mostrar los conjuntos de
permisos que pertenecen a todos los niveles de directiva o a un único nivel de directiva.
Cómo: Deshacer los cambios de una directiva mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para recuperar la directiva de
equipo, usuario o empresa anterior al último cambio realizado.
Cómo: Importar un permiso mediante un archivo XML
Proporciona un ejemplo que ilustra cómo puede mostrarse la información de un permiso en el archivo XML.
Cómo: Restablecer los valores predeterminados de directivas de seguridad mediante Caspol.exe
Explica cómo restablecer los valores predeterminados de directivas de seguridad mediante Caspol.exe
Cómo: Agregar grupos de código mediante Caspol.exe
Explica cómo agregar grupos de código mediante Caspol.exe.
Cómo: Reemplazar el mecanismo de autoprotección de Caspol.exe
Explica cómo reemplazar el mecanismo de autoprotección, si es necesario.
Cómo: Crear grupos de código
Explica cómo crear grupos de código mediante Mscorcfg.msc.
Cómo: Deshabilitar la recolección simultánea de elementos no utilizados
Explica cómo utilizar el elemento <gcConcurrent> para especificar cómo debe ejecutar el tiempo de ejecución la recolección de
elementos no utilizados.
Cómo: Importar un grupo de código mediante un archivo XML
Proporciona un ejemplo que muestra cómo pueden aparecer en un archivo XML la información de un grupo de código y la
condición de pertenencia y el conjunto de permisos asociados.
Cómo: Crear una directiva de edición
Proporciona un ejemplo que muestra un archivo de directivas del editor que redirige una versión de myAssembly a otra.
Cómo: Quitar grupos de código mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para quitar grupos de código de
las jerarquías de grupos de código.
Cómo: Crear una plantilla de canal en un archivo de configuración
Proporciona un ejemplo que muestra cómo se crea una plantilla de canal en un archivo de configuración.
Cómo: Cambiar conjuntos de permisos mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para reemplazar el conjunto de
permisos original con el nuevo conjunto especificado en el archivo XML.
Cómo: Quitar conjuntos de permisos
Explica cómo utilizar la herramienta Configuración de .NET Framework (Mscorcfg.msc) para quitar un conjunto de permisos en un
nivel determinado.
Cómo: Crear conjuntos de permisos
Explica cómo utilizar la herramienta Configuración de .NET Framework (Mscorcfg.msc) para crear un conjunto de permisos para un
nivel determinado y asociarlo a un grupo de códigos nuevo o existente.
Cómo: Hacer que un grupo de código sea exclusivo o de nivel final
Explica cómo utilizar Mscorcfg.msc para hacer que el nuevo grupo de código sea Exclusivo o Nivel final.
Cómo: Agregar un ensamblado a la lista de ensamblados de directiva
Explica cómo utilizar la herramienta Configuración de .NET Framework (Mscorcfg.msc) para agregar el ensamblado a la lista de
ensamblados de plena confianza.
Cómo: Importar un conjunto de permisos mediante un archivo XML
Proporciona un ejemplo que muestra un conjunto de permisos y un permiso incluidos en un archivo XML.
Cómo: Buscar ensamblados mediante DEVPATH
Proporciona un ejemplo que muestra cómo se consigue que el motor en tiempo de ejecución busque ensamblados en los
directorios que especifica la variable de entorno DEVPATH.
Cómo: Registrar un objeto activado en el servidor y un objeto activado en el cliente en un dominio de aplicación host
Proporciona un ejemplo que muestra cómo registrar un objeto activado en el servidor y un objeto activado en el cliente para un
dominio de aplicación host.
Cómo: Ver directivas de seguridad mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para ver la directiva de seguridad
(jerarquía de grupos de código) y una lista de conjuntos de permisos conocidos para todos los niveles de directiva o para un solo
nivel de directiva.
Cómo: Agregar conjuntos de permisos mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para agregar conjuntos de
permisos a un grupo de código.
Cómo: Cambiar grupos de código mediante Caspol.exe
Explica cómo utilizar la opción –chggroup de la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para
cambiar el nombre, la condición de pertenencia, el conjunto de permisos, los indicadores o la descripción de un grupo de código.
Cómo: Configurar canales
Proporciona un ejemplo que muestra cómo generar un HttpChannel con un nombre distinto de "http" y utilizarlo para una
aplicación de servidor.
Cómo: Activar y desactivar la seguridad mediante Caspol.exe
Explica cómo utilizar la herramienta de la directiva de seguridad de acceso a código (Caspol.exe) para activar y desactivar la
seguridad.
Cómo: Quitar permisos de un conjunto de permisos
Explica cómo utilizar la herramienta .NET Framework Configuration (Mscorcfg.msc) para quitar un permiso de un conjunto de
permisos.
Cómo: Realizar tareas comunes de directivas de seguridad mediante la herramienta Configuración de .NET Framework (Mscorcfg.msc)
Explica cómo utilizar la herramienta Configuración de .NET Framework (Mscorcfg.msc) para configurar la directiva de seguridad de
modo que satisfaga sus necesidades.
Recursos adicionales
Centro para desarrolladores de seguridad de Microsoft
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones seguras.
Centro para desarrolladores de Visual Studio 2005
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones con Visual Studio 2005. Este sitio se actualiza
regularmente con nuevo contenido.
Centro para desarrolladores de Visual C#
Contiene muchos artículos y recursos sobre el desarrollo de aplicaciones de C#. Este sitio se actualiza regularmente con nuevo
contenido.
Centro para desarrolladores de Microsoft .NET Framework
Contiene muchos artículos y recursos sobre el desarrollo y depuración de aplicaciones de .NET Framework. Este sitio se actualiza
regularmente con nuevo contenido.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Programación en Office (Cómo se procede en C#)


Esta página proporciona vínculos a la ayuda de las tareas más habituales de programación en Office. Para ver otras categorías
de tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
General
Cómo: Actualizar los proyectos de nivel de documento
Explica los pasos que se deben realizar manualmente para finalizar la actualización a las Herramientas de Microsoft Visual
Studio 2005 para Office.
Tutoriales para Excel
Muestra tres tipos básicos de tareas: automatizar Microsoft Office Excel 2003, realizar análisis de datos y trabajar con
controles.
Tutoriales para Word
Muestra distintas formas de utilizar las herramientas para Microsoft Office 2003 a fin de automatizar proyectos de Microsoft
Office Word 2003.
Cómo: Automatizar aplicaciones de Office con ensamblados de interoperabilidad primarios
Describe los pasos que se deben llevar a cabo en los proyectos existentes para poder llamar a código no administrado
utilizando Visual Basic o C#.
Cómo: Agregar controles a documentos de Office
Explica cómo agregar controles en tiempo de diseño o en tiempo de ejecución a los documentos de Office.
Aplicaciones de Word y Excel
Cómo: Ejecutar los cálculos de Excel mediante programación
Explica cómo ejecutar cálculos mediante programación para un rango o para toda la aplicación.
Cómo: Crear menús de Office mediante programación
Ofrece un ejemplo que crea un menú llamado New Menu en la barra de menús de Microsoft Office Excel 2003.
Cómo: Crear barras de herramientas de Office mediante programación
Ofrece un ejemplo que crea una barra de herramientas denominada Test en Microsoft Office Word 2003. Aparece cerca de la
parte media del documento y contiene dos botones. Cuando se hace clic en un botón, aparece un cuadro de mensaje.
Cómo: Controlar errores en proyectos de Office
Explica cómo configurar el depurador para que se interrumpa al producirse excepciones de Common Language Runtime.
Vea también
Conceptos
Cómo se utiliza C#
Introducción a Visual C#

Dispositivos inteligentes
Esta página proporciona vínculos a la Ayuda de las tareas más habituales de programación de dispositivos inteligentes. Para
ver otras categorías de tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
Introducción a los dispositivos inteligentes
Lo nuevo en proyectos de Smart Device
Describe las características nuevas o ampliadas que ofrece Visual Studio 2005.
Capacidades de dispositivos y herramientas de desarrollo necesarias
Proporciona tablas que contienen una instantánea de las variaciones del hardware de dispositivos inteligentes, las
características de hardware y las herramientas de desarrollo.
Herramientas remotas para proyectos de dispositivos
Proporciona una lista de las herramientas remotas disponibles en eMbedded Visual C++ 4.0 y que se distribuyen con Visual
Studio 2005 para ayudarle a desarrollar y depurar aplicaciones de dispositivos.
Cómo: Optimizar la Ayuda para el desarrollo de Smart Device
Muestra la forma de determinar el tipo de Ayuda que se ha instalado, cómo se agrega la Ayuda de Desarrollo móvil e
incrustado, y cómo se filtra la Ayuda.
Cómo: Iniciar el emulador de dispositivos en Visual Studio
Muestra cómo iniciar el emulador de dispositivos con el cuadro de diálogo Conectar con dispositivo o el Administrador del
emulador de dispositivos.
Actualizar proyectos creados con herramientas antiguas
Describe las mejoras realizadas en el entorno de desarrollo de Visual Studio 2005.
Seleccionar un lenguaje de programación
Describe las opciones de lenguajes de programación para desarrollar una aplicación, un control o biblioteca para la
implementación en un dispositivo inteligente.
Tutorial: Crear aplicaciones de Windows Forms para un dispositivo
Muestra la diferencia principal existente entre la programación de escritorio y la programación de dispositivos, esto es, que
se debe establecer como destino para un dispositivo. En este tutorial, el dispositivo es un emulador integrado de Pocket PC
2003.
Programar dispositivos inteligentes con Visual Basic y C#
Programación para dispositivos con .NET Compact Framework
Proporciona información sobre cómo desarrollar aplicaciones de dispositivos inteligentes con el lenguaje Visual Basic o C# y
.NET Compact Framework.
Referencia de .NET Compact Framework para proyectos de dispositivos
Proporciona información sobre .NET Compact Framework como subconjunto de la biblioteca de clases de .NET Framework.
Cómo: Crear aplicaciones para dispositivos utilizando Visual C# o Visual Basic
Describe cómo crear aplicaciones para dispositivos y las diferencias entre este proceso y el de creación de aplicaciones de
escritorio.
Cómo: Compartir código fuente entre plataformas (Dispositivos)
Describe la utilización de constantes del compilador para compartir el mismo código fuente en plataformas diferentes.
Cómo: Cambiar plataformas en proyectos de dispositivos
Describe cómo cambiar de una plataforma a otra en el mismo proyecto.
Cómo: Actualizar proyectos a las versiones más recientes de .NET Compact Framework
Describe cómo actualizar la plataforma de un proyecto existente si se instala una versión posterior de la plataforma.
Administrar fragmentos de código en proyectos de dispositivos
Describe la utilización de miniprogramas que pertenecen exclusivamente a los proyectos de dispositivos.
Cómo: Comprobar la compatibilidad del código en plataformas en proyectos de dispositivos
Describe cómo garantizar que la plataforma de destino admite el código.
Cómo: Controlar eventos de HardwareButton (Dispositivos)
Describe cómo reemplazar las teclas de la aplicación en Pocket PC.
Cómo: Cambiar la orientación y la resolución de formularios (Dispositivos)
Describe cómo cambiar la orientación y resolución si los valores predeterminados faltan o son incorrectos.
Cómo: Cambiar el dispositivo predeterminado (Proyectos administrados)
Describe cómo cambiar el dispositivo de destino durante el desarrollo del proyecto.
Cómo: Optimizar la Ayuda para el desarrollo de Smart Device
Describe cómo utilizar el filtro de Ayuda de Smart Device para mostrar sólo los elementos de .NET Framework admitidos
para el desarrollo de aplicaciones para dispositivos.
Conexiones de dispositivos
Cómo: Conectar al emulador de dispositivos en una sesión de Virtual PC
Describe la técnica para establecer una conexión a falta de TCP/IP.
Cómo: Obtener acceso al sistema de archivos del emulador de Smartphone
Describe cómo obtener acceso al sistema de archivos del emulador de Smartphone, que no tiene su propio visor de archivos.
Cómo: Conectar mediante Bluetooth
Describe cómo conectar utilizando Bluetooth.
Cómo: Conectar mediante IR
Describe cómo conectar utilizando Infrared.
Cómo: Conectar a un dispositivo basado en Windows CE sin ActiveSync
Describe los pasos que hay que seguir para conectar a un dispositivo cuando los servicios de ActiveSync no están
disponibles.
Cómo: Obtener acceso a los archivos del equipo de desarrollo desde el emulador
Describe cómo utilizar una carpeta compartida para tener acceso a los archivos del equipo de desarrollo desde el emulador.
Cómo: Establecer opciones de conexión (dispositivos)
Describe dónde encontrar los cuadros de diálogo comunes para establecer opciones de conexión.
Depuración de dispositivos inteligentes
Diferencias entre depuradores de dispositivos y de escritorio
Describe las diferencias entre los depuradores de dispositivo y de escritorio.
Cómo: Conectar a procesos de dispositivos administrados
Describe cómo conectar con los procesos de dispositivo administrado.
Cómo: Cambiar la configuración del Registro en un dispositivo
Describe cómo utilizar el Editor de Registro remoto para cambiar la configuración del Registro en el dispositivo.
Tutorial: Depurar una solución que incluye código administrado y código nativo
Describe cómo depurar estas soluciones mixtas.
Datos en proyectos de dispositivos administrados
Cómo: Generar código SqlCeResultSet (Dispositivos)
Describe cómo generar conjuntos de resultados en lugar de conjuntos de datos.
Cómo: Cambiar la cadena de conexión en tiempo de diseño (Dispositivos)
Describe cómo cambiar la cadena que Visual Studio utiliza para conectar a una base de datos de SQL Server Mobile en
tiempo de diseño.
Cómo: Cambiar la cadena de conexión en tiempo de ejecución (Dispositivos)
Describe cómo cambiar la cadena que la aplicación utiliza para conectar a una base de datos de SQL Server Mobile en
tiempo de ejecución.
Cómo: Agregar botones de exploración (Dispositivos)
Describe una alternativa a la clase DataNavigator, que no se admite en .NET Compact Framework.
Cómo: Conservar cambios de datos en la base de datos (Dispositivos)
Describe cómo volver a aplicar los cambios en el conjunto de datos a la base de datos.
Cómo: Crear una base de datos (Dispositivos)
Describe cómo utilizar el entorno de Visual Studio para crear una base de datos de SQL Server Mobile, dentro o fuera de un
proyecto.
Cómo: Agregar una base de datos a un proyecto de dispositivos
Describe cómo agregar una base de datos de SQL Server Mobile, disponible en el Explorador de servidores, como origen de
datos para un proyecto de Visual Basic o Visual C#.
Cómo: Agregar una base de datos de SQL Server como origen de datos (Dispositivos)
Describe cómo agregar una base de datos de SQL Server como origen de datos para un proyecto de Visual Basic o Visual C#.
Cómo: Agregar un objeto comercial como origen de datos (Dispositivos)
Describe cómo agregar un objeto comercial como origen de datos para un proyecto de Visual Basic o Visual C#.
Cómo: Agregar un servicio Web como origen de datos (Dispositivos)
Describe cómo agregar un servicio Web como origen de datos para un proyecto de Visual Basic o Visual C#.
Cómo: Administrar tablas en una base de datos (Dispositivos)
Describe cómo agregar y quitar tablas, y cómo editar un esquema de tabla existente.
Cómo: Administrar columnas en una base de datos (Dispositivos)
Describe cómo agregar y quitar columnas, y editar sus propiedades.
Cómo: Administrar índices en una base de datos (Dispositivos)
Describe cómo agregar y quitar índices, y cómo cambiar su propiedad de criterio de ordenación.
Cómo: Administrar contraseñas para bases de datos (Dispositivos)
Describe cómo establecer una contraseña para una nueva base de datos de SQL Server Mobile y cómo cambiar una
contraseña para una base de datos existente.
Cómo: Reducir y reparar una base de datos (Dispositivos)
Describe cómo comprimir y reparar bases de datos de SQL Server Mobile.
Cómo: Crear consultas parametrizadas (Dispositivos)
Describe cómo crear consultas parametrizadas.
Tutorial: Aplicación de consulta parametrizada
Proporciona instrucciones paso a paso para un proyecto completo que incluye la generación de una consulta parametrizada.
Cómo: Crear aplicaciones Principal-Detalle (Dispositivos)
Describe cómo implementar una relación principal-detalle.
Tutorial: Aplicación Principal-Detalle para una base de datos
Proporciona instrucciones paso a paso para un proyecto completo que incluye la creación y ejecución de una aplicación
principal-detalle.
Cómo: Obtener una vista previa de datos en una base de datos (Dispositivos)
Describe varias opciones para ver datos en una base de datos.
Cómo: Generar vistas de resumen y edición para aplicaciones de datos (Dispositivos)
Describe cómo utilizar formularios de datos para ver y modificar filas únicas de datos en una cuadrícula de datos.
Empaquetar e implementar soluciones de dispositivo
Tutorial: Empaquetar una solución Smart Device para su implementación
Proporciona instrucciones paso a paso para empaquetar una aplicación y sus recursos.
Seguridad en los proyectos de dispositivos
Cómo: Importar y aplicar certificados en proyectos de dispositivos
Describe el uso eficaz del cuadro de diálogo Seleccionar certificado para la firma de proyectos de dispositivos.
Cómo: Iniciar Signtool.exe como evento posterior a la generación (Dispositivos)
Describe cómo firmar un proyecto cuando los eventos posteriores a la generación han cambiado los binarios originales.
Cómo: Consultar un dispositivo para conocer su modelo de seguridad
Describe cómo determinar los certificados que ya están instalados en el almacén de certificados de dispositivos.
Cómo: Firmar una aplicación de Visual Basic o Visual C# (Dispositivos)
Muestra los pasos que hay que seguir para firmar una aplicación escrita en comparación con .NET Compact Framework.
Cómo: Firmar un ensamblado de Visual Basic o Visual C# (Dispositivos)
Muestra los pasos que hay que seguir para firmar los ensamblados de proyectos.
Cómo: Firmar un archivo CAB (Dispositivos)
Muestra los pasos que hay que seguir para firmar un proyecto CAB de dispositivos.
Cómo: Poner en servicio un dispositivo en un proyecto de Visual Basic o Visual C#
Muestra los pasos que hay que seguir para agregar certificados digitales al almacén de dispositivos en proyectos
administrados.
Cómo: Poner en servicio un dispositivo con un modelo de seguridad
Describe el uso de RapiConfig.exe para proporcionar un dispositivo con un modelo de seguridad.
Vea también
Conceptos
Cómo se utiliza C#
Implementación (Cómo se procede en C#)
Esta página proporciona vínculos a la ayuda de las tareas de implementación más habituales. Para ver otras categorías de
tareas frecuentes tratadas en la Ayuda, vea Cómo se utiliza C#.
ClickOnce
Cómo: Publicar aplicaciones ClickOnce
Muestra cómo hacer que una aplicación ClickOnce esté disponible para los usuarios publicándola en un servidor Web,
recurso compartido de archivo o discos extraíbles.
Cómo: Especificar una ubicación de publicación
Muestra cómo especificar la ubicación dónde se colocarán los archivos de aplicación y el manifiesto.
Cómo: Especificar una dirección URL de instalación
Muestra cómo utilizar la propiedad Dirección URL de instalación para especificar el servidor Web donde los usuarios irán
a descargar la aplicación.
Cómo: Especificar una dirección URL de soporte
Explica cómo utilizar la propiedad Dirección URL de soporte para identificar una página Web o recurso compartido de
archivo donde los usuarios pueden ir para obtener información sobre la aplicación.
Cómo: Especificar el modo de instalación de ClickOnce
Muestra cómo establecer el Modo de instalación para especificar si la aplicación estará disponible con o sin conexión.
Cómo: Habilitar AutoStart para instalaciones con CD
Muestra cómo habilitar Autoinicio para que la aplicación ClickOnce se inicie automáticamente cuando se inserta el disco.
Cómo: Establecer la versión de publicación de ClickOnce
Muestra cómo establecer la propiedad Versión de publicación, que determina si la aplicación que se está publicando se
tratará o no como una actualización.
Cómo: Incrementar automáticamente la versión de publicación de ClickOnce
Muestra cómo cambiar la propiedad Versión de publicación para producir la aplicación que se va a publicar como una
actualización.
Cómo: Especificar los archivos que se van a publicar mediante ClickOnce
Explica cómo excluir archivos, marcarlos como archivos de datos o requisitos previos y crear grupos para la instalación
condicional.
Cómo: Instalar requisitos previos mediante una aplicación ClickOnce
Muestra cómo especificar un conjunto de componentes de requisitos previos para empaquetar junto con la aplicación.
Cómo: Administrar actualizaciones de aplicaciones ClickOnce
Describe cómo especificar cuándo y cómo se llevarán a cabo las comprobaciones de actualización, si éstas son obligatorias y
dónde debe comprobar dichas actualizaciones la aplicación.
Cómo: Incluir un archivo de datos en una aplicación ClickOnce
Proporciona procedimientos que muestran cómo agregar un archivo de datos de cualquier tipo a la aplicación ClickOnce.
Cómo: Implementar .NET Framework mediante Systems Management Server
Describe las tareas que se deben realizar en el servidor que ejecuta Systems Management Server.
Cómo: Agregar un editor de confianza a un equipo cliente para aplicaciones ClickOnce
Muestra cómo utilizar la herramienta de línea de comandos CertMgr.exe para agregar un certificado de editor al almacén de
los editores de confianza en un equipo cliente.
Cómo: Especificar una ubicación alternativa para las actualizaciones de la implementación
Muestra cómo especificar una ubicación alternativa para las actualizaciones en el manifiesto de implementación para que la
aplicación pueda actualizarse desde el Web tras la instalación inicial.
Cómo: Implementar .NET Framework mediante Active Directory
Proporciona un procedimiento para implementar .NET Framework utilizando Active Directory.
Cómo: Recuperar información de la cadena de consulta en una aplicación ClickOnce
Muestra cómo utilizar una aplicación ClickOnce para obtener información de la cadena de consulta. También muestra la
forma en que la aplicación ClickOnce puede utilizar un fragmento de código para leer estos valores la primera vez que se
inicializa la aplicación.
Cómo: Habilitar la configuración de seguridad para aplicaciones ClickOnce
Muestra cómo deshabilitar temporalmente la configuración de seguridad durante el desarrollo.
Cómo: Establecer una zona de seguridad para una aplicación ClickOnce
Muestra cómo establecer una zona de seguridad para rellenar la tabla Permisos necesarios para la aplicación.
Cómo: Establecer permisos personalizados para una aplicación ClickOnce
Muestra cómo restringir la aplicación a los permisos concretos que necesita para funcionar correctamente.
Cómo: Determinar los permisos de una aplicación ClickOnce
Describe cómo analizar la aplicación para determinar qué permisos se necesitan ejecutando la herramienta Calculadora de
permisos.
Cómo: Depurar una aplicación ClickOnce con permisos restringidos
Muestra cómo depurar la aplicación con los mismos permisos que el usuario final.
Windows Installer
Implementación de Windows Installer
Vínculos a los artículos sobre cómo utilizar la implementación de Windows Installer para crear paquetes del instalador que
se van a distribuir a los usuarios.
Tutorial: Implementar una aplicación basada en Windows
Describe el proceso de creación de un instalador para una aplicación para Windows que inicia el Bloc de notas.
Tutorial: Instalar componentes compartidos mediante módulos de combinación
Cómo utilizar los módulos de combinación para garantizar que los componentes compartidos se empaquetan y entregan
para la implementación coherente.
Tutorial: Crear una acción personalizada
Muestra el proceso de crear una acción personalizada de DLL para dirigir a un usuario a una página Web al final de una
instalación.
Tutorial: Utilizar una acción personalizada para mostrar un mensaje durante la instalación
Explica cómo utilizar una acción personalizada para obtener los datos introducidos por el usuario y transferirlos a un cuadro
de mensaje que aparece durante la instalación.
Tutorial: Utilizar una acción personalizada para precompilar un ensamblado durante la instalación
Describe cómo transferir el nombre de la ruta de acceso de una DLL a la propiedad CustomActionData para precompilar el
ensamblado al código nativo durante la instalación.
Tutorial: Utilizar una acción personalizada para crear una base de datos en la instalación
Muestra el uso de una acción personalizada y la propiedad CustomActionData para crear una base de datos y una tabla de la
base de datos durante la instalación.
Tutorial: Redirigir una aplicación para que apunte a un servicio Web XML diferente en la instalación
Muestra cómo crear una aplicación Web que se pueda redirigir a un servicio Web XML diferente utilizando la propiedad de
comportamiento de dirección URL, una clase de instalador, y un proyecto de programa de instalación Web.
Cómo: Instalar los requisitos previos en la implementación de Windows Installer
Muestra cómo detectar automáticamente la existencia de componentes durante la instalación e instalar un conjunto
predeterminado de requisitos previos, un proceso conocido como programa previo.
Cómo: Crear o agregar proyectos de implementación
Muestra cómo especificar dónde y cómo se implementará una solución durante y después del desarrollo.
Cómo: Crear o agregar un proyecto de instalación
Describe cómo crear archivos de Windows Installer (.msi), que se utilizan con el fin de distribuir la aplicación para su
instalación en otro equipo o servidor Web.
Cómo: Crear o agregar un proyecto de módulo de combinación
Muestra cómo crear un proyecto de módulo de combinación para empaquetar archivos o componentes que se compartirán
entre varias aplicaciones.
Cómo: Crear o agregar un proyecto CAB
Muestra cómo crear un proyecto CAB para crear archivos contenedores (.cab) que se pueden utilizar para descargar
componentes a un explorador Web.
Cómo: Establecer las propiedades del proyecto de implementación
Muestra cómo establecer propiedades dependientes de la configuración mediante el cuadro de diálogo Propiedades de la
implementación.
Cómo: Agregar elementos a un proyecto de implementación
Muestra cómo especificar qué componentes se deben incluir en el instalador y dónde instalarlos en el equipo de destino.
Cómo: Agregar módulos de combinación a un proyecto de implementación
Muestra cómo utilizar los módulos de combinación (archivos .msm) para compartir componentes entre varios proyectos de
implementación.
Cómo: Agregar y quitar iconos
Muestra cómo instalar y asociar iconos con la aplicación en un equipo de destino durante la instalación.
Cómo: Excluir elementos de un proyecto de implementación
Muestra cómo excluir un archivo o archivos de un proyecto de implementación.
Cómo: Establecer una instalación condicional basándose en las versiones del sistema operativo
Muestra cómo establecer la propiedad Condición para agregar lógica condicional a un instalador; por ejemplo, para instalar
distintos archivos o establecer valores de Registro diferentes para diversas versiones de un sistema operativo.
Vea también
Conceptos
Cómo se utiliza C#
Implementar aplicaciones de C#
Entorno de desarrollo de Visual C#

Utilizar el entorno IDE de Visual C#


Esta sección es una introducción al entorno de desarrollo integrado (IDE) de Visual C# y describe cómo se utiliza en todas las
fases del ciclo de desarrollo, desde la preparación de un proyecto hasta la distribución de la aplicación final a los usuarios
finales.
En esta sección
Introducción al entorno IDE (Visual C#)
Ofrece una guía que le ayudará a conocer los editores y las ventanas que constituyen el entorno de desarrollo integrado de
Visual C#.
Crear un proyecto (Visual C#)
Describe cómo preparar correctamente el proyecto para el tipo de aplicación que desea crear.
Diseñar una interfaz de usuario (Visual C#)
Explica cómo utilizar los diseñadores para agregar controles a la aplicación.
Editar código (Visual C#)
Describe cómo escribir código fuente con el Editor de código y cómo utilizar las herramientas como IntelliSense, fragmentos
de código y refactorización.
Desplazamientos y búsquedas (Visual C#)
Explica cómo moverse por los archivos del proyecto y cómo encontrar rápidamente cada cosa.
Generar y depurar (Visual C#)
Describe cómo crear un ensamblado ejecutable a partir de los archivos del proyecto y cómo ejecutarlo en el depurador de
Visual Studio.
Modelar y analizar código (Visual C#)
Describe cómo ver las relaciones de clase con el Diseñador de clases, probar objetos con la Herramienta de prueba de
objetos y ejecutar las herramientas de análisis de código.
Agregar y editar recursos (Visual C#)
Describe cómo agregar archivos como iconos, cadenas, tablas y otros tipos de datos a su proyecto.
Obtener Ayuda (Visual C#)
Explica cómo encontrar la documentación necesaria.
Implementar aplicaciones de C#
Describe cómo distribuir la aplicación a los usuarios finales.
Características del editor de código de Visual C#
Proporciona material de referencia completo sobre las funciones del IDE únicas de Visual C#, incluidos los fragmentos de
código y la refactorización.
Valores de configuración del IDE de Visual C#
Describe cómo cambiar la configuración predeterminada de Visual C#.
Métodos abreviados de teclado de Visual C#
Explica cómo utilizar Visual C# más rápidamente.
Vea también
Otros recursos
Visual C#
Introducción a Visual C#
Referencia de C#
Entorno de desarrollo integrado de Visual Studio
Entorno de desarrollo de Visual C#

Introducción al entorno IDE (Visual C#)


El entorno de desarrollo integrado (IDE) de Visual C# es un conjunto de herramientas de desarrollo expuestas a través de una
interfaz de usuario común. Algunas de las herramientas se comparten con otros lenguajes de Visual Studio, y otras, como el
compilador de C#, son únicas de Visual C#. La documentación de esta sección describe de forma general cómo utilizar las
herramientas más importantes de Visual C# mientras se trabaja en el IDE en distintas fases del proceso de desarrollo.
Nota
Si está desarrollando una aplicación Web ASP.NET 2.0, utilizará el IDE Visual Web Developer, que está totalmente integrado e
n Visual Studio 2005. Sin embargo, si sus páginas de código subyacente están en Visual C#, utilizará el Editor de código de Vi
sual C# dentro de Visual Web Developer. Por consiguiente, algunos temas de esta sección, como
Diseñar una interfaz de usuario (Visual C#), podrían no ser completamente aplicables a las aplicaciones Web.

Herramientas de Visual C#
A continuación se detallan las herramientas y ventanas más importantes de Visual C#. Las ventanas de la mayoría de estas
herramientas se pueden abrir desde el menú Ver.
El Editor de código, para escribir código fuente.
El compilador de C#, para convertir el código fuente de C# en un programa ejecutable.
El depurador de Visual Studio, para probar el programa.
El Cuadro de herramientas y el Diseñador, para desarrollar rápidamente interfaces de usuario con el mouse.
El Explorador de soluciones, para ver y administrar archivos de proyecto y configuraciones.
El Diseñador de proyectos, para configurar opciones del compilador, rutas de implementación, recursos, etc.
La Vista de clases, para desplazarse por el código fuente según los tipos, no los archivos.
La Ventana Propiedades, para configurar propiedades y eventos en los controles de la interfaz de usuario.
El Examinador de objetos, para ver los métodos y clases disponibles en las bibliotecas de vínculos dinámicos, incluidos
los ensamblados de .NET Framework y los objetos COM.
Document Explorer, para explorar y buscar la documentación del producto en su equipo local y en Internet.
Cómo expone las herramientas el IDE
Puede interactuar con las herramientas a través de ventanas, menús, páginas de propiedades y asistentes en el IDE. El IDE
básico tiene un aspecto similar al siguiente:

Puede tener acceso rápidamente a las ventanas de herramientas o archivos abiertos presionando CTRL + TAB. Para obtener
más información, vea Desplazamientos y búsquedas (Visual C#).
Ventanas del Editor y del Diseñador de Windows Forms
El Editor de código y el Diseñador de Windows Forms utilizan la ventana principal grande. Para alternar entre la vista de código
y la vista Diseño, puede presionar F7 o hacer clic en Código o Diseñador en el menú Ver. En la vista Diseño, puede arrastrar
controles a la ventana desde el Cuadro de herramientas, que se puede hacer visible haciendo clic en la ficha Cuadro de
herramientas del margen izquierdo. Para obtener más información sobre el Editor de código, vea Editar código (Visual C#).
Para obtener más información sobre el Diseñador de Windows Forms, vea Diseñador de Windows Forms.
La ventana Propiedades de la parte inferior derecha sólo contiene información en vista Diseño. Permite establecer las
propiedades y enlazar los eventos para los controles de la interfaz de usuario, como botones, cuadros de texto, etc. Cuando
esta ventana se establece como Ocultar automáticamente, se contrae en el margen derecho cada vez que se cambia a Vista
Código. Para obtener más información sobre la ventana Propiedades y el Diseñador, vea
Diseñar una interfaz de usuario (Visual C#).
Explorador de soluciones y Diseñador de proyectos
La ventana de la parte superior derecha es el Explorador de soluciones, que muestra todos los archivos del proyecto en una
vista de árbol jerárquica. Cuando se utiliza el menú Proyecto para agregar nuevos archivos al proyecto, se verán reflejados en
el Explorador de soluciones. Además de los archivos, el Explorador de soluciones también muestra la configuración del
proyecto y las referencias a las bibliotecas externas que necesita la aplicación.
Para obtener acceso a las páginas de propiedades del Diseñador de proyectos, haga clic con el botón secundario del mouse
en el nodo Propiedades del Explorador de soluciones y, a continuación, haga clic en Abrir. Utilice estas páginas para
modificar opciones de generación, requisitos de seguridad, detalles de implementación y muchas otras propiedades del
proyecto. Para obtener más información sobre el Explorador de soluciones y el Diseñador de proyectos, vea
Crear un proyecto (Visual C#).
Ventanas Compilador, Depurador y Lista de errores
El compilador de C# no tiene ninguna ventana porque no es una herramienta interactiva, pero puede establecer sus opciones
en el Diseñador de proyectos. Cuando se hace clic en Generar en el menú Generar, el IDE invoca el compilador de C#. Si la
generación se realiza correctamente, el panel de estado muestra un mensaje Generación satisfactoria. Si se producen errores
de generación, aparece la ventana Lista de errores aparece debajo de la ventana del editor/diseñador con una lista de errores.
Haga doble clic en un error para ir a la línea de código fuente que presenta el problema. Presione F1 para consultar la
documentación de Ayuda correspondiente al error resaltado.
El depurador tiene distintas ventanas que muestran valores de variables e información de tipos a medida que se ejecuta la
aplicación. Puede utilizar la ventana Editor de código mientras depura el programa para especificar una línea en la que desee
hacer una pausa durante la ejecución en el depurador y para recorrer el código línea a línea. Para obtener más información,
vea Generar y depurar (Visual C#).
Personalizar el IDE
En Visual C#, todas las ventanas pueden ser acoplables o flotantes, estar ocultas o visibles o cambiarse de ubicación. Para
cambiar el comportamiento de una ventana, haga clic en el icono de flecha abajo o de pin de la barra de título y seleccione
entre las opciones disponibles. Para mover una ventana acoplada a una nueva ubicación, arrastre la barra de título hasta que
aparezcan los iconos de colocación de la ventana. Mantenga presionado el botón primario del mouse y mueva el puntero del
mouse sobre el icono en la nueva ubicación. Coloque el puntero sobre los iconos izquierdo, derecho, superior o inferior para
acoplar la ventana en el lado especificado. Coloque el puntero sobre el icono del medio para transformar la ventana en una
ventana con fichas. Mientras coloca el puntero, aparece un rectángulo azul semitransparente que indica dónde se acoplará la
ventana en la nueva ubicación.

Puede personalizar muchos otros aspectos del IDE haciendo clic en Opciones en el menú Herramientas. Para obtener más
información, vea Opciones (Cuadro de diálogo): Visual Studio.
Vea también
Conceptos
Diseñar una interfaz de usuario (Visual C#)
Crear un proyecto (Visual C#)
Editar código (Visual C#)
Generar y depurar (Visual C#)
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo integrado de Visual Studio
Visual Web Developer
Elementos de la interfaz de usuario de Visual Web Developer
Entorno de desarrollo de Visual C#

Crear un proyecto (Visual C#)


Cuando esté listo para empezar a programar, el primer paso es preparar un proyecto. El proyecto contiene todo el material
necesario para la aplicación. Además de los archivos de código fuente, incluye los archivos de recursos, como iconos, las
referencias a archivos externos de los que depende la aplicación y los datos de configuración, como los valores del compilador.
Cuando se genera un proyecto, Visual C# invoca al compilador de C# y otras herramientas internas para crear un ensamblado
ejecutable con los archivos del proyecto.
Crear un proyecto nuevo
Para crear un nuevo proyecto, haga clic en el menú Archivo, elija Nuevo y haga clic en Proyecto.
Nota
Si selecciona Sitio Web en lugar de Proyecto, se abre el entorno de desarrollo integrado (IDE) Visual Web Developer. Se tra
ta de un entorno independiente y distinto dentro de Visual Studio para crear aplicaciones Web ASP.NET. El IDE Visual Web D
eveloper utiliza el editor de código de Visual C# para modificar los archivos de código subyacente en C#. Si crea aplicaciones
Web, debería utilizar principalmente la documentación de Visual Web Developer, pero consulte Editar código (Visual C#) par
a obtener información sobre el editor de C#.

La ilustración siguiente muestra el cuadro de diálogo Nuevo proyecto. Como puede ver, Visual C# está seleccionado de
forma predeterminada en la ventana de la izquierda, y en la derecha, tiene la opción de elegir entre seis o más plantillas de
proyecto. Si expande el nodo Smart Device u Otros tipos de proyectos de la izquierda, aparecerán distintos tipos de
proyectos en el lado derecho.

Los Starter kits son otro tipo de plantilla de proyecto. Si instala un starter kit, verá que aparece en el cuadro de diálogo Nuevo
proyecto. Para obtener más información, vea Starter Kits.
Después de seleccionar una plantilla de proyecto y hacer clic en Aceptar, Visual Studio crea el proyecto y todo está listo para
comenzar la codificación. Los archivos de proyecto, referencias, configuración y recursos son visibles en la ventana
Explorador de soluciones, situada a la derecha.
¿Qué contiene el proyecto?
Propiedades
El nodo Propiedades representa opciones de configuración que se aplican a la totalidad del proyecto y se almacenan en el
archivo .csproj de su carpeta de soluciones. Esta configuración incluye opciones de compilación, seguridad e implementación,
entre muchas otras. Para modificar el proyecto, se utiliza el Diseñador de proyectos, que es un conjunto de Páginas de
propiedades a las que se tiene acceso haciendo clic con el botón secundario del mouse en Propiedades, y seleccionando
Abrir. Para obtener más información, vea Modificar las propiedades de un proyecto (Visual C#).
Referencias
En el contexto de un proyecto, una referencia identifica simplemente un archivo binario que la aplicación necesita para poder
ejecutarse. Normalmente, una referencia identifica un archivo DLL, como uno de los archivos de la biblioteca de clases de .NET
Framework. También puede hacer referencia a un ensamblado .NET (denominado shim) que permite que la aplicación llame a
los métodos de un objeto COM o de un archivo DLL nativo de Win32. Si su programa crea una instancia de una clase definida
en otro ensamblado, debe agregar una referencia al archivo correspondiente en el proyecto antes de compilarlo. Para agregar
una referencia, haga clic en Agregar referencia en el menú Proyecto. Todos los proyectos de C# incluyen de forma
predeterminada una referencia a mscorlib.dll, que contiene las clases básicas de .NET Framework. Puede agregar las
referencias a archivos DLL de .NET Framework adicionales y a otros archivos haciendo clic en el Menú Proyecto y
seleccionando Agregar referencia.
Nota
No confunda el concepto de una referencia de proyecto con el concepto de tipos de referencia en C# u otros lenguajes de pr
ogramación. El primero se refiere a un archivo y a su ubicación en disco. El segundo se refiere a los tipos de C#, que se declar
an con la palabra clave class.

Recursos
Los recursos son datos que se incluyen con la aplicación pero que se pueden almacenar de forma que pueden modificarse con
independencia del resto del código fuente. Por ejemplo, puede almacenar todas las cadenas como recursos en lugar de
codificarlas directamente en el código fuente. De esta forma, podrá traducir las cadenas a distintos idiomas más adelante y
agregarlas a la carpeta de la aplicación que distribuye a los clientes sin necesidad de volver a compilar el ensamblado. Los
cinco tipos de recursos definidos por Visual C# son: cadenas, imágenes, iconos, audio y archivos. Para agregar, quitar o
modificar recursos, utilice el Diseñador de recursos, al que se tiene acceso en la ficha Recursos del Diseñador de
proyectos.
Formularios
Cuando se crea un proyecto de formularios Windows Forms, Visual C# agrega de forma predeterminada un formulario al
proyecto y lo llama Form1. Los dos archivos que representan el formulario se llaman Form1.cs y Form1.designer.cs. El código
se escribe en Form1.cs. El Diseñador de Windows Forms escribe en el archivo designer.cs el código que implementa todas las
acciones que se realizaron al arrastrar y colocar objetos desde el Cuadro de herramientas.
Puede agregar un nuevo formulario haciendo clic en el elemento de menú Proyecto y seleccionando Agregar Windows
Forms. Cada formulario tiene dos archivos asociados. Form1.cs, o como haya decido llamarlo, contiene el código fuente que se
escribe para configurar el formulario y sus controles, como cuadros de lista y cuadros de texto, y responde a eventos tales
como los clics en botones y las pulsaciones de teclas. En los proyectos de formularios Windows Forms simples, la mayoría o
incluso la totalidad de la codificación se hace en este archivo.
El archivo Designer.cs contiene el código fuente que escribe el Diseñador de formularios cuando se arrastran controles y se
colocan en el formulario, cuando se establecen las propiedades en la ventana Propiedades, etc. Normalmente, no debería
modificar manualmente este archivo.
Nota
Naturalmente, si crea un proyecto de aplicación de consola, no contendrá archivos de código fuente para formularios Windo
ws Forms.

Otro archivos de código fuente


Un proyecto puede incluir cualquier número de archivos .cs adicionales asociados o no a un formulario Windows Forms
concreto. En la ilustración anterior del Explorador de soluciones, program.cs contiene el punto de entrada para la aplicación.
Un solo archivo .cs puede contener cualquier número de definiciones de clases y estructuras. Puede agregar archivos o clases
nuevos o existentes al proyecto haciendo clic en Agregar nuevo elemento o Agregar elemento existente en el menú
Proyecto.
Vea también
Tareas
Cómo: Crear configuraciones de generación de soluciones y proyectos
Cómo: Crear un proyecto de aplicación para Windows
Conceptos
Introducción a soluciones, proyectos y elementos
Utilizar el Explorador de soluciones
Archivos de proyecto ocultos en el Explorador de soluciones
Controlar proyectos y soluciones
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Modificar las propiedades de un proyecto (Visual C#)


Después de crear un proyecto, puede utilizar el Diseñador de proyectos para realizar tareas tales como cambiar el nombre
del archivo ejecutable, personalizar el proceso de generación, agregar una referencia a un archivo DLL o reforzar la
configuración de seguridad. Puede obtener acceso al Diseñador de proyectos en el Menú Proyecto haciendo clic en
Propiedades o haciendo clic con el botón secundario en el elemento Propiedades en el Explorador de soluciones. El
Diseñador de proyectos aparecerá en la la ventana del editor/diseñador tal como se muestra en la ilustración siguiente:

Las propiedades del proyecto se agrupan en 10 páginas en el Diseñador de proyectos. Las páginas de propiedades del
Diseñador de proyectos están ubicadas en el mismo panel central que utiliza el Diseñador de Windows Forms y el editor
de código.
Nota
Visual Studio Team System incluye una página de propiedades adicional para análisis de código.

En la ilustración anterior, se muestra la página de propiedades Aplicación. Al hacer clic en las etiquetas en la ficha izquierda
(Generar, Generar eventos, Depurar, etc.) puede tener acceso a la página de propiedades correspondiente. La información
específica del proyecto que se escribe aquí se almacena en un archivo .csproj que no s puede ver en el Explorador de
soluciones y que está ubicado en la carpeta del proyecto de la unidad. Para obtener ayuda para cualquiera de las páginas de
propiedades mientras trabaja en Visual C#, coloque el cursor del mouse en la página y presione F1.
La tabla siguiente ofrece una breve descripción de cada página del Diseñador de proyectos:
Página de prop Descripción
iedades
Aplicación Cambiar el nombre del ensamblado, el tipo de proyecto, la información del ensamblado, incluido el número
de versión, y otras opciones de recursos. Para obtener más información, vea
Página de aplicación, Diseñador de proyectos (C#).

Generar Cambiar la ubicación donde se almacena el ensamblado compilado, las opciones de compilación condicional
, la forma en que se controlan los errores y advertencias, y otros valores de configuración. Para obtener más
información, vea Generar (Página, Diseñador de proyectos) (C#).

Eventos de gener Crear y modificar pasos de generación personalizada. Para obtener más información, vea
ación Eventos de generación (Página, Diseñador de proyectos) (C#, J#).

Depuración Especificar los argumentos de la línea de comandos cuando se ejecuta en el depurador y otros valores de co
nfiguración. Para obtener más información, vea Página Depuración, Diseñador de proyectos.
Recursos Agregar al proyecto cadenas, iconos, imágenes u otros tipos de archivos como recursos. Para obtener más in
formación, vea Página Recursos, Diseñador de proyectos.

Configuración Almacenar valores de configuración tales como las cadenas de conexión para una base de datos o la combin
ación de colores que desea un usuario concreto. Estas configuraciones se pueden recuperar dinámicamente
en tiempo de ejecución. Para obtener más información, vea Página Configuración, Diseñador de proyectos.

Rutas de acceso Especificar la ruta de acceso en la que están ubicados los ensamblados a los que hace referencia el proyecto.
de referencia Para obtener más información, vea Rutas de acceso de referencia (Página, Diseñador de proyectos) (C#, J#).

Firma Especificar las opciones de certificado de ClickOnce y proporcionar un nombre seguro para su ensamblado.
Para obtener más información, vea Página Firma, Diseñador de proyectos y
Información general sobre la implementación de ClickOnce.

Seguridad Especificar la configuración de seguridad que necesita la aplicación para funcionar. Para obtener más inform
ación, vea Página Seguridad, Diseñador de proyectos.

Publicación Especificar las opciones para distribuir su aplicación a un sitio Web, servidor ftp o ubicación de archivo. Para
obtener más información, vea Panel Publicar, Diseñador de proyectos.

Análisis de códig Opciones para las herramientas que analizan el código fuente para detectar problemas potenciales de seguri
o (sólo Visual St dad, comprobar el cumplimiento de las instrucciones de diseño de .NET Framework, etc. Para obtener más in
udio Team Syste formación, vea Análisis de código, Diseñador de proyectos.
m)

Vea también
Conceptos
Introducción al Diseñador de proyectos
Otros recursos
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo integrado de Visual Studio
Entorno de desarrollo de Visual C#

Diseñar una interfaz de usuario (Visual C#)


En Visual C#, la forma más rápida y cómoda de crear la interfaz del usuario (UI) es hacerlo visualmente, con el Diseñador de
Windows Forms y el Cuadro de herramientas. Hay tres pasos básicos para crear todas las interfaces de usuario:
Agregar los controles a la superficie de diseño.
Establecer las propiedades iniciales de los controles.
Escribir los controladores para los eventos especificados.
Aunque también puede escribir su propio código para crear la UI, los diseñadores permiten hacer este trabajo mucho más
rápidamente de lo que es posible mediante codificación manual.
Nota
También puede utilizar Visual C# para crear aplicaciones de consola que tengan una interfaz de usuario basada en texto simp
le. Para obtener más información, vea Crear aplicaciones de consola (Visual C#).

Agregar controles
En el diseñador, se utiliza el mouse para arrastrar controles, como botones y cuadros de texto, hasta una superficie de diseño
que representa el formulario. La siguiente ilustración muestra un cuadro combinado que se ha arrastrado desde la ventana
Cuadro de herramientas a un formulario en el Diseñador de Windows Forms.

A medida que se trabaja visualmente, el diseñador traduce las acciones en código fuente de C# y las escribe en un archivo de
proyecto llamado <nombre>.designer.cs, donde <nombre> es el nombre asignado al formulario. Cuando se ejecuta la
aplicación, el código fuente ajusta la posición y el tamaño de los elementos de la interfaz de usuario para que aparezcan como
en la superficie de diseño. Para obtener más información, vea Diseñador de Windows Forms.
Establecer propiedades
Después de agregar un control al formulario, puede utilizar la ventana Propiedades para establecer sus propiedades, como el
color de fondo y el texto predeterminado. Los valores que especifique en la ventana Propiedades sólo son los valores iniciales
que se asignarán a la propiedad cuando se cree el control en tiempo de ejecución. En muchos casos, se puede tener acceso a
estos valores o modificarlos mediante programación en tiempo de ejecución. Para ello, basta con obtener o establecer la
propiedad en la instancia de la clase del control en la aplicación. La ventana Propiedades resulta útil en tiempo de diseño
porque permite examinar todas las propiedades, eventos y métodos que admite un control. Para obtener más información, vea
Propiedades (Ventana).
Controlar eventos
Los programas con interfaces de usuario gráficas son principalmente controlados por eventos. Esperan hasta que un usuario
haga algo, como escribir texto en un cuadro de texto, hacer clic en un botón o cambiar la selección de una lista. Cuando esto
sucede, el control, que es simplemente una instancia de una clase de .NET Framework, envía un evento a la aplicación. Tiene la
opción de controlar un evento escribiendo un método especial en la aplicación al que se llamará cuando se reciba el evento.
Puede utilizar la ventana Propiedades para especificar los eventos que desea controlar en su código; seleccione un control en
el diseñador y haga clic en el botón Eventos, con el icono de rayo, en la barra de herramientas de la ventana Propiedades
para ver sus eventos. En el diagrama siguiente se muestra el botón de eventos.

Cuando agregue un controlador de eventos a través de la ventana Propiedades, el diseñador escribirá automáticamente el
cuerpo del método vacío, y deberá escribir el código para que el método lleve a cabo la acción deseada. La mayoría de los
controles generan un gran número de eventos, pero en la mayoría de los casos, las aplicaciones sólo necesitan controlar unos
pocos, si no sólo uno. Por ejemplo, puede que necesite controlar el evento Click de un botón, pero no su evento Paint a
menos que desee personalizar su aspecto de forma avanzada.
Pasos siguientes
Para obtener más información sobre las interfaces de usuario de formularios Windows Forms, vea los temas siguientes:
Crear aplicaciones basadas en Windows
Tutorial: Crear un formulario Windows Forms sencillo
Elementos de la interfaz de usuario del Diseñador de Windows Forms
En la biblioteca de clases de .NET Framework, System.Windows.Forms y los espacios de nombres relacionados contienen las
clases utilizadas para el desarrollo con formularios Windows Forms.
Vea también
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Editar código (Visual C#)


El Editor de código de Visual C# es un procesador de textos para escribir el código fuente. Al igual que Microsoft Word ofrece
un apoyo exhaustivo para frases, párrafos y gramática, el Editor de código de C# lo hace para la sintaxis de C# y para .NET
Framework. Este apoyo se puede agrupar en cinco categorías principales:
IntelliSense: documentación básica continuamente actualizada sobre las clases y los métodos de .NET Framework a
medida que se escriben en el editor, así como generación de código automática.
Refactorización: restructuración inteligente de la base de código a medida que éste evoluciona durante el transcurso de
un proyecto de desarrollo.
Fragmentos de código: una biblioteca que se puede examinar y que contiene los patrones de código que se repiten con
frecuencia.
Subrayado con líneas onduladas: notificaciones visuales de palabras incorrectas, errores de sintaxis y situaciones de
advertencia a medida que se escribe.
Ayudas de legibilidad: Esquematización y color.
IntelliSense
IntelliSense es el nombre de un conjunto de funciones relacionadas que han sido diseñadas para minimizar el tiempo
necesario para buscar ayuda y para ayudarle a escribir código de manera más precisa y eficiente. Todas ellas proporcionan
información básica sobre las palabras claves del lenguaje, los tipos de .NET Framework y las firmas de métodos a medida que
se escriben en el editor. La información se muestra mediante información sobre herramientas, cuadros de lista y etiquetas
inteligentes.
Nota
Muchas de las funciones de IntelliSense se comparten con otros lenguajes de Visual Studio y se documentan mediante ilustr
aciones en el nodo Ayudas de codificación de MSDN library. Las secciones siguientes proporcionan una breve descripción de
IntelliSense e incluyen vínculos a documentación más completa.

Listas de finalización
A medida que se escribe código fuente en el editor, IntelliSense muestra un cuadro de lista que contiene todas las palabras
clave de C# y las clases de .NET Framework. Si encuentra una coincidencia en el cuadro de lista para el nombre que se está
escribiendo, selecciona el elemento. Si el elemento seleccionado es el deseado, se puede presionar la tecla TAB para que
IntelliSense termine de escribir el nombre o la palabra clave. Para obtener más información, vea Listas de finalización en C#.

Información rápida
Cuando el cursor se sitúa sobre un tipo de .NET Framework, IntelliSense muestra información rápida sobre herramientas que
contiene documentación básica sobre el tipo. Para obtener más información, vea Información rápida.
Lista de miembros
Cuando se introduce un tipo de .NET Framework en el Editor de código y después se escribe el operador punto (.), IntelliSense
muestra un cuadro de lista que contiene los miembros del tipo. Cuando se realiza una selección y se presiona TAB, IntelliSense
escribe el nombre del miembro. Para obtener más información, vea Lista de miembros.
Información de parámetros
Cuando se escribe un nombre de método en el Editor de código seguido de un paréntesis de apertura, IntelliSense muestra
información rápida sobre herramientas de parámetros que indica el orden y los tipos de los parámetros del método. Si el
método está sobrecargado, puede el método, se puede desplazarse hacia abajo a través de todas las firmas sobrecargadas.
Para obtener más información, vea Información de parámetros.

Agregar using
En ocasiones, puede intentar crear una instancia de una clase de .NET Framework sin un nombre suficientemente completo. En
este caso, IntelliSense muestra una etiqueta inteligente después del identificador sin resolver. Al hacer clic en la etiqueta
inteligente, IntelliSense muestra una lista de directivas using que permitirán resolver el identificador. Cuando seleccione una
directiva de la lista, IntelliSense la agregará al principio del archivo de código fuente y podrá seguir escribiendo código en la
posición actual. Para obtener más información, vea Agregar using.
Refactorización
A medida que una base de código crece y evoluciona en el transcurso de un proyecto de desarrollo, puede ser deseable hacer
cambios para que sea más legible para los usuarios o más portable. Por ejemplo, puede desear dividir algunos métodos en
métodos de menor tamaño, cambiar los parámetros de un método o cambia el nombre de los identificadores. La función de
refactorización, a la que se tiene acceso mediante un clic con el botón secundario del mouse en el Editor de código, lleva a cabo
estas tareas de forma mucho más cómoda, inteligente y rigurosa que las herramientas tradicionales, como buscar y
reemplazar. Para obtener más información, vea Refactorización.
Fragmentos de código
Los fragmentos de código son unidades pequeñas de código fuente de C# de uso frecuente que se puede escribir con
precisión y rapidez mediante un par de pulsaciones de tecla. Para obtener acceso al menú de fragmentos de código, es preciso
hacer clic con el botón secundario del mouse en el Editor de código. Puede examinar los numerosos fragmentos de código que
se incluyen en Visual C# y crear los suyos propios. Para obtener más información, vea Fragmentos de código (C#).
Subrayado con líneas onduladas
El subrayado con líneas onduladas ofrece información instantánea sobre los errores del código a medida que se escribe. Un
subrayado con líneas onduladas rojas identifica un error de sintaxis, como la falta de un punto y coma o que una llave de cierre
no tiene su correspondiente llave de apertura. Un subrayado con líneas onduladas verdes identifica una advertencia potencial
del compilador, y con líneas azules, identifica un problema de Editar y continuar. La ilustración siguiente muestra un subrayado
con líneas onduladas rojas:

Ayudas de legibilidad
Esquematización
El Editor de código trata automáticamente los espacios de nombres, las clases y los métodos como regiones que se pueden
contraer para facilitar la localización y la lectura de otras partes del archivo de código fuente. También puede crear sus propias
regiones contraíbles delimitando el código con las directivas #region y #endregion.
Colorización
El editor asigna distintos colores a las distintas categorías de identificadores de un archivo de código fuente de C#. Para
obtener más información, vea Color del código.
Vea también
Otros recursos
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Desplazamientos y búsquedas (Visual C#)


Visual C# proporciona las herramientas siguientes para ayudarle a desplazarse y buscar en el código fuente, los archivos de
proyecto y las ventanas abiertas.
Vista de clases
Barras de exploración
Exploración CTRL-TAB
Buscar en archivos
Vista de clases
La ventana Vista de clases proporciona una vista del proyecto basada en clases en lugar de archivos, como en el Explorador
de soluciones. Puede utilizar la Vista de clases para desplazarse rápidamente a cualquier clase o miembro de clase del
proyecto. Para obtener acceso a la Vista de clases, haga clic en Vista de clases en el menú Ver.

Exploración CTRL-TAB
En cualquier momento, puede tener varias ventanas activas en un proyecto de Visual C#. Para desplazarse rápidamente a una
ventana, presione CTRL+TAB para abrir una ventana que muestra todas las ventanas activas de herramientas y código fuente.
Mueva las teclas de dirección mientras mantiene presionada la tecla CTRL para seleccionar la ventana que desea mostrar.
Barras de exploración
La parte superior de cada ventana del editor de código contiene la barra de exploración, que se compone de dos cuadros de
lista. El de la izquierda contiene todas las clases definidas en el archivo actual. El de la derecha, contiene todos los miembros de
la clase seleccionada en el cuadro de lista de la izquierda. Puede ir directamente a un método seleccionándolo en el cuadro de
lista derecho.

Buscar en archivos
Si presiona CTRL+MAYÚS+F, se abrirá el cuadro de diálogo Buscar en archivos, que permite realizar operaciones de buscar y
reemplazar en la totalidad de un proyecto.
Nota
Para cambiar el nombre de métodos o tipos, o para cambia parámetros de método, utilice la función Refactorización, que es
más profunda e inteligente que Buscar y reemplazar. Para obtener más información, vea Refactorización.

Para obtener más información


Cómo: Explorar código y texto
Cómo: Esquematizar y ocultar el código
Cómo: Buscar en un documento de forma incremental
Vea también
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Generar y depurar (Visual C#)


En Visual C#, una aplicación ejecutable se genera haciendo clic en Generar en el menú Generar (o presionando
CTRL+MAYÚS+B). Puede generar e iniciar la aplicación de un solo paso presionando F5 o haciendo clic en Ejecutar en el
menú Depurar.
La generación requiere la entrada de los archivos del proyecto en el compilador de C#, que convierte el código fuente en
lenguaje intermedio de Microsoft (MSIL) y después une el MSIL a los metadatos, recursos, manifiestos y otros módulos, si los
hubiere, para crear un ensamblado. Un ensamblado es un archivo ejecutable que normalmente tiene una extensión .exe o .dll.
A medida que desarrolle la aplicación, puede que desee generar una versión de depuración para probarla y ver cómo funciona.
Por último, cuando todo sea correcto, creará una versión de lanzamiento que distribuirá a los clientes.
Para obtener más información sobre los ensamblados, vea Información general sobre ensamblados.
Configuración de generación
Para especificar los distintos valores de configuración de generación, haga clic con el botón secundario en el elemento de
proyecto en el Explorador de soluciones y, a continuación, seleccione el panel Generar en el Diseñador de proyectos. Para
obtener más información, vea Introducción al Diseñador de proyectos y Opciones del compilador de C#.
Visual Studio utiliza la herramienta MSBuild para crear ensamblados. MSBuild también se puede ejecutar desde la línea de
comandos y se puede personalizar de muchas maneras. Para obtener más información, vea MSBuild.
Errores al generar
Si hay errores de sintaxis de C#, o si no es posible resolver identificadores en un tipo o miembro conocido, la generación no
finalizará correctamente y verá una lista de errores en la Lista de errores (Ventana), que aparece de forma predeterminada
justo debajo del editor de código. Puede hacer doble clic en un mensaje de error para ir a la línea de código en la que se
produjo el error.

Los mensajes de error del compilador de C# suelen ser muy claros y descriptivos, pero si no consigue deducir el problema,
puede ir a la página de Ayuda del mensaje presionando F1 con el mensaje de error seleccionado en la lista de errores. La
página de Ayuda contiene información útil adicional. Si todavía no puede resolver el problema, el paso siguiente es plantear su
pregunta en uno de los foros o grupos de noticias de C#. Para obtener acceso a los foros, haga clic en Formular una
pregunta en el menú Comunidad.
Nota
Si la página de Ayuda del error del compilador no es de utilidad para resolver el error, puede enviar una descripción del prob
lema a Microsoft para ayudar a mejorar la documentación. Para enviar el correo electrónico, haga clic en el vínculo situado e
n la parte inferior de la página de Ayuda que contiene el error.
Configuraciones de lanzamiento y de depuración
Mientras siga trabajando activamente en el proyecto, es muy probable que desee generar la aplicación con la configuración de
depuración, que le permite ver el valor de las variables y controlar la ejecución en el depurador. También puede crear y probar
generaciones en la configuración de lanzamiento para comprobar que no se ha introducido ningún error que sólo se
manifieste en uno u otro tipo de generación. En programación de .NET Framework, estos errores son muy raros, pero pueden
producirse.
Cuando esté preparado para distribuir la aplicación a los usuarios finales, cree una generación de lanzamiento, que tendrá un
tamaño muy inferior y un rendimiento muy superior al de la configuración de depuración correspondiente. Puede establecer la
configuración de generación en el panel Generar del Diseñador de proyectos o en la barra de herramientas Generar. Para
obtener más información, vea Configuraciones de generación.
Depuración
Cuando trabaje con el editor de código, puede establecer en cualquier momento un punto de interrupción en una línea de
código presionando F9. Cuando presione F5 para ejecutar la aplicación en el depurador de Visual Studio, la aplicación se
detendrá en la línea y podrá examinar el valor de las variables, observar cómo o cuándo la ejecución sale de un bucle, recorrer
el código línea a línea mediante la tecla F10 o establecer puntos de interrupción adicionales.

También puede establecer puntos de interrupción condicionales, que sólo detendrán la ejecución si se cumple una condición
determinada. Los puntos de seguimiento son similares a los puntos de interrupción, pero en lugar de detener la interrupción,
se limitan a escribir el valor de una variable determinada en la ventana de resultados. Para obtener más información, vea
Puntos de interrupción y puntos de seguimiento.
Cuando la ejecución se detiene en un punto de interrupción, puede situar el cursor sobre cualquier variable del ámbito para
ver información sobre ella. La ilustración siguiente muestra una sugerencia de datos en el depurador:
Puede recorrer el código línea a línea presionando F10 después de que el depurador se haya detenido en un punto de
interrupción. Incluso puede corregir ciertos tipos de errores en el código y proseguir con la depuración sin necesidad de
detener y volver a compilar la aplicación.
El depurador de Visual Studio es una eficaz herramienta, y merece la pena invertir tiempo en leer la documentación para
comprender distintos conceptos como Editar y continuar, Ver datos en el depurador, Visualizadores y Depuración Just-In-Time.
Vea también
Tareas
Cómo: Establecer configuraciones Debug y Release
Cómo: Depurar el código en el editor
Referencia
System.Diagnostics
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Preparación de la depuración: tipos de proyectos de C#, J# y Visual Basic
Preparación y configuración de la depuración
Entorno de desarrollo de Visual C#

Modelar y analizar código (Visual C#)


No es raro que los programadores trabajen con código fuente cuya arquitectura básica desconocen, ya sea porque fue escrito
por otra persona o porque se escribió mucho tiempo atrás, y sus creadores ya no recuerdan completamente cómo funciona.
Otro escenario común es la necesidad de entender el contenido de una biblioteca que sólo está disponible en formato binario.
Visual C# ofrece las siguientes funciones para ayudar a modelar, analizar y entender los tipos y las relaciones entre tipos del
código fuente y los ensamblados binarios:
Diseñador de clases, para representar visualmente las relaciones de herencia y de asociación entre tipos.
Examinador de objetos, para examinar los tipos, métodos y eventos exportados por los ensamblados de .NET Framework
y los archivos DLL nativos, incluidos los objetos COM.
Metadatos como origen, para ver la información de tipo de los ensamblados administrados como si fuera código fuente
de su propio proyecto.
Además de estas herramientas, Visual Studio Team System incluye Análisis de código para código administrado, la
herramienta que inspecciona el código y detecta una variedad de problemas potenciales.
Diseñador de clases
El Diseñador de clases es una herramienta gráfica que permite modelar visualmente la relación entre tipos en una aplicación o
componente de software; también puede utilizarla para diseñar nuevos tipos y refactorizar o eliminar tipos existentes. La
siguiente ilustración muestra un diseño de clase simple:

Para agregar un diagrama de clase a un proyecto, haga clic en Agregar nuevo elemento en el menú Proyecto y, a
continuación, haga clic en Agregar diagrama de clase.
Para obtener más información, vea Diseñar y ver clases y tipos.
Examinador de objetos
El Examinador de objetos permite ver información de tipos de archivos DLL nativos y administrados, incluidos objetos COM.
Aunque la información que se ve en el Examinador de objetos es similar a la que se muestra en la Vista de clases, puede
utilizarlo para examinar cualquier DLL del sistema, y no sólo aquellas a las que se hace referencia en su propio proyecto.
Además, el Examinador de objetos también muestra comentarios de documentación XML para el tipo seleccionado. La
ilustración siguiente muestra cómo el Examinador de objetos presenta la información de tipos en archivos binarios.
Para obtener más información, vea Examinador de objetos
Metadatos como origen:
La función Metadatos como origen permite ver la información de tipos de las clases de los ensamblados administrados como
si fueran código fuente de su propio proyecto. Es una forma cómoda de ver a primera vista las firmas de todos los métodos
públicos de una clase cuando no se tiene acceso al código fuente real.
Por ejemplo, si escribe la instrucción System.Console.WriteLine() en el editor de código, coloca el punto de inserción en
Console, hace clic con el botón secundario del mouse y selecciona Ir a definición, verá lo que parece un archivo de código
fuente que contiene la declaración de la clase Console. Esta declaración se construye a partir de los metadatos del ensamblado
mediante el uso de Reflexión y, aunque no expone la implementación de ningún método, muestra todos los comentarios de
documentación XML presentes.
También puede utilizar la función Metadatos como origen seleccionando un tipo administrado en el Examinador de objetos y
haciendo clic en Ventana Definición de código en el menú Ver.
Para obtener más información y una ilustración, vea Metadatos como origen.
Análisis de código para obtener código administrado
La herramienta de análisis de código para obtener código administrado analiza los ensamblados administrados y ofrece
información, como los problemas de seguridad potenciales y las infracciones de las reglas de programación y diseño
establecidas en las Instrucciones de diseño de Microsoft .NET Framework. Esta información se presenta en forma de
advertencias. Para obtener acceso a la herramienta en el Diseñador de proyectos, haga clic con el botón secundario del mouse
en Propiedades en el Explorador de soluciones y seleccione Abrir.
Para obtener más información, vea Análisis de código, Diseñador de proyectos y
Análisis de código para obtener información general de código administrado.
Vea también
Conceptos
Editar código (Visual C#)
Reflexión (Guía de programación de C#)
Otros recursos
Utilizar el entorno IDE de Visual C#
Instrucciones de diseño para desarrollar bibliotecas de clases
Instrucciones de diseño de excepciones
Instrucciones de diseño de miembros
Instrucciones de diseño de tipos
Entorno de desarrollo de Visual C#

Agregar y editar recursos (Visual C#)


Generalmente, las aplicaciones de Visual C# incluyen datos que no son código fuente. Tales datos se denominan recursos de
proyectos y pueden ser datos binarios, archivos de texto, archivos de audio o vídeo, tablas de cadenas, iconos, imágenes,
archivos XML u otro tipo de datos necesarios para la aplicación. Los datos de recursos del proyecto se almacenan en formato
XML en el archivo .resx (denominado Resources.resx de forma predeterminada), que se puede abrir en el Explorador de
soluciones. Para obtener más información sobre los recursos de proyectos, vea Trabajar con archivos de recursos.
Agregar recursos a proyectos
Puede agregar recursos a un proyecto haciendo clic con el botón secundario del mouse en el nodo Propiedades de su
proyecto en Explorador de soluciones, haciendo clic en Abrir y luego en el botón Agregar recurso en la página Recursos
de Diseñador de proyectos.
Puede agregar recursos a su proyecto en forma de recursos vinculados, que son archivos externos, o de recursos incrustados,
que se incrustan directamente en el archivo .resx.
Cuando se agrega un recurso vinculado, el archivo .resx que almacena la información de recursos del proyecto sólo
incluye una ruta de acceso relativa al archivo de recursos en el disco. Si agrega imágenes, vídeos u otros archivos
complejos como recursos vinculados, puede modificarlos mediante un editor predeterminado que asocie a ese tipo de
archivo en el Diseñador de recursos.
Cuando agrega un recurso incrustado, los datos se almacenan directamente en el archivo de recursos del proyecto
(.resx). Las cadenas sólo se pueden almacenar como recursos incrustados.
Para obtener más información, vea Recursos vinculados frente a recursos incrustados y Recursos en formato de archivo .Resx.
Editar recursos
El Diseñador de recursos permite a agregar y modificar recursos de proyectos durante el desarrollo mediante la asociación de
una aplicación predeterminada para modificar cada recurso. Para obtener acceso al Diseñador de recursos, haga clic con el
botón secundario del mouse en Propiedades en el Explorador de soluciones, haga clic en Abrir y, después, en la ficha
Recursos del Diseñador de proyectos. Para obtener más información, vea Página Recursos, Diseñador de proyectos. La
ilustración siguiente muestra las opciones del menú Diseñador de recursos:

Para editar los recursos incrustados, debe trabajar directamente en el archivo .resx para manipular los caracteres o bytes
individuales. Por eso es más conveniente almacenar los tipos de archivo complejos como recursos vinculados durante el
desarrollo. Puede utilizar el Editor binario para modificar archivos de recursos, incluido el archivo .resx, en el nivel binario en
formato ASCII o hexadecimal. Puede utilizar el Editor de imágenes para modificar iconos y cursores así como archivos .jpeg y
GIF almacenados como recursos vinculados. También puede elegir otras aplicaciones como editores para estos tipos de
archivo. Para obtener más información, vea Ver y editar recursos en un editor de recursos.
Compilar recursos en ensamblados
Cuando genera su aplicación, Visual Studio invoca la herramienta resgen.exe para convertir los recursos de la aplicación en
una clase interna llamada Resources. Esta clase está contenida en el archivo Resources.Designer.cs, que se anida en el archivo
Resources.resx en el Explorador de soluciones. La clase Resources encapsula todos los recursos del proyecto en propiedades
get estáticas de sólo lectura para proporcionar recursos con establecimiento inflexible de tipos en tiempo de ejecución.
Cuando genera la aplicación a través del IDE de Visual C#, todos los datos de recursos encapsulados, incluidos los archivos
vinculados y los recursos que se incrustaron en el archivo .resx, se compilan directamente en el ensamblado de la aplicación (el
archivo .exe o .dll). Es decir, el IDE de Visual C# siempre utiliza la opción del compilador /resource. Si genera la aplicación desde
la línea de comandos, puede especificar la opción del compilador /linkresource, que le permitirá implementar recursos en un
archivo independiente del ensamblado principal de la aplicación. Éste es un escenario avanzado y sólo es necesario en ciertas
situaciones raras. Un escenario más común para implementar los recursos independientemente del ensamblado principal de la
aplicación es utilizar ensamblados satélite como se describe a continuación.
Obtener acceso a los recursos en tiempo de ejecución
Para obtener acceso a un recurso en tiempo de ejecución, haga referencia a él como lo haría con cualquier otro miembro de
una clase. El ejemplo siguiente muestra cómo recuperar un recurso de mapa de bits denominado Image01. Tenga en cuenta
que la clase Resources está en un espacio de nombres denominado <projectName>.Properties, por lo que debe usar el
nombre completo de cada recurso o agregar la directiva using correspondiente en el archivo de código fuente desde el que
obtiene acceso a la clase Resources.
System.Drawing.Bitmap bitmap1 = myProject.Properties.Resources.Image01;

Internamente, la propiedad get utiliza la clase ResourceManager para crear una nueva instancia del objeto.
Para obtener más información, vea Recursos en aplicaciones y Generador de archivos de recursos (Resgen.exe).
Recursos en ensamblados satélite
Si crea aplicaciones que se localizarán (traducirán) en varios idiomas, puede almacenar cada conjunto de cadenas de referencia
cultural como un recurso en su propio ensamblado satélite. Cuando distribuya la aplicación, incluya el ensamblado de la
aplicación principal junto con los ensamblados satélite necesarios. A continuación, puede agregar ensamblados satélite
adicionales o modificar los existentes sin volver a compilar el ensamblado de la aplicación principal. Para obtener más
información, vea Crear ensamblados satélite y Buscar y utilizar recursos para una referencia cultural específica.
Vea también
Conceptos
Introducción al Diseñador de proyectos
Otros recursos
Visual C#
Introducción a Visual C#
Ensamblados en Common Language Runtime
Globalizar y localizar aplicaciones
Entorno de desarrollo de Visual C#

Obtener Ayuda (Visual C#)


La documentación de Ayuda para Visual Studio reside en MSDN Library, que se puede instalar localmente en su equipo o red y
que también está disponible en Internet, en http://msdn.microsoft.com/library/spa. La versión local de la biblioteca está
compuesta de una colección de archivos HTML comprimidos en formato .hxs. Puede instalar la totalidad o parte de la
biblioteca en su equipo; la instalación completa de MSDN tiene un tamaño aproximado de 2 GB e incluye documentación de
numerosas tecnologías de Microsoft. Puede ver la documentación de MSDN tanto de forma local como en línea, utilizando el
explorador de Ayuda de Visual Studio llamado Microsoft Document Explorer.
Hay seis maneras de obtener acceso a la Ayuda trabajando en Visual C#:
Búsqueda con F1
Buscar
Índice
Tabla de contenido
Cómo
Ayuda dinámica
Ayuda en línea y local
En la página de propiedades Opciones de la Ayuda, en el menú Opciones, puede especificar las opciones siguientes para
definir el comportamiento de la búsqueda, incluida la búsqueda con F1:
Buscar primero en MSDN Library en línea y, si no se encuentra ninguna coincidencia, buscar después en la
documentación local.
Buscar primero en MSDN Library local y, si no se encuentra ninguna coincidencia, buscar después en la documentación
en línea.
Buscar sólo en MSDN Library local.
Estas opciones también aparecerán la primera vez invoque una búsqueda. La documentación de MSDN en línea puede
contener información más reciente que la documentación local. Por tanto, si dispone de una conexión a Internet mientras
trabaja en Visual C#, se recomienda se recomienda elegir la opción de buscar primero en MSDN Library en línea. De vez en
cuando, puede haber actualizaciones de la documentación en línea que es posible descargar. Para obtener más información
sobre las actualizaciones de la documentación, visite Visual Studio Developer Center
Búsqueda con F1
F1 proporciona capacidad de búsqueda contextual. En el editor de código, puede obtener acceso a la documentación de Ayuda
de las palabras clave de C# y las clases de .NET Framework colocando el punto de inserción encima o inmediatamente después
de la palabra clave o del miembro de clase y presionando F1. Cuando un cuadro de diálogo o cualquier otra ventana tenga el
foco, puede presionar F1 para obtener Ayuda para esa ventana.
Una búsqueda con F1 no devuelve más que una página. Si no se encuentra ninguna coincidencia, se muestra una página
informativa que proporciona algunas sugerencias sobre cómo solucionar problemas.
Buscar
Utilice la interfaz de búsqueda para devolver todos los documentos que coincidan con cualquier término o conjunto de
términos especificado.
La interfaz de búsqueda tiene el siguiente aspecto:
También puede utilizar la página Opciones de la Ayuda en el menú Opciones para especificar si desea buscar en los sitios
Web de Codezone además de en MSDN Library. Los sitios de Codezone son una iniciativa de los socios de Microsoft y ofrecen
información útil sobre C# y .NET Framework. El contenido de Codezone sólo está disponible en línea.
Las mismas opciones de búsqueda en línea y local se aplican tanto a la búsqueda como a la búsqueda con F1.
En la interfaz de búsqueda, puede restringir o ensanchar la búsqueda especificando los tipos de documentos que desea incluir.
Hay tres opciones: Lenguaje, Tecnología y Tipo de tema. Generalmente, obtendrá los mejores resultados activando sólo las
opciones que se apliquen a su escenario de desarrollo.
Índice
El índice constituye una manera rápida de buscar documentos en MSDN Library local. No es una búsqueda de texto completo;
se limita a buscar las palabras clave de índice asignadas a cada documento. Por lo general, una búsqueda del índice es más
rápida y relevante que una búsqueda de texto completo. Si más de un documento contiene la palabra clave de índice
especificada en el cuadro de búsqueda, aparece una ventana en la que se puede elegir entre las opciones disponibles.
La ventana Índice está ubicada de forma predeterminada en el lado izquierdo de Document Explorer. Puede obtener acceso a
ella desde el menú Ayuda de Visual C#.
Tabla de contenido
MSDN Library muestra todos los temas en una estructura de vista de árbol jerárquica. Es una herramienta muy útil para
examinar la documentación a fin de obtener una idea de lo que contiene la biblioteca y de explorar documentos que podrían
no encontrarse a través del índice o de una búsqueda. Con frecuencia, cuando se encuentra un documento a través de F1, el
índice o la búsqueda, resulta útil saber dónde está ubicado en la tabla de contenido para poder ver otra documentación
relacionada con un tema determinado. Haga clic en el botón Sincronizar con tabla de contenido en la barra de
herramientas de Document Explorer para ver la ubicación de la página que se muestra en MSDN Library.
Cómo
Cómo es una vista con filtro de MSDN Library. Principalmente, incluye documentos denominados Cómo o Tutoriales que
muestran cómo llevar a cabo una tarea concreta. Puede tener acceso a la Ayuda de Cómo desde la barra de herramientas de
Document Explorer, el menú Ayuda o la página Inicio. Cada lenguaje de Visual Studio tiene su propia página Cómo, y la
página que vea dependerá del tipo de proyecto que esté activo en cada momento.
Ayuda dinámica
La ventana Ayuda dinámica muestra vínculos a documentación de referencia para .NET Framework y el lenguaje C#,
dependiendo de la posición actual del punto de inserción en el editor de código. Para obtener más información, vea
Cómo: Personalizar la Ayuda dinámica.
Vea también
Otros recursos
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Implementar aplicaciones de C#
La implementación es el proceso mediante el cual se distribuye una aplicación o componente finalizado para su instalación en
otros equipos. Para las aplicaciones de consola o las aplicaciones para clientes inteligentes basadas en formularios Windows
Forms, hay dos opciones de implementación: ClickOnce y Windows Installer.
Implementación ClickOnce
La implementación ClickOnce permite publicar aplicaciones para Windows en un servidor Web o en recurso compartido de
archivos de red con el fin de simplificar la instalación. En la mayoría de los escenarios, se recomienda la opción de
implementación ClickOnce porque permite implementar aplicaciones de actualización automática basadas en Windows, que se
pueden instalar y ejecutar con una interacción mínima del usuario.
Para configurar las propiedades para la implementación ClickOnce, puede utilizar el Asistente para publicación (accesible
desde el menú Generar) o la página Publicar del Diseñador de proyectos. Para obtener más información, vea
Panel Publicar, Diseñador de proyectos. Para obtener más información acerca de ClickOnce, vea Implementación ClickOnce.
Windows Installer
La implementación de Windows Installer permite crear unos paquetes del instalador que se distribuyen entre los usuarios; el
usuario ejecuta el archivo y los pasos de instalación mediante un asistente para instalar la aplicación. Esto se hace agregando
un proyecto de instalación a su solución; una vez generado, crea un archivo de instalación que se distribuye entre los usuarios;
el usuario ejecuta el archivo y los pasos de instalación mediante un asistente para instalar la aplicación.
Para obtener más información acerca de Windows Installer, vea Implementación de Windows Installer.
Vea también
Tareas
Cómo: Publicar aplicaciones ClickOnce
Conceptos
Alternativas de implementación
Información general sobre la implementación de ClickOnce
Implementar una aplicación en tiempo de ejecución mediante Windows Installer
Proyectos de instalación
Otros recursos
Visual C#
Entorno de desarrollo de Visual C#

Cómo: Agregar archivos de configuración de la aplicación a


proyectos de C#
Es posible personalizar la forma en que Common Language Runtime busca y carga los archivos de ensamblado agregando los
archivos de configuración de la aplicación (archivos app.config) a los proyectos de C#. Para obtener más información sobre los
archivos de configuración de la aplicación, vea Cómo el motor en tiempo de ejecución ubica ensamblados.
Al generar el proyecto, el entorno de desarrollo crea automáticamente una copia del archivo app.config, cambia el nombre de
archivo para que sea el mismo que el del archivo ejecutable y, a continuación, traslada el nuevo archivo .config al directorio
bin.
Para agregar un archivo de configuración de la aplicación al proyecto de C#
1. En el menú Proyecto, haga clic en Agregar nuevo elemento.
Aparecerá el cuadro de diálogo Agregar nuevo elemento.
2. Seleccione la plantilla Archivo de configuración de aplicaciones y, a continuación, haga clic en Agregar.
Se agregará al proyecto un archivo denominado app.config.
Vea también
Tareas
Cómo: Utilizar el archivo de configuración de una aplicación para determinar la versión de .NET Framework que se va a usar
Desarrollo de aplicaciones con Visual C#

Características del editor de código de Visual C#


Visual C# proporciona herramientas que ayudan a editar el código y a desplazarse por él.
En esta sección
Refactorización
Muestra operaciones de refactorización que ayudan a modificar el código sin cambiar el comportamiento de la aplicación.
Fragmentos de código (C#)
Proporciona información general sobre el uso de fragmentos de código en Visual C# para agregar automáticamente
construcciones de código comunes a la aplicación.
Color del código
Describe cómo el Editor de código colorea las construcciones de código.
Metadatos como origen
Describe cómo el IDE permite ver los metadatos como código fuente.
Secciones relacionadas
Modificar texto, código y marcado
Describe cómo utilizar el Editor de código para escribir y dar formato al código.
Desplazarse por el código
Proporciona vínculos a procedimientos de uso de la ventana Buscar y reemplazar, Marcadores y la Lista de tareas y la Lista
de errores para buscar líneas de código.
Valores de configuración del IDE de Visual C#
Proporciona información general sobre la configuración de Visual Studio para desarrolladores de C#.
Desarrollo de aplicaciones con Visual C#

Refactorización
La refactorización es el proceso que consiste en mejorar el código una vez escrito cambiando su estructura interna sin
modificar su comportamiento externo.
Visual C# proporciona los siguientes comandos de refactorización en el menú Refactorización:
Extraer método
Cambiar nombre
Encapsular campo
Extraer interfaz
Promocionar una variable local a parámetro
Quitar parámetros
Reordenar parámetros
Refactorización de varios proyectos
Visual Studio admite la refactorización de varios proyectos. Todas las operaciones de refactorización que corrigen referencias
entre archivos corrigen dichas referencias entre todos los proyectos del mismo lenguaje. Esto sólo funciona en referencias
entre proyectos. Por ejemplo, si tiene una aplicación de consola que haga referencia a una biblioteca de clase, al cambiar el
nombre a un tipo de biblioteca de clase (mediante la operación de refactorización Rename), también se actualizarán las
referencias al tipo de biblioteca de clase en la aplicación de consola.
Obtener vista previa de cambios (Cuadro de diálogo)
Muchas operaciones de refactorización proporcionan la posibilidad de revisar todos los cambios de referencias que realiza una
operación de refactorización en el código, antes de aplicar dichos cambios. Para estas operaciones de refactorización,
aparecerá una opción Vista previa de los cambios de referencia en el cuadro de diálogo de refactorización. Después de
seleccionar dicha opción y aceptar la operación de refactorización, aparecerá el
Obtener vista previa de cambios (Cuadro de diálogo). Observe que el cuadro de diálogo Obtener vista previa de cambios
tiene dos vistas. La vista inferior mostrará el código con todas las actualizaciones de referencias debido a la operación de
refactorización. Si presiona Cancelar en el cuadro de diálogo Obtener vista previa de cambios, se detendrá la operación de
refactorización y el código no sufrirá ningún cambio.
Refactorización tolerante a errores
La refactorización tolera errores. En otros términos, se puede realizar una refactorización en un proyecto que no se puede
generar. Sin embargo, en estos casos el proceso de refactorización podría no actualizar correctamente las referencias
ambiguas.
Vea también
Tareas
Cómo: Restaurar miniprogramas de refactorización de C#
Otros recursos
Características del editor de código de Visual C#
Desarrollo de aplicaciones con Visual C#

Extraer método
Extract Method es una operación de Refactorización que proporciona una manera sencilla para crear un nuevo método a
partir de un fragmento de código de un miembro existente.
Utilizando Extract Method, se puede crear un nuevo método extrayendo una selección de código de dentro del bloque de
código de un miembro existente. El nuevo método se crea incluyendo el código seleccionado, y el código seleccionado del
miembro existente se reemplaza por una llamada al nuevo método. Convertir un fragmento de código en su propio método
proporciona la capacidad de reorganizar el código rápidamente y con precisión para que sea posible volver a utilizarlo y lograr
una mejor legibilidad.
Extract Method tiene las siguientes ventajas.
Fomenta el uso de mejores métodos de codificación, dando énfasis a métodos discretos y reutilizables.
Recomienda el código autodocumentado a través de una buena organización. Si se utilizan nombres descriptivos, los
métodos de alto nivel se pueden leer como una serie de comentarios.
Fomenta la creación de métodos más detallados para simplificar la sustitución.
Reduce la duplicación del código.
Comentarios
Cuando se utiliza el comando Extraer método, el nuevo método se inserta a continuación del miembro de origen en la misma
clase.
Tipos parciales
Si la clase es un tipo parcial, Extract Method genera el nuevo método inmediatamente después del miembro de origen.
Extract Method determina la firma del nuevo método, creando un método estático si el código incluido en el nuevo método
no hace ninguna referencia a los datos de la instancia.
Parámetros de tipo genérico
Si extrae un método que tiene un parámetro de tipo genérico sin restricciones, el código generado no agregará el modificador
"ref" a dicho parámetro a no ser que se le asigne un valor. Si el método extraído admite tipos de referencia como el argumento
de tipo genérico, deberá agregar manualmente el modificador "ref" al parámetro en la firma del método.
Métodos anónimos
Si intenta extraer parte de un método anónimo que incluye una referencia a una variable local que se declara o a la que se hace
referencia fuera del método anónimo, Visual Studio le advertirá que se pueden producir cambios semánticos. Especialmente,
en aquellos momentos en los que el valor de la variable local se pasa al método anónimo.
Cuando un método anónimo utiliza el valor de una variable local, el valor se obtiene en el momento en que se ejecuta el
método anónimo. Cuando un método anónimo se extrae en otro método, el valor de la variable local se obtiene en el
momento de la llamada al método extraído.
El siguiente ejemplo ilustra este cambio semántico. Si se ejecuta este código, 11 se imprimirá en la consola. Si usa Extraer
método para extraer la región de código que está marcada con comentarios de código en su propio método y, a continuación,
ejecuta el código refactorizado, 10 se imprimirá en la consola.

class Program
{
delegate void D();
D d;
static void Main(string[] args)
{
Program p = new Program();
int i = 10;
/*begin extraction*/
p.d = delegate { Console.WriteLine(i++); };
/*end extraction*/
i++;
p.d();
}
}

Para evitar esta situación, convierta las variables locales que se utilizan en el método anónimo en campos de la clase.
Vea también
Tareas
Cómo: Refactorizar código con Extraer método
Desarrollo de aplicaciones con Visual C#

Extraer método (Cuadro de diálogo)


Este cuadro de diálogo se utiliza para especificar el nombre del nuevo método generado por Extraer método, así como para
comprobar que Extraer método construirá la firma del nuevo método según lo deseado.
Para tener acceso a este cuadro de diálogo, seleccione el comando Extraer método en el menú Refactorizar. Este cuadro de
diálogo sólo está disponible cuando la selección de código es válida para su extracción a un método.
Nuevo nombre del método
Escriba el nombre del nuevo método generado por Extraer método.
Vista previa de la firma del método
Muestra una vista previa de la nueva firma de método. El motor de refactorización determina automáticamente la firma
basándose en el código seleccionado y ésta no se puede modificar en este cuadro de texto.
Vea también
Tareas
Cómo: Refactorizar código con Extraer método
Referencia
Extraer método
Desarrollo de aplicaciones con Visual C#

Cómo: Refactorizar código con Extraer método


El procedimiento siguiente describe cómo crear un nuevo método a partir de un fragmento de código de un miembro
existente. Este procedimiento se utiliza para realizar la operación de refactorización Extraer método.
Para utilizar Extraer método
1. Cree una aplicación de consola como se describe en el ejemplo siguiente.
Para obtener más información, vea Aplicación de consola.
2. En el editor de código, seleccione el fragmento de código que desea extraer:

double area = PI * radius * radius.

3. Seleccione Extraer método en el menú Refactorizar. Aparecerá el cuadro de diálogo Extraer método.
También puede presionar CTRL+R, CTRL+M, que es el método abreviado de teclado para mostrar el cuadro de diálogo
Extraer método.
O bien, puede hacer clic con el botón secundario en el código seleccionado, señalar Refactorizar en el menú contextual
y, a continuación, hacer clic en Extraer método para mostrar el cuadro de diálogo Extraer método.
4. Especifique un nombre para el nuevo método en el cuadro de texto Nombre del nuevo método, por ejemplo,
CircleArea. Aparecerá una vista previa de la nueva firma de método en Vista previa de la firma del método.
5. Haga clic en el botón Aceptar.
Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada ExtractMethod y, a continuación, reemplace Class1
con el código siguiente. Para obtener más información, vea Aplicación de consola.

class A
{
const double PI = 3.141592;

double CalculatePaintNeeded(double paintPerUnit, double radius)


{
// Select any of the following:
// 1. The entire next line of code.
// 2. The right-hand side of the next line of code.
// 3. Just "PI *" of the right-hand side of the next line
// of code (to see the prompt for selection expansion).
// 4. All code within the method body.
// ...Then invoke Extract Method.
double area = PI * radius * radius;

return area / paintPerUnit;


}
}

Vea también
Referencia
Extraer método
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Cambiar nombre
Rename es una operación de refactorización que ofrece una manera sencilla de cambiar el nombre a los identificadores de los
símbolos de código, como campos, variables locales, métodos, espacios de nombres, propiedades y tipos. Cambiar nombre se
puede utilizar para cambiar los nombres en los comentarios y en las cadenas, además de en las declaraciones y las llamadas de
un identificador.
Nota
Cuando utilice Control de código fuente en Visual Studio, obtenga la última versión de los archivos fuente antes de intentar r
ealizar la operación de refactorización Cambiar nombre.

La operación de refactorización Cambiar nombre está disponible en las características de Visual Studio siguientes:
Caracterí Comportamiento de la refactorización en el entorno de desarrollo
stica
Editor de c En el editor de código, la operación de refactorización Cambiar nombre está disponible cuando se sitúa el cursor en
ódigo la declaración del símbolo de código. Cuando el cursor está en esta posición, puede invocar el comando Cambiar n
ombre; para ello, escriba el método abreviado de teclado, o bien seleccione Cambiar nombre en una etiqueta inte
ligente, en un menú contextual o en el menú Refactorizar. Cuando se selecciona el elemento de menú Cambiar n
ombre, aparece el cuadro de diálogo Cambiar nombre. Para obtener más información, vea
Cambiar nombre (Cuadro de diálogo) y Cómo: Cambiar el nombre de los identificadores.

Vista de cl Cuando se selecciona un identificador en la Vista de clases, la operación de refactorización Cambiar nombre está di
ases sponible en el menú contextual y en el menú Refactorizar.

Examinad Cuando se selecciona un identificador en el Examinador de objetos, la operación de refactorización Cambiar nombr
or de obje e sólo está disponible en el menú Refactorizar.
tos

Cuadrícul En la Cuadrícula de propiedades del Diseñador de Windows Forms, cuando se cambia el nombre de un control s
a de propi e inicia una operación Cambiar nombre para ese control. No aparece el cuadro de diálogo Cambiar nombre.
edades de
l Diseñado
r de Wind
ows Form
s

Explorado En el Explorador de soluciones, el comando Cambiar nombre está disponible en el menú contextual. Si el archivo
r de soluci de código fuente seleccionado contiene una clase cuyo nombre es el mismo que el del archivo, puede utilizar este c
ones omando para cambiar, de una vez, el nombre del archivo de recursos y ejecutar la operación de refactorización Ca
mbiar nombre.
Por ejemplo, si crea una aplicación predeterminada para Windows y luego cambia el nombre de Form1.cs por Test
Form.cs, entonces el nombre del archivo de código fuente Form1.cs cambiará a TestForm.cs y la clase Form1 y toda
s las referencias a ella también recibirán el nuevo nombre TestForm.
Nota
El comando Deshacer (CTRL+Z) únicamente deshará la operación de refactorización Cambiar nombre en el seno
del código, pero no volverá a establecer el nombre original del archivo.

Si el archivo de código fuente seleccionado no contiene una clase cuyo nombre es el mismo que el del archivo, en e
l Explorador de soluciones el comando Cambiar nombre únicamente cambiará el nombre del archivo de recursos y
no ejecutará la operación de refactorización Cambiar nombre.
Operaciones Cambiar nombre
Cuando se ejecuta Rename, el motor de refactorización realiza una operación de cambio de nombre específica para cada
símbolo de código, que se describe en la tabla siguiente.
Símb Operación Cambiar nombre
olo d
e cód
igo
Camp Cambia la declaración y los usos del campo por el nuevo nombre.
o

Varia Cambia la declaración y los usos de la variable por el nuevo nombre.


ble lo
cal

Méto Cambia el nombre del método y todas las referencias a ese método por el nuevo nombre.
do

Espaci Cambia el nombre del espacio de nombres por el nuevo nombre de la declaración, utilizando instrucciones y nombres c
o de n ompletos.
ombr
es Nota
Al cambiar el nombre de un espacio de nombres, Visual Studio actualiza también la propiedad Default Namespace
en la Página Aplicación del Diseñador de proyectos. Esta propiedad no se puede restablecer seleccionando Deshac
er en el menú Editar. Para restablecer el valor de la propiedad Default Namespace, debe editar la propiedad en el
Diseñador de proyectos.

Propi Cambia la declaración y los usos de la propiedad por el nuevo nombre.


edad

Tipo Cambia todas las declaraciones y todos los usos del tipo por el nuevo nombre, incluso los constructores y destructores.
Para los tipos parciales, la operación Cambiar nombre se propaga a todas las partes.
Comentarios
Cuando se cambia el nombre de un miembro que implementa o reemplaza, o es implementado o reemplazado por miembros
de otros tipos, Visual Studio muestra un cuadro de diálogo en el que se indica que la operación de cambio de nombre
producirá actualizaciones en cascada. Si hace clic en continuar, el motor de refactorización busca y cambia de nombre de
forma recursiva todos los miembros en tipos base y derivados que mantengan una relación de implementación o sustitución
con el miembro al que se va a cambiar de nombre.
El ejemplo de código siguiente contiene miembros con una relación de implementación o sustitución.
C#
interface IBase
{
void Method();
}
public class Base
{
public void Method()
{ }
public virtual void Method(int i)
{ }
}
public class Derived : Base, IBase
{
public new void Method()
{ }
public override void Method(int i)
{ }
}
public class C : IBase
{
public void Method()
{ }
}

En el ejemplo anterior, al cambiar el nombre de C.Method() se cambia también el nombre de Ibase.Method() porque
C.Method() implementa Ibase.Method(). A continuación, el motor de refactorización determina de forma recursiva que
Ibase.Method() está implementado por Derived.Method() y cambia el nombre de Derived.Method(). El motor de
refactorización no cambia el nombre de Base.Method(), porque Derived.Method() no reemplaza Base.Method(). El motor de
refactorización se detiene aquí a menos que haya activado Cambiar el nombre de las sobrecargas en el cuadro de diálogo
Cambiar nombre.
Si Cambiar el nombre de las sobrecargas está activado, el motor de refactorización cambia el nombre de
Derived.Method(int i) porque sobrecarga Derived.Method(), de Base.Method(int i) porque es reemplazado por
Derived.Method(int i) y de Base.Method() porque es una sobrecarga de Base.Method(int i).

Nota
Al cambiar el nombre de un miembro que se ha definido en un ensamblado al que se hace referencia, aparece un cuadro de
diálogo en el que se explica que ese cambio producirá errores de generación.

Vea también
Tareas
Cómo: Cambiar el nombre de los identificadores
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Cambiar nombre (Cuadro de diálogo)


Utilice Cambiar nombre para cambiar el nombre de identificadores de código de símbolos como campos, variables locales,
métodos, espacios de nombres, propiedades y tipos.
Nuevo nombre
Especifica el nuevo nombre de un identificador, que es el elemento de código al que se desea cambiar el nombre.
Ubicación
Identifica el espacio de nombres que se desea buscar al realizar la operación de cambio de nombre.
Vista previa de los cambios de referencia
Especifica que se desea obtener una vista previa de los cambios en el cuadro de diálogo Obtener vista previa de cambios
- Cambiar nombre antes de modificar el código.
Buscar en los comentarios
Especifica que se desea buscar en los comentarios al activar la casilla de verificación.
Buscar en las cadenas
Especifica que se desea buscar en las cadenas al activar la casilla de verificación.
Cambiar el nombre de las sobrecargas
Especifica que se desea incluir las sobrecargas de método en la operación de refactorización. Si se activa, el motor de
refactorización sólo cambia el nombre de los métodos que tienen el mismo nombre dentro del tipo y no de los tipos base o
heredados.
Nota
Esta opción sólo está disponible para los métodos.

Comentarios
Cuando la operación de refactorización Rename busca comentarios y cadenas, se cambia el texto basándose en una simple
coincidencia de cadenas en una operación de búsqueda y sustitución global. Se recomienda elegir Vista previa de los
cambios de referencia si está seleccionada Buscar en los comentarios o Buscar en las cadenas.
Al cambiar el nombre de un espacio de nombres, Visual Studio actualiza también la propiedad Default Namespace en la
Página Aplicación del Diseñador de proyectos. Esta propiedad no se puede restablecer seleccionando Deshacer en el menú
Editar. Para restablecer el valor de la propiedad Default Namespace, debe editar la propiedad en el Diseñador de
proyectos.
Vea también
Tareas
Cómo: Cambiar el nombre de los identificadores
Referencia
Cambiar nombre
Obtener vista previa de cambios (Cuadro de diálogo)
Desarrollo de aplicaciones con Visual C#

Diagrama de flujo para la refactorización de cambio de nombre


El diagrama siguiente muestra la secuencia de pasos para finalizar la operación de cambio de nombre de refactorización.

Vea también
Referencia
Cambiar nombre
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Cómo: Cambiar el nombre de los identificadores


El procedimiento siguiente describe cómo cambiar el nombre de un identificador en el código. Este procedimiento se utiliza
para realizar la operación de refactorización Cambiar nombre.
Para cambiar el nombre de un identificador
1. Cree una aplicación de consola como se describe en la sección de ejemplo siguiente.
Para obtener más información, vea Aplicación de consola.
2. Coloque el cursor en el método MethodB, bien en la declaración de método o bien en la llamada al método.
3. En el menú Refactorizar, seleccione Cambiar nombre. Aparecerá el Cambiar nombre (Cuadro de diálogo).
También puede utilizar el método abreviado de teclado F2 para mostrar el cuadro de diálogo Cambiar nombre.
O bien, puede hacer clic con el botón secundario en el cursor, señalar Refactorizar en el menú contextual y, a
continuación, hacer clic en Cambiar nombre para mostrar el cuadro de diálogo Cambiar nombre.
4. En el cuadro Nuevo nombre, escriba MethodC.
5. Active la casilla de verificación Buscar en los comentarios.
6. Haga clic en Aceptar.
7. En el cuadro de diálogo Obtener vista previa de cambios, haga clic en Aplicar.
Para cambiar el nombre de un identificador utilizando las etiquetas inteligentes
1. Cree una aplicación de consola como se describe en la sección de ejemplo siguiente.
Para obtener más información, vea Aplicación de consola.
2. En la declaración para MethodB, escriba o retroceda sobre el identificador de método. Aparecerá el texto de la etiqueta
inteligente debajo de este identificador.
Nota
Sólo puede invocar la operación de refactorización Cambiar nombre utilizando etiquetas inteligentes en la declaración
de un identificador.

3. Presione MAYÚS+ALT+F10 y, a continuación, la FLECHA ABAJO para mostrar el menú de etiquetas inteligentes.
O bien,
Mueva el puntero del mouse sobre el texto de la etiqueta inteligente, para mostrarla. A continuación, mueva el puntero
del mouse sobre la etiqueta inteligente y haga clic en la flecha abajo para mostrar el menú de etiquetas inteligentes.
4. Seleccione la opción de menú Cambiar nombre de '<identificador1> ' a '<identificador2 >', a fin de invocar
Cambiar nombre sin ver una vista previa de los cambios del código. Todas las referencias a <identificador1> se
actualizarán automáticamente a <identificador2>.
O bien,
Seleccione el elemento de menú Cambiar nombre con vista previa, para invocar la operación de refactorización con
una vista previa de los cambios del código. Aparecerá el cuadro de diálogo Obtener vista previa de cambios.
Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada RenameIdentifier y, a continuación, reemplace
Class1 con el código siguiente. Para obtener más información, vea Aplicación de consola.

class ProtoClassA
{
// Invoke on 'MethodB'.
public void MethodB(int i, bool b) { }
}

class ProtoClassC
{
void D()
{
ProtoClassA MyClassA = new ProtoClassA();
// Invoke on 'MethodB'.
MyClassA.MethodB(0, false);
}
}

Vea también
Referencia
Cambiar nombre
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Encapsular campo
La operación de refactorización Encapsular campo permite crear rápidamente una propiedad a partir de un campo existente
y, a continuación, actualizar el código de forma transparente con referencias a la nueva propiedad.
Cuando un campo es public (Referencia de C#), otros objetos tienen acceso directo a dicho campo y pueden modificarlo, no
siendo detectados por el objeto que posee dicho campo. Si encapsula dicho campo a través del uso de
Propiedades (Guía de programación de C#), puede denegar el acceso directo a los campos.
Para crear la nueva propiedad, la operación Encapsular campo cambia el modificador de acceso del campo que desea
encapsular a private (Referencia de C#) y, a continuación, genera los descriptores de acceso get y set de dicho campo. En
algunos casos, sólo se genera un descriptor de acceso get, por ejemplo cuando el campo se declara de sólo lectura.
El motor de refactorización actualiza el código con referencias a la nueva propiedad en las áreas especificadas en la sección
Actualizar referencias del Encapsular campo (Cuadro de diálogo).
Comentarios
La operación Encapsular campo sólo es posible cuando el cursor se coloca en la misma línea que la declaración de campo.
Para las declaraciones que declaran varios campos, Encapsular campo usa la coma como límite entre los campos e inicia la
refactorización en el campo que está más cerca del cursor, en la misma línea que el cursor. También puede especificar qué
campo desea encapsular seleccionando el nombre de dicho campo en la declaración.
Los fragmentos de código de Encapsular campo modelan el código generado por esta operación de refactorización. Los
fragmentos de código se pueden modificar. Para obtener más información, vea Cómo: Administrar fragmentos de código.
Para obtener más información sobre cuándo utilizar los campos y cuándo utilizar las propiedades, vea
Comparación de procedimientos de propiedades y campos.
Vea también
Tareas
Cómo: Refactorizar código con Encapsular campo
Conceptos
Refactorización
Fragmentos de código (C#)
Desarrollo de aplicaciones con Visual C#

Encapsular campo (Cuadro de diálogo)


Este cuadro de diálogo se utiliza para especificar la configuración de la operación de refactorización Encapsular campo.
Nombre de campo
Identifica el nombre actual del campo para el que se genera una nueva propiedad.
Nombre de la propiedad
Especifica el nombre de la nueva propiedad generada por Encapsular campo. La operación de refactorización genera
automáticamente un nombre de propiedad único. Sin embargo, puede cambiar este nombre por cualquier identificador
válido.
Nota
Si el nombre introducido es un identificador no válido o entra en conflicto con un nombre existente, aparecerá un error y la
refactorización se interrumpirá.

Actualizar referencias:
Especifica dónde el motor de refactorización actualizará de manera automática el código con las referencias a la nueva
propiedad.
Opc Descripción
ión
Exte Especifica que cada referencia al campo que está fuera del tipo que lo engloba se reemplazará con una referencia a la n
rnal ueva propiedad. Los usos del campo dentro del tipo que lo engloba siguen siendo los mismos.

Tod Especifica que cada referencia al campo se reemplazará con una referencia a la nueva propiedad.
o
Nota
Encapsular campo no actualizará las referencias al campo dentro de los constructores.

Vista previa de los cambios de referencia


Especifica que los cambios del código fuente aparecerán en el cuadro de diálogo Obtener vista previa de cambios -
Encapsular campo antes de que modificar el código.
Buscar en los comentarios
Especifica que el motor de refactorización buscará en los comentarios del código fuente las referencias del campo existente
que se va a actualizar.
Buscar en las cadenas
Especifica que el motor de refactorización buscará en los valores de las cadenas las referencias del campo existente que se va
a actualizar.
Comentarios
Cuando la operación de refactorización Encapsular campo busca en los comentarios y las cadenas, el texto se modifica de
acuerdo con las coincidencias de texto de la operación de búsqueda y reemplazo global. Para evitar errores, seleccione Vista
previa de los cambios de referencia cuando seleccione Buscar en los comentarios o Buscar en las cadenas.
Vea también
Tareas
Cómo: Refactorizar código con Encapsular campo
Referencia
Obtener vista previa de cambios (Cuadro de diálogo)
Desarrollo de aplicaciones con Visual C#

Cómo: Refactorizar código con Encapsular campo


El procedimiento siguiente describe cómo crear una propiedad a partir de un campo existente y, a continuación, actualizar el
código con referencias a la nueva propiedad. Este procedimiento se utiliza para realizar la operación de refactorización
Encapsular campo.
Para crear una propiedad a partir de un campo
1. Cree una aplicación de consola como se describe en el ejemplo siguiente.
Para obtener más información, vea Plantilla de aplicación de consola.
2. En Editor de código y de texto, coloque el cursor en la declaración, en el nombre del campo que desea encapsular. En el
ejemplo siguiente, coloque el cursor en palabra width:

public int width, height;

3. Seleccione Encapsular campo en el menú Refactorizar. Aparecerá el Encapsular campo (Cuadro de diálogo).
También puede presionar CTRL+R, CTRL+F, que es el método abreviado de teclado para mostrar el cuadro de diálogo
Encapsular campo.
O bien, puede hacer clic con el botón secundario en el cursor, señalar Refactorizar en el menú contextual y, a
continuación, hacer clic en Encapsular campo para mostrar el cuadro de diálogo Encapsular campo.
4. Especifique la configuración.
5. Presione ENTRAR o haga clic en el botón Aceptar.
6. Si ha seleccionado la opción Vista previa de los cambios de referencia, se abrirá la ventana
Vista previa de los cambios de referencia. Haga clic en el botón Aplicar.
Aparece el siguiente código fuente de los descriptores de acceso get y set en el archivo de código fuente:

public int Width


{
get
{
return width;
}

set
{
width = value;
}
}

El código del método Main también se actualiza con el nuevo nombre de propiedad Width.

Square mySquare = new Square();


mySquare.Width = 110;
mySquare.height = 150;
// Output values for width and height.
Console.WriteLine("width = {0}", mySquare.Width);

Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada EncapsulateFieldExample y, a continuación,
reemplace Class1 con el código siguiente. Para obtener más información, vea Aplicación de consola.
class Square
{
// Select the word 'width' then use Encapsulate Field.
public int width, height;
}
class MainClass
{
public static void Main()
{
Square mySquare = new Square();
mySquare.width = 110;
mySquare.height = 150;
// Output values for width and height.
Console.WriteLine("width = {0}", mySquare.width);
Console.WriteLine("height = {0}", mySquare.height);
}
}

Vea también
Referencia
Encapsular campo
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Extraer interfaz
Extraer interfaz es una operación de refactorización que ofrece una manera sencilla de crear una nueva interfaz con miembros
originados a partir de una clase, estructura o interfaz existente.
Cuando varios clientes utilizan el mismo subconjunto de miembros de una clase, estructura o interfaz, o cuando varias clases,
estructuras o interfaces tienen un subconjunto de miembros en común, puede resultar de gran utilidad integrar el subconjunto
de miembros en una interfaz. Para obtener más información sobre el uso de interfaces, vea
Interfaces (Guía de programación de C#).
Extraer interfaz genera una interfaz en un nuevo archivo y coloca el cursor al principio del nuevo archivo. Puede especificar qué
miembros se extraerán a la nueva interfaz, el nombre de ésta y el nombre del archivo generado, todo ello en el
Extraer interfaz (Cuadro de diálogo).
Comentarios
Únicamente se puede tener acceso a esta característica cuando el cursor está situado en la clase, la estructura o la interfaz que
contiene los miembros que se desea extraer. Cuando el cursor está en esta posición, invoque la operación de refactorización
Extraer interfaz.
Cuando se invoca Extraer interfaz en una clase o estructura, la lista de bases e interfaces se modifica, a fin de incluir el nombre
de la nueva interfaz. Cuando se invoca Extraer interfaz en una interfaz, la lista de bases e interfaces no se modifica.
Vea también
Tareas
Cómo: Refactorizar código con Extraer interfaz
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Extraer interfaz (Cuadro de diálogo)


Este cuadro de diálogo se utiliza para especificar la configuración de la operación de refactorización Extraer interfaz. Este
cuadro de diálogo se encuentra disponible en el menú Refactorizar.
Nuevo nombre de interfaz
Especifica el nombre de la interfaz que se va a generar.
Nombre generado
Muestra el nombre que se agrega a la lista de bases e interfaces del tipo (clase o estructura) del que se ha extraído la interfaz.
Nuevo nombre de archivo
Especifica el nombre del archivo nuevo que contendrá la nueva interfaz.
Seleccionar miembros públicos para formar la interfaz
Muestra todos los miembros válidos que se pueden utilizar para rellenar la nueva interfaz. Éstos incluyen métodos,
indizadores, propiedades y eventos.
Seleccione cada miembro que desea extraer a la nueva interfaz. Puede utilizar los botones situados a la derecha para
Seleccionar todo o Cancelar selección de los miembros, para formar la interfaz.
Vea también
Tareas
Cómo: Refactorizar código con Extraer interfaz
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Cómo: Refactorizar código con Extraer interfaz


Este procedimiento se utiliza para realizar la operación de refactorización Extraer interfaz.
Para utilizar Extraer interfaz
1. Cree una aplicación de consola como se describe en el ejemplo siguiente.
Para obtener más información, vea Aplicación de consola.
2. Con el cursor colocado en MethodB, seleccione Extraer interfaz en el menú Refactorizar. Aparecerá el
Extraer interfaz (Cuadro de diálogo).
También puede presionar CTRL+R, CTRL+I, que es el método abreviado de teclado para mostrar el cuadro de diálogo
Extraer interfaz.
O bien, puede hacer clic con el botón secundario en el cursor, señalar Refactorizar en el menú contextual y, a
continuación, hacer clic en Extraer interfaz para mostrar el cuadro de diálogo Extraer interfaz.
3. Haga clic en Seleccionar todo.
4. Haga clic en el botón Aceptar.
Aparece el nuevo archivo, IProtoA.cs y el código siguiente:

using System;
namespace TopThreeRefactorings
{
interface IProtoA
{
void MethodB(string s);
}
}

Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada ExtractInterface y, a continuación, reemplace
Class1 con el código siguiente. Para obtener más información, vea Aplicación de consola.

// Invoke Extract Interface on ProtoA.


// Note: the extracted interface will be created in a new file.
class ProtoA
{
public void MethodB(string s) { }
}

Vea también
Referencia
Extraer interfaz
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Promocionar una variable local a parámetro


Promocionar variable local a parámetro es una operación de refactorización de Visual C# que ofrece una manera sencilla de
trasladar una variable del un uso local a un parámetro de método, indizador o constructor y, al mismo tiempo, actualizar
correctamente los sitios de llamada.
Para efectuar la operación Promocionar variable local a parámetro, en primer lugar sitúe el cursor en la variable que desee
promocionar. La instrucción que declara la variable también debe asignar un valor o expresión a la variable. Una vez colocado
el cursor en su lugar, invoque la operación Promocionar variable local a parámetro. Para ello, escriba el método abreviado de
teclado o seleccione el comando en el menú contextual.
Cuando se invoca la operación Promocionar variable local a parámetro, la variable se agrega al final de la lista de parámetros
del miembro. Cualquier llamada efectuada al miembro modificado se actualiza de forma inmediata con el nuevo parámetro
como si fuera la expresión asignada a la variable originalmente, y el código queda de modo que funciona igual que antes de
que se promocionara la variable. Para obtener más información, vea Cómo: Promocionar una variable local a parámetro.
Comentarios
Esta refactorización funciona mejor cuando a la variable promocionada se le asigna un valor constante. La variable se debe
declarar y también inicializar, no basta con limitarse a declararla o asignarla.
Vea también
Tareas
Cómo: Promocionar una variable local a parámetro
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Cómo: Promocionar una variable local a parámetro


Utilice este procedimiento para realizar la operación de refactorización Promocionar una variable local a parámetro. Para
obtener más información, vea Promocionar una variable local a parámetro.
Para promocionar una variable local a parámetro
1. Cree una aplicación de consola y configúrela como se describe en el ejemplo siguiente. Para obtener más información,
vea Plantilla de aplicación de consola.
2. Coloque el cursor de i en MethodB.
3. En el menú Refactorizar, seleccione Promocionar variable local a parámetro.
También puede presionar el método abreviado de teclado CTRL+R, CTRL+P para finalizar la operación de refactorización.
También puede hacer clic con el botón secundario en el cursor, seleccionar Refactorizar en el menú contextual y, a
continuación, hacer clic en Promocionar variable local a parámetro para finalizar la operación de refactorización.
Ahora el MethodB debería tener un parámetro int i, mientras que la llamada ProtoA.MethodB pasará 0 como valor.
Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada PromoteLocal y, a continuación, reemplace Class1 por
el código siguiente. Para obtener más información, vea Plantilla de aplicación de consola.

class ProtoA
{
public static void MethodB()
{
// Invoke on 'i'
int i = 0;
}
}

class ProtoC
{
void MethodD()
{
ProtoA.MethodB();
}
}

Vea también
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Quitar parámetros
Remove Parameters es un operación de refactorización que proporciona una forma sencilla para quitar parámetros de
métodos, indizadores o delegados. Remove Parameters cambia la declaración; en cualquier ubicación en la que se llame al
miembro, se quitará el parámetro para reflejar la nueva declaración.
La operación Remove Parameters se realiza colocando primero el cursor en un método, indizador o delegado. Cuando el
cursor está en posición, podrá invocar la operación Quitar Parameters si se selecciona en el menú Refactorizar, presionando
el método abreviado de teclado o seleccionando el comando en un menú contextual.
Al invocar al comando Quitar parámetros, aparece el cuadro de diálogo Quitar parámetros. Para obtener más información,
vea Quitar parámetros (Cuadro de diálogo) o Cómo: Quitar parámetros.
Comentarios
Es posible quitar los parámetros de una declaración de método o de una llamada al método. Coloque el cursor en la
declaración de método o en el nombre de delegado e invoque a Quitar parámetros.
Precaución
Quitar parámetros permite eliminar un parámetro al que se hace referencia dentro del cuerpo del miembro, pero no quita la
s referencias a dicho parámetro en el cuerpo del método. Esto puede producir errores de generación en el código. Sin embar
go, puede utilizar el Obtener vista previa de cambios (Cuadro de diálogo) para revisar el código, antes de ejecutar la operació
n de refactorización.

Si un parámetro que se está quitando se modifica durante la llamada a un método, la eliminación del parámetro también
quitará la modificación. Por ejemplo, si se cambia una llamada a un método de:

MyMethod(param1++, param2);

MyMethod(param2);

no se incrementará param1 mediante la operación de refactorización.


Vea también
Tareas
Cómo: Quitar parámetros
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Quitar parámetros (Cuadro de diálogo)


Utilice este cuadro de diálogo para identificar los parámetros que desea quitar durante la operación de refactorización
Quitar parámetros.
Parámetros
Permite quitar un parámetro de una lista.
Vista previa de la firma del método
Muestra la nueva firma del método con el parámetro quitado.
Vista previa de los cambios de referencia
Especifica que se muestre el cuadro de diálogo Obtener vista previa de cambios - Quitar parámetros cuando se activa la
casilla de verificación.
Comentarios
Si un parámetro que se está quitando se modifica durante la llamada a un método, la eliminación del parámetro también
quitará la modificación. Por ejemplo, si se cambia una llamada a un método de:

MyMethod(param1++, param2);

a:

MyMethod(param2);

no se incrementará param1 mediante la operación de refactorización. Se recomienda obtener una vista previa de los cambios
relacionados con la referencia.
Vea también
Tareas
Cómo: Quitar parámetros
Referencia
Quitar parámetros
Obtener vista previa de cambios (Cuadro de diálogo)
Desarrollo de aplicaciones con Visual C#

Cómo: Quitar parámetros


Este procedimiento se utiliza para realizar la operación de refactorización Remove Parameters. Para obtener más
información, vea Quitar parámetros.
Para quitar los parámetros
1. Cree una aplicación de consola y prepare el ejemplo siguiente.
Para obtener más información, vea Plantilla de aplicación de consola.
2. Coloque el cursor en el método A, bien en la declaración de método o bien en la llamada al método.
3. En el menú Refactorizar, seleccione Quitar parámetros para mostrar el Quitar parámetros (Cuadro de diálogo).
También puede presionar CTRL+R, CTRL+V, que es el método abreviado de teclado para mostrar el cuadro de diálogo
Quitar parámetros.
O bien, puede hacer clic con el botón secundario en el cursor, señalar Refactorizar en el menú contextual y, a
continuación, hacer clic en Quitar parámetros para mostrar el cuadro de diálogo Quitar parámetros.
4. Utilizando el campo Parámetros, coloque el cursor en int i y haga clic en el botón Quitar.
5. Haga clic en Aceptar.
6. En el cuadro de diálogo Obtener vista previa de cambios - Quitar parámetros, haga clic en Aplicar.
Ejemplo
Para preparar este ejemplo, cree una aplicación de consola denominada RemoveParameters y, a continuación, reemplace
Class1 con el código siguiente. Para obtener más información, vea Plantilla de aplicación de consola.

class A
{
// Invoke on 'A'.
public A(string s, int i) { }
}

class B
{
void C()
{
// Invoke on 'A'.
A a = new A("a", 2);
}
}

Vea también
Referencia
Quitar parámetros
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Reordenar parámetros
Reordenar parámetros es una operación de refactorización de Visual C# que proporciona una manera sencilla de cambiar el
orden de los parámetros para los métodos, indizadores y delegados. Reordenar parámetros cambia la declaración y, en todas
las ubicaciones donde se llama al miembro, los parámetros se reorganizan para reflejar el nuevo orden.
Para realizar la operación Reordenar parámetros, en primer lugar sitúe el cursor en un método, indizador o delegado. Una vez
colocado el cursor en su lugar, invoque la operación Reordenar parámetros. Para ello, escriba el método abreviado de teclado
o seleccione el comando en el menú contextual.
Cuando invoca Reordenar parámetros, se abre el cuadro de diálogo Reordenar parámetros. Para obtener más información, vea
Reordenar parámetros (Cuadro de diálogo) y Cómo: Reordenar parámetros.
Comentarios
Puede reordenar los parámetros de una declaración de método o una llamada al método. Coloque el cursor en la declaración
de método o delegado, pero no en el cuerpo.
Vea también
Tareas
Cómo: Reordenar parámetros
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Reordenar parámetros (Cuadro de diálogo)


Utilice este cuadro de diálogo para especificar el orden de los parámetros de la operación de refactorización
Reordenar parámetros.
Parámetros
Permite subir o bajar un parámetro en una lista utilizando los botones de flecha.
Vista previa de la firma del método
Muestra un facsímil de la firma del método con el parámetro reordenado.
Vista previa de los cambios de referencia
Especifica que se muestre el cuadro de diálogo Obtener vista previa de cambios - Reordenar parámetros cuando se
activa la casilla de verificación.
Vea también
Tareas
Cómo: Reordenar parámetros
Referencia
Reordenar parámetros
Obtener vista previa de cambios (Cuadro de diálogo)
Desarrollo de aplicaciones con Visual C#

Cómo: Reordenar parámetros


Puede cambiar el orden de los parámetros para los métodos, indizadores, constructores y delegados, y actualizar
automáticamente los sitios de llamada mediante la operación de refactorización Reordenar parámetros.
Para reordenar parámetros
1. Cree una Biblioteca de clases y configúrela como se describe a continuación en la sección de ejemplo.
2. Coloque el cursor en MethodB, en la declaración de método o la llamada al método.
3. En el menú Refactorizar, haga clic en Reordenar parámetros.
O bien
Presione el método abreviado de teclado CTRL+R, CTRL+O para mostrar el cuadro de diálogo Reordenar parámetros.
O bien
Haga clic con el botón secundario en el cursor, seleccione Refactorizar en el menú contextual y, a continuación, haga clic
en Reordenar parámetros para mostrar el cuadro de diálogo Reordenar parámetros.
Aparecerá el Reordenar parámetros (Cuadro de diálogo).
4. En el cuadro de diálogo Reordenar parámetros, seleccione int i en la lista Parámetros. A continuación, haga clic en el
botón hacia abajo.
O bien
Arrastre int i debajo de bool b en la lista Parámetros.
5. En el cuadro de diálogo Reordenar parámetros, haga clic en Aceptar.
Si se selecciona la opción Vista previa de los cambios de referencia en el cuadro de diálogo Reordenar parámetros,
aparecerá el cuadro de diálogo Obtener vista previa de cambios - Reordenar parámetros. Proporciona una vista
previa de los cambios realizados en la lista de parámetros de MethodB en la firma y la llamada al método.
a. Si aparece el cuadro de diálogo Obtener vista previa de cambios - Reordenar parámetros, haga clic en
Aplicar.
En este ejemplo, se actualiza la declaración de método y todos los sitios de llamada al método de MethodB.
Ejemplo
Para preparar este ejemplo, cree una biblioteca de clases denominada ReorderParameters y, a continuación, reemplace Class1
por el código siguiente.

class ProtoClassA
{
// Invoke on 'MethodB'.
public void MethodB(int i, bool b) { }
}
class ProtoClassC
{
void D()
{
ProtoClassA MyClassA = new ProtoClassA();

// Invoke on 'MethodB'.
MyClassA.MethodB(0, false);
}
}

Vea también
Referencia
Reordenar parámetros
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Obtener vista previa de cambios (Cuadro de diálogo)


El cuadro de diálogo Obtener vista previa de cambios permite revisar todos los cambios de referencias que efectuaría la
operación de refactorización en el código antes de ejecutar esa operación.
La obtención de una vista previa de los cambios constituye un proceso de refactorización opcional. Para obtener una vista
previa de los cambios de referencias, active la opción Vista previa de los cambios de referencia, disponible en los cuadros
de diálogo siguientes:
Cambiar nombre (Cuadro de diálogo)
Encapsular campo (Cuadro de diálogo)
Quitar parámetros (Cuadro de diálogo)
Reordenar parámetros (Cuadro de diálogo)
Nota
La operación de refactorización Cambiar nombre desde la Cuadrícula de propiedades del Diseñador de Windows Forms se
modifica el código directamente. No aparece el cuadro de diálogo Cambiar nombre ni el cuadro de diálogo Obtener vista
previa de cambios. Para obtener más información, vea la operación de refactorización Cambiar nombre.

<Refactorizar> <Código> como <Código_refactorizado>


Muestra dónde va a cambiar el código del proyecto. Las instrucciones de código aparecen como nodos bajo los nodos de los
archivos de código fuente. Cuando se selecciona un nodo de instrucción de código, la referencia correspondiente parece
refactorizada y resaltada en el cuadro de texto Vista previa de cambios de código.
Vista previa de cambios de código
Muestra el programa, con todos los cambios de referencias incorporados en él por la operación de refactorización.
Vea también
Tareas
Cómo: Cambiar el nombre de los identificadores
Cómo: Refactorizar código con Encapsular campo
Cómo: Quitar parámetros
Cómo: Reordenar parámetros
Desarrollo de aplicaciones con Visual C#

Advertencia de refactorización (Cuadro de diálogo)


Este cuadro de diálogo de advertencia indica que el compilador no tiene un conocimiento completo del programa y que es
posible que el motor de refactorización no pueda actualizar todas las referencias apropiadas. Este cuadro de diálogo de
advertencia también ofrece la posibilidad de realizar una vista previa del código en el
Obtener vista previa de cambios (Cuadro de diálogo) antes de confirmar los cambios.
Nota
Si un método contiene un error de sintaxis (que el IDE indica con una línea de subrayado ondulada roja), el motor de refactor
ización no actualizará las referencias a un elemento dentro de dicho método. El ejemplo siguiente muestra este comportamie
nto.

De forma predeterminada, si ejecuta una operación de refactorización sin realizar una vista previa de los cambios de las
referencias y el programa detecta un error de compilación, el entorno de desarrollo mostrará este cuadro de diálogo de
advertencia.
Si ejecuta una operación de refactorización que tiene activada la opción Vista previa de los cambios de referencia y el
programa detecta un error de compilación, el entorno de desarrollo mostrará el siguiente mensaje de advertencia en la parte
inferior del cuadro de diálogo Obtener vista previa de cambios, en lugar de mostrar el cuadro de diálogo Advertencia de
refactorización:
El proyecto o una de sus dependencias no se genera actualmente. Puede que las referencias no estén actualizadas.
Esta advertencia de refactorización sólo está disponible para las operaciones de refactorización que proporcionan la opción
Vista previa de los cambios de referencia, que está disponible en los siguientes cuadros de diálogo de refactorización:
Cambiar nombre (Cuadro de diálogo)
Encapsular campo (Cuadro de diálogo)
Quitar parámetros (Cuadro de diálogo)
Reordenar parámetros (Cuadro de diálogo)
Muestre este cuadro de diálogo cada vez
Esta opción está seleccionada de forma predeterminada. Si está activada, el cuadro de diálogo Advertencia de
refactorización sigue apareciendo si se detectan errores de compilación durante una operación de refactorización.
Si se desactiva esta casilla de verificación, se deshabilita el cuadro de diálogo de advertencia para futuras operaciones de
refactorización. Si desactiva esta casilla de verificación, para volver a habilitar este cuadro de diálogo de advertencia para
futuras operaciones de refactorización, seleccione la opción Advertir si hay errores de generación al refactorizar en el
Avanzadas, C#/J#, Editor de texto, Opciones (Cuadro de diálogo).
Continuar
Continúa la operación de refactorización actual sin obtener una vista previa de los cambios de las referencias.
Vista previa
Abre el Obtener vista previa de cambios (Cuadro de diálogo) para que pueda obtener una vista previa del código.
Cancelar
Cancela la operación de refactorización actual. No se producirá ningún cambio en el código.
Ejemplo
El ejemplo de código siguiente muestra el lugar donde el motor de refactorización no actualizará las referencias. Si usa la
refactorización para cambiar el nombre example por otro nombre, no se actualizará la referencia de ContainsSyntaxError,
mientras que sí se actualizarán las otras dos referencias.

public class Class1


{
static int example;
static void ContainsSyntaxError()
{
example = 20
}
static void ContainsSemanticError()
{
example = "Three";
}

static void ContainsNoError()


{
example = 1;
}
}

Vea también
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Resultados de la comprobación (Cuadro de diálogo)


Este cuadro de diálogo aparece cuando el motor de refactorización detecta errores de compilación o problemas de reenlace
durante el proceso de comprobación de la refactorización.
Resultados de la comprobación
Identifica las instrucciones que podrían contener errores de compilación o problemas de reenlace a causa de una operación
de refactorización.
Vista previa de problemas
Muestra una vista previa de los cambios de referencia (o del código refactorizado) que introducirían errores de compilación
o problemas de reenlace en el programa.
Comentarios
Este cuadro de diálogo no aparecerá en las circunstancias siguientes:
El código fuente genera errores de compilación no resueltos antes de iniciar una operación de refactorización y no se
introduce ningún problema de reenlace como resultado de la operación de refactorización.
El usuario borra todas las referencias en el cuadro de diálogo Obtener vista previa de cambios.
Se hace clic en Sí cuando aparece un cuadro de diálogo de advertencia que le informa de que existe un conflicto de
nombres y de que la operación de refactorización omitirá el proceso de verificación.
Problemas de reenlace
Un problema de reenlace se produce cuando en una operación de refactorización una referencia del código se enlaza, de
manera accidental, a otro elemento distinto de aquél al que estaba enlazada originalmente. El cuadro de diálogo Resultados
de la comprobación distingue entre dos tipos de problemas de reenlace.
Referencias cuya definición ya no será el símbolo al que se ha cambiado el nombre
Este tipo de problema de reenlace se produce cuando una referencia ya no hace referencia a un símbolo cuyo nombre ha
cambiado. Por ejemplo, considere el siguiente código:

class Example
{
private int a;
public Example(int b)
{
a = b;
}
}

Si utiliza la refactorización para cambiar el nombre de a por b, aparece este cuadro de diálogo. La referencia a la variable a,
cuyo nombre ha cambiado, ahora se enlaza al parámetro que se pasa al constructor, en lugar de enlazarse al campo.
Referencias cuya definición pasará a ser el símbolo cuyo nombre ha cambiado
Este tipo de problema de reenlace se produce cuando una referencia que antes no hacía referencia al símbolo cuyo nombre ha
cambiado, ahora sí hace referencia a él. Por ejemplo, considere el siguiente código:

class Example
{
private static void Method(object a)
{
}
private static void OtherMethod(int a)
{
}
static void Main(string[] args)
{
Method(5);
}
}

Si utiliza la refactorización para cambiar el nombre de OtherMethod por Method, aparece este cuadro de diálogo. La referencia
de Main ahora hace referencia al método sobrecargado que acepta un parámetro int en lugar del método sobrecargado que
acepta un parámetro object.
Vea también
Referencia
Obtener vista previa de cambios (Cuadro de diálogo)
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Fragmentos de código (C#)


Visual Studio ofrece una nueva característica denominada fragmentos de código. Los fragmentos de código pueden utilizarse
para escribir un alias corto que luego pueda expandirse dentro de un constructor común de programación. Así, el fragmento
de código for crea un bucle for vacío. Algunos fragmentos de código son fragmentos de código con incorporación de entorno,
lo que permite seleccionar líneas de código e incluirlas en el proceso del fragmento de código. Por ejemplo, al seleccionar
líneas de código y activar después el fragmento de código for, se creará un bucle for que incluirá dichas líneas en su bloque.
De este modo, los fragmentos de código hacen de la escritura de código de programación un proceso más rápido, sencillo y
fiable.
Utilizar fragmentos de código
Los fragmentos de código suelen utilizarse en el editor de código; para ello, escriba un nombre corto para el alias (acceso
directo al fragmento de código) y presione la tecla TAB. Además, el menú IntelliSense ofrece el comando Insertar fragmento
de código que proporciona una lista de fragmentos de código disponibles para su inserción en el editor de código. Para
activar la lista de fragmentos de código, escriba CTRL+K y, a continuación, X. Para obtener más información, vea
Cómo: Utilizar fragmentos de código (C#) y Cómo: Utilizar fragmentos de código envolventes.
Una vez seleccionado un fragmento de código, su texto queda insertado automáticamente en la posición del cursor. En este
punto, todos los campos modificables del fragmento de código se resaltan en amarillo y se selecciona automáticamente el
primer campo modificable. El campo seleccionado está rodeado por un rectángulo rojo. Por ejemplo, en el fragmento de
código for, los campos modificables son la variable del inicializador (i de forma predeterminada) y la expresión de longitud
(length de forma predeterminada).
Una vez seleccionado un campo, puede escribirse un nuevo valor. Presione la tecla TAB para recorrer de manera cíclica los
campos modificables del fragmento de código; utilice MAYÚS+TAB para hacerlo en el orden inverso. Al hacer clic en un campo,
se coloca el cursor en él; si hace doble clic, se selecciona. Cuando se resalta un campo aparece su información sobre
herramientas, que lo describe.
Sólo se puede editar la primera instancia de un campo; cuando ese campo esté resaltado, las restantes instancias aparecerán
con contorno. Cuando se cambia el valor de un campo modificable, éste cambia en todas las posiciones que ocupa dentro del
fragmento de código.
Presione ENTRAR o ESC para cancelar la edición de campos y que el editor de código vuelva a su estado normal.
Los colores predeterminados de los campos modificables del fragmento de código se pueden modificar; para ello, cambie el
valor del campo Fragmento de código en el panel Fuentes y colores del cuadro de diálogo Opciones. Para obtener más
información, vea Cómo: Cambiar el nombre, tamaño y color de fuente en el editor.
Crear fragmentos de código
Aparte de los que ya se incluyen con Visual Studio de forma predeterminada, se puede crear y utilizar fragmentos de código
personalizados. Para obtener más información sobre cómo crear fragmentos de código personalizados, vea
Crear fragmentos de código.
Nota
Para los fragmentos de código en C#, los caracteres válidos para especificar el campo <Acceso directo> son: caracteres alfan
uméricos, el signo de sostenido (#), el carácter de tilde (~), el carácter de subrayado (_) y el carácter de guión corto (-).

Para obtener más información sobre los fragmentos de código que de incluyen de manera predeterminada en Visual C#, vea
Fragmentos de código predeterminados.
Vea también
Referencia
Selector de fragmentos de código
Desarrollo de aplicaciones con Visual C#

Fragmentos de código predeterminados


La herramienta de inserción de fragmento de código inserta un fragmento de código en la posición del cursor o inserta un
fragmento de código envolvente alrededor del código seleccionado actualmente. La herramienta de inserción de fragmento de
código se invoca a través de los comandos Insertar fragmento de código o Envolver con del menú IntelliSense, o
mediante los métodos abreviados de teclado CTRL+K, posteriormente X y CTRL+K y, a continuación, S respectivamente.
La herramienta de inserción de fragmento de código muestra el nombre de todos los fragmentos de código disponibles. La
herramienta de inserción de fragmento de código también incluye un cuadro de diálogo de entrada en el que puede escribir el
nombre del fragmento de código o parte de éste. La herramienta de inserción de fragmento de código resalta la coincidencia
más cercana a un nombre de fragmento de código. Si se presiona en cualquier momento el TABULADOR, se cerrará la
herramienta de inserción de fragmento de código y se insertará el fragmento de código seleccionado actualmente. Si se
presiona ESC o se hace clic con el mouse (ratón) en el Editor de código, se cerrará la herramienta de inserción de fragmento de
código sin insertar ningún fragmento de código.
Fragmentos de código predeterminados
Los siguientes fragmentos de código aparecen incluidos en Visual Studio de forma predeterminada.
Nombre (o Descripción Ubicaciones válidas donde se puede insertar
acceso dire el fragmento
cto)
#if Crea una directiva #if y una directiva #endif. En cualquier parte.

#region Crea una directiva #region y una directiva #endregion. En cualquier parte.

~ Crea un destructor para la clase contenedora. Dentro de una clase.

attribute Crea una declaración para una clase que se deriva de Attribute. Dentro de un espacio de nombres (incluido el es
pacio de nombres global), una clase o una estruct
ura.

checked Crea un bloque checked. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

class Crea una declaración de clase. Dentro de un espacio de nombres (incluido el es


pacio de nombres global), una clase o una estruct
ura.

ctor Crea un constructor para la clase contenedora. Dentro de una clase.

cw Crea una llamada a WriteLine. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

do Crea un bucle do while. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

else Crea un bloque else. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

enum Crea una declaración enum. Dentro de un espacio de nombres (incluido el es


pacio de nombres global), una clase o una estruct
ura.
equals Crea una declaración de método que reemplaza el método Dentro de una clase o una estructura.
Equals definido en la clase Object.

exception Crea una declaración de una clase que deriva de una excepción Dentro de un espacio de nombres (incluido el es
(Exception de forma predeterminada). pacio de nombres global), una clase o una estruct
ura.

for Crea un bucle for. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

foreach Crea un bucle foreach. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

forr Crea un bucle for que disminuye la variable de bucle después Dentro de un método, un indizador, un descripto
de cada iteración. r de acceso a propiedad o un descriptor de acces
o a evento.

if Crea un bloque if. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

indizador (in Crea una declaración de indizador. Dentro de una clase o una estructura.
dexer)

interface Crea una declaración interface. Dentro de un espacio de nombres (incluido el es


pacio de nombres global), una clase o una estruct
ura.

invoke Crea un bloque que invoca un evento de forma segura. Dentro de un método, un indizador, un descripto
r de acceso a propiedad o un descriptor de acces
o a evento.

iterator Crea un elemento de iteración. Dentro de una clase o una estructura.

iterindex Crea un par de elemento de iteración e indizador "con nombre Dentro de una clase o una estructura.
" mediante una clase anidada.

lock Crea un bloque lock. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

mbox Crea una llamada a System.Windows.Forms.MessageBox.Show Dentro de un método, un indizador, un descripto


. Puede que tenga que agregar una referencia a System.Windo r de acceso a propiedad o un descriptor de acces
ws.Forms.dll. o a evento.

namespace Crea una declaración namespace. Dentro de un espacio de nombres (incluido el es


pacio de nombres global).

prop Crea una declaración de propiedad y un campo de apoyo. Dentro de una clase o una estructura.

propg Crea una declaración de propiedad sólo con un descriptor de a Dentro de una clase o una estructura.
cceso "get" y un campo de apoyo.
sim Crea una declaración de método Main static int. Dentro de una clase o una estructura.

struct Crea una declaración struct. Dentro de un espacio de nombres (incluido el es


pacio de nombres global), una clase o una estruct
ura.

svm Crea una declaración de método Main static void. Dentro de una clase o una estructura.

switch Crea un bloque switch. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

try Crea un bloque try-catch. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

tryf Crea un bloque try-finally. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

unchecked Crea un bloque unchecked. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

unsafe Crea un bloque unsafe. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

using Crea una directiva using. Dentro de un espacio de nombres (incluido el es


pacio de nombres global).

while Crea un bucle while. Dentro de un método, un indizador, un descripto


r de acceso a propiedad o un descriptor de acces
o a evento.

Comentarios
Los accesos directos permiten que IntelliSense pueda rellenar automáticamente los fragmentos de código en el Editor de
código sin utilizar un menú. Para obtener más información, vea Cómo: Utilizar fragmentos de código (C#).
Vea también
Tareas
Cómo: Utilizar fragmentos de código envolventes
Referencia
Selector de fragmentos de código
Conceptos
Fragmentos de código (C#)
Desarrollo de aplicaciones con Visual C#

Cómo: Utilizar fragmentos de código (C#)


Los siguientes procedimientos describen cómo utilizar fragmentos de código. Los fragmentos de código se encuentran
disponibles de cinco maneras diferentes: a través de un método abreviado de teclado, de la función de finalización automática
de IntelliSense, de la lista Palabra completa de IntelliSense, del menú Edición y del menú contextual.
Para utilizar los fragmentos de código a través de un método abreviado de teclado
1. En el IDE de Visual Studio, abra el archivo que desee editar.
2. En el Editor de código, coloque el cursor donde desee insertar el fragmento de código.
3. Escriba CTRL+K, CTRL+X.
4. Seleccione el fragmento de código en la herramienta de inserción de fragmentos de código y presione la tecla
TABULADOR o ENTRAR.
De modo alternativo, puede escribir el nombre del fragmento de código y presionar la tecla TABULADOR o ENTRAR.
Para utilizar fragmentos de código a través de la función de finalización automática de IntelliSense
1. En el IDE de Visual Studio, abra el archivo que desee editar.
2. En el Editor de código, coloque el cursor donde desee insertar el fragmento de código.
3. Escriba el acceso directo del fragmento de código que desee agregar al código.
4. Escriba TABULADOR, TABULADOR para invocar al fragmento de código.
Para utilizar fragmentos de código a través de la lista Palabra completa de IntelliSense
1. En el IDE de Visual Studio, abra el archivo que desee editar.
2. En el Editor de código, coloque el cursor donde desee insertar el fragmento de código.
3. Empiece a escribir el acceso directo del fragmento de código que desee agregar al código. Si se activa la función de
finalización automática, se mostrará la lista Palabra completa de IntelliSense. Si no aparece, presione CTRL+BARRA
ESPACIADORA para activarla.
4. Seleccione el fragmento de código en la lista Palabra completa.
5. Escriba TABULADOR, TABULADOR para invocar al fragmento de código.
Para utilizar fragmentos de código a través del menú Edición
1. En el IDE de Visual Studio, abra el archivo que desee editar.
2. En el Editor de código, coloque el cursor donde desee insertar el fragmento de código.
3. En el menú Edición, seleccione IntelliSense y, a continuación, seleccione el comando Insertar fragmento de código.
4. Seleccione el fragmento de código en la herramienta de inserción de fragmentos de código y presione la tecla
TABULADOR o ENTRAR.
De modo alternativo, puede escribir el nombre del fragmento de código y presionar la tecla TABULADOR o ENTRAR.
Para utilizar fragmentos de código a través del menú contextual
1. En el IDE de Visual Studio, abra el archivo que desee editar.
2. En el Editor de código, coloque el cursor donde desee insertar el fragmento de código.
3. Haga clic con el botón secundario en el cursor y, a continuación, seleccione el comando Insertar fragmento de código
en el menú contextual.
4. Seleccione el fragmento de código en la herramienta de inserción de fragmentos de código y presione la tecla
TABULADOR o ENTRAR.
De modo alternativo, puede escribir el nombre del fragmento de código y presionar la tecla TABULADOR o ENTRAR.
Vea también
Tareas
Cómo: Utilizar fragmentos de código envolventes
Referencia
Fragmentos de código predeterminados
Selector de fragmentos de código
Conceptos
Fragmentos de código (C#)
Desarrollo de aplicaciones con Visual C#

Cómo: Utilizar fragmentos de código envolventes


Los procedimientos siguientes describen cómo utilizar los fragmentos de código con incorporación de entorno. Los
fragmentos de código con incorporación de entorno están disponibles de tres maneras: mediante un método abreviado de
teclado, en el menú Edición y en el menú contextual.
Para utilizar los fragmentos de código con incorporación de entorno mediante un método abreviado
de teclado
1. En el IDE de Visual Studio, abra el archivo que desea editar.
2. En el editor de código, seleccione el texto que desee incorporar.
3. Escriba CTRL+K, CTRL+S.
4. Seleccione el fragmento de código de la lista de fragmentos de código utilizando el mouse, o bien escriba su nombre y
presione TAB o ENTRAR.

Para utilizar fragmentos de código con incorporación de entorno en el menú Edición


1. En el IDE de Visual Studio, abra el archivo que desea editar.
2. En el editor de código, seleccione el texto que desee incorporar.
3. En el menú Edición, seleccione IntelliSense y, a continuación, seleccione el comando Envolver con.
4. Seleccione el fragmento de código de la herramienta de inserción de fragmentos de código y presione TAB o ENTRAR.
Si lo prefiere, puede escribir el nombre del fragmento de código y presionar la tecla TAB o ENTRAR.
Para utilizar fragmentos de código con incorporación de entorno en el menú contextual
1. En el IDE de Visual Studio, abra el archivo que desea editar.
2. En el editor de código, seleccione el texto que desee incorporar.
3. Haga clic con el botón secundario en el texto seleccionado y, a continuación, seleccione el comando Envolver con en el
menú contextual.
4. Seleccione el fragmento de código de la herramienta de inserción de fragmentos de código y presione TAB o ENTRAR.
Si lo prefiere, puede escribir el nombre del fragmento de código y presionar la tecla TAB o ENTRAR.
Vea también
Tareas
Cómo: Utilizar fragmentos de código (C#)
Referencia
Fragmentos de código predeterminados
Selector de fragmentos de código
Conceptos
Fragmentos de código (C#)
Conceptos del lenguaje Visual C#

Cómo: Restaurar miniprogramas de refactorización de C#


Las operaciones de refactorización de C# confían en fragmentos de código situados en el directorio siguiente:
Installation directory\Microsoft Visual Studio 8\VC#\Snippets\language ID\Refactoring
Si este directorio Refactoring o cualquiera de sus archivos se elimina o se daña, es posible que las operaciones de
refactorización de C# no funcionen en el IDE. Los procedimientos siguientes pueden ayudarle a restaurar los fragmentos de
código de refactorización de C#.
Para comprobar que los miniprogramas de refactorización de C# están disponibles a través del
Administrador de fragmentos de código
1. En el menú Herramientas, seleccione Administrador de fragmentos de código.
2. En el cuadro de diálogo Administrador de fragmentos de código, seleccione Visual C# en la lista desplegable
Lenguaje.
Una carpeta Refactorización debe aparecer en la lista de carpetas de la vista de árbol.
Para restaurar los fragmentos de refactorización en el Administrador de fragmentos de código
1. En el menú Herramientas, seleccione Administrador de fragmentos de código.
2. En el cuadro de diálogo Administrador de fragmentos de código, seleccione Visual C# en la lista desplegable
Lenguaje.
3. Haga clic en Agregar. Aparece el cuadro de diálogo Directorio de fragmentos de código, que permite buscar y
especificar el directorio para volver a agregar en el Administrador de fragmentos de código.
4. Busque la carpeta Refactoring cuya ruta de acceso del directorio es la siguiente:
Installation directory\Microsoft Visual Studio 8\VC#\Snippets\language ID\Refactoring
5. Haga clic en la opción Abrir del cuadro de diálogo Directorio de fragmentos de código y, a continuación, haga clic en
Aceptar en el Administrador de fragmentos de código.
Para reparar el directorio de fragmentos de código de refactorización
1. En el cuadro de diálogo Administrador de fragmentos de código, haga clic en Búsqueda en línea.
2. Entre en la refactorización y, a continuación, haga clic en Buscar.
Los resultados de búsqueda deberían incluir un sitio Web que le permite descargar el archivo .vsi, que puede utilizar para
reinstalar la carpeta de refactorización.
Vea también
Referencia
Administrador de fragmentos de código
Conceptos
Refactorización
Desarrollo de aplicaciones con Visual C#

Color del código


El editor de código analiza los símbolos (token) y las construcciones de código, para que resulten reconocibles y discernibles
con facilidad de los demás contenidos del código fuente de dicho editor. Después de analizar el código, el editor de código
colorea las construcciones de la forma apropiada.
Símbolos (token)
El editor de código colorea los tipos de símbolos (token) siguientes.
Comentario
Código excluido
Identificador
Palabra clave
Número
Operador
Palabra clave del preprocesador
Cadena
Cadena (especificador literal @ de C#)
Tipos de usuario
Tipos de usuario (tipos de valor)
Tipos de usuario (enumeraciones)
Tipos de usuario (delegados)
Sección CData XML
Atributo de documento XML
Comentario de documento XML
Etiqueta de documento XML
Puede modificar la configuración del colores predeterminada mediante el
Fuentes y colores, Entorno, Opciones (Cuadro de diálogo).
Palabras clave contextuales
El editor de código colorea de forma correcta las palabras clave contextuales. En el ejemplo siguiente, el tipo yield se colorea
en verde azulado, mientras que la palabra clave yield se colorea en azul.
Colores de coincidencia de llaves
El editor de código facilita color en negrita o de resaltado para la coincidencia de llaves.
Color en negrita
Al editar cualquiera de los pares de construcciones de código siguientes, los pares de construcciones de código o de cadenas
aparecen brevemente en negrita, para indicar que existe una asociación entre ellos:

"" Una cadena

@" " Una cadena textual

#if, #endif Directivas de preprocesador para secciones condicionales

#region, #endregion Directivas de preprocesador para secciones condicionales

case, break Palabras clave de instrucciones de control

default, break Palabras clave de instrucciones de control

for, break Palabras clave de expresiones de evaluación

for, continue Palabras clave de expresiones de evaluación

foreach, break Palabras clave de expresiones de evaluación

foreach, continue Palabras clave de expresiones de evaluación

while, break Palabras clave de expresiones de evaluación

while, continue Palabras clave de expresiones de evaluación

Puede deshabilitar esta característica; para ello, desactive la propiedad Resaltar con el delimitador automático en el
General, Editor de texto, Opciones (Cuadro de diálogo).
Color de resaltado
Cuando el cursor está situado inmediatamente antes de un delimitador inicial, o justo después del final, aparecen rectángulos
grises que resaltan los dos delimitadores e indicar que existe una asociación entre ellos. Esta característica está disponible para
los pares siguientes:

{} llaves

[] corchetes

() paréntesis
Ejemplo
Para ilustrar los colores de coincidencia de llaves, escriba (no copie y pegue) el código siguiente en el editor de código.

class A
{
public A()
{
if(true)
int x =0;
else
int x =1;
}
}

Configuración de color
La configuración de color se conserva en Valores de configuración de Visual Studio.
Vea también
Referencia
Coincidencia de llaves automática
Desarrollo de aplicaciones con Visual C#

Metadatos como origen


Metadatos como origen permite ver metadatos que aparecen como código fuente de C# en un búfer de sólo lectura. Esto
habilita una vista de declaraciones de tipos y miembros (sin implementaciones). Puede ver los metadatos como origen
ejecutando el comando Ir a definición para los tipos de miembro cuyo código fuente no esté disponible desde el proyecto o
solución.
Nota
Cuando intente ejecutar el comando Ir a definición para tipos o miembros marcados como internos, el entorno de desarroll
o integrado (IDE) no mostrará sus metadatos como origen, independientemente de que el ensamblado de referencia sea de c
onfianza o no.

Puede ver los metadatos como origen en el Editor de código o en la ventana Definición de código.
Ver metadatos como origen en el Editor de código
Cuando ejecute el comando Ir a definición para un elemento cuyo código fuente no esté disponible, en el Editor de código
aparecerá un documento con fichas que contiene una vista de los metadatos del elemento, mostrados en forma de origen. En
la ficha del documento aparece el nombre del tipo, seguido por [desde metadatos].
Por ejemplo, si ejecuta el comando Ir a definición para Console, en el Editor de código aparecerán metadatos para Console
en forma de código fuente C# de aspecto similar a su declaración, pero sin implementación.

Ver metadatos como origen en la ventana Definición de código


Cuando la ventana Definición de código está activa o visible, el IDE ejecuta automáticamente el comando Ir a definición
para los elementos que se encuentran bajo el cursor del Editor de código y para los elementos seleccionados en la Vista de
clases o en el Examinador de objetos. Si el código fuente no está disponible para ese elemento, el IDE muestra los
metadatos del elemento como origen en la ventana Definición de código.
Por ejemplo, si coloca el cursor dentro de la palabra Console en el Editor de código, en la ventana Definición de código
aparecerán metadatos para Console como origen. El origen se parece a la declaración Console, pero sin implementación.
Si desea ver la declaración de un elemento que aparece en la ventana Definición de código, debe utilizar explícitamente el
comando Ir a definición, porque la ventana Definición de código sólo tiene un nivel de profundidad.
Vea también
Referencia
Definición de código (Ventana)
Resultados de la búsqueda de símbolos (Ventana)
Desarrollo de aplicaciones con Visual C#

Métodos abreviados de teclado de Visual C#


Visual C# proporciona varios métodos abreviados de teclado que puede utilizar para realizar acciones sin utilizar el mouse
(ratón) ni los menús.
En esta sección
Teclas de método abreviado
Configuración general de desarrollo (Teclas de método abreviado predeterminadas)
Vea también
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Valores de configuración del IDE de Visual C#


La configuración de Visual C# es una configuración predefinida de ventanas de herramientas, menús y métodos abreviados de
teclado. Esta configuración forma parte de la característica Valores de configuración de Visual Studio, que puede personalizar
para adaptarla a sus hábitos de trabajo.
Ventanas y vistas
Característica ¿Se muestra de mane Notas
ra predeterminada?
Vista de clases No Vista de clases está disponible en el menú Ver.
Hay un filtro aplicado.

Ventana de comandos No

Ayuda dinámica (Ventana) No Al presionar la tecla F1, no se muestra la ventana de Ayuda dinámica.
Para obtener más información sobre la ventana Ayuda dinámica, vea
Cómo: Personalizar la Ayuda dinámica o
Cómo: Controlar la Ventana de ayuda dinámica.

Examinador de objetos No No aparecen de manera predeterminada los miembros heredados


.

Resultados (Ventana) No

Explorador de soluciones Sí El Explorador de soluciones aparece acoplado en el lado derecho del IDE
.

Página de inicio Sí, al iniciar el IDE La Página de inicio muestra artículos de información sobre MSDN RS p
ara Visual C#.

Lista de tareas (Visual Studio) No

Cuadro de herramientas Sí, cuando se crea una a El Cuadro de herramientas aparece como una ventana contraída que se
plicación de Windows F acopla en el lado izquierdo del IDE.
orms

Teclado
Característica Comportamiento
Teclas de método abreviado Visual C# admite la siguiente configuración de métodos abreviados de teclado:
Teclas de método abreviado predeterminadas de Visual C# 2005
Teclas de método abreviado predeterminadas breves
Teclas de método abreviado predeterminadas Emacs
Teclas de método abreviado predeterminadas de Visual C++ 2.0
Teclas de método abreviado predeterminadas de Visual Studio 6.0

Vea también
Otros recursos
Visual C#
Utilizar el entorno IDE de Visual C#
Entorno de desarrollo de Visual C#

Teclas de método abreviado predeterminadas de Visual C#


2005
El entorno de desarrollo integrado (IDE) proporciona varias combinaciones de asignación de teclado predefinidas. Para
cambiar la combinación de asignación del teclado de Visual C# 2005, en el menú Herramientas, haga clic en Opciones,
expanda Entorno y, a continuación, haga clic en Teclado.
La combinación de asignación de teclado de Visual C# 2005 es la predeterminada cuando se selecciona Configuración de
desarrollo de Visual C# en el Asistente para importar y exportar configuraciones. Para obtener más información, vea
Cómo: Cambiar configuraciones seleccionadas.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

La información siguiente explica las combinaciones de teclas predeterminadas disponibles para la combinación de asignación
de teclado de Visual C# 2005.
Teclas de método abreviado globales, esquema de Visual C# 2005
Teclas de método abreviado para el Diseñador HTML, esquema de Visual C# 2005
Teclas de método abreviado para el Diseñador XML, esquema de Visual C# 2005
Teclas de método abreviado para la manipulación de controles, esquema de Visual C# 2005
Teclas de método abreviado para la depuración, esquema de Visual C# 2005
Teclas de método abreviado para buscar y reemplazar, esquema de Visual C# 2005
Teclas de método abreviado para datos, esquema de Visual C# 2005
Teclas de método abreviado para desplazarse por el texto, esquema de Visual C# 2005
Teclas de método abreviado para la selección de texto, esquema de Visual C# 2005
Teclas de método abreviado para la manipulación de texto, esquema de Visual C# 2005
Teclas de método abreviado para la administración de ventanas, esquema de Visual C# 2005
Teclas de método abreviado de la Ayuda integrada, esquema de Visual C# 2005
Teclas de método abreviado del Examinador de objetos, esquema de Visual C# 2005
Teclas de método abreviado para macros, esquema de Visual C# 2005
Teclas de método abreviado para ventanas de herramientas, esquema de Visual C# 2005
Teclas de método abreviado para proyectos, esquema de Visual C# 2005
Teclas de método abreviado del Editor de imágenes, esquema de Visual C# 2005
Teclas de método abreviado del Editor de cuadros de diálogo, esquema de Visual C# 2005
Teclas de método abreviado para la refactorización, esquema de Visual C# 2005
Teclas de método abreviado del Editor de recursos administrados, esquema de Visual C# 2005
Teclas de método abreviado para fragmentos de código, esquema de Visual C# 2005
Teclas de método abreviado del Diagrama de clase, esquema de Visual C# 2005
Teclas de método abreviado para la ventana Marcadores, esquema de Visual C# 2005
Teclas de método abreviado del Editor de aceleradores y del Editor de cadenas, esquema de Visual C# 2005
Vea también
Tareas
Cómo: Trabajar con combinaciones de teclas de método abreviado
Otros recursos
Teclas de método abreviado
Entorno de desarrollo de Visual C#

Teclas de método abreviado globales, esquema de Visual C#


2005
Las siguientes teclas de método abreviado pueden utilizarse en varios lugares del entorno de desarrollo integrado (IDE).
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre Teclas de Descripción


de coma método ab
ndo reviado
Diagram. ALT + ENTR Cambia el foco del diagrama a la ventana Propiedades.
Properties AR

Edit.Copy CTRL + C Copia el texto seleccionado en el Portapapeles.

Edit.Cut CTRL + X Elimina el elemento seleccionado del archivo y lo copia en el Portapapeles.

Edit.Cycle CTRL + MA Pega un elemento del anillo del Portapapeles en el punto de inserción del archivo y selecciona automát
Clipboard YÚS + V icamente el elemento pegado. Se puede revisar cada elemento del anillo del Portapapeles presionando
Ring repetidamente las teclas de método abreviado.

Edit.Delet SUPRIMIR Elimina un carácter a la derecha del punto de inserción.


e

Edit.Open CTRL + MA Muestra el cuadro de diálogo Abrir archivo, donde se puede seleccionar un archivo para abrirlo.
File YÚS + G

Edit.Paste CTRL + V Inserta el contenido del Portapapeles en el punto de inserción.

Edit.Redo CTRL + Y Restaura la acción deshecha anteriormente.

Edit.Undo CTRL + Z Deshace la última acción de edición.

File.Print CTRL + P Muestra el cuadro de diálogo Imprimir, donde se puede seleccionar la configuración de impresora.

File.SaveA CTRL + MA Guarda todos los documentos de la solución actual y todos los archivos del proyecto de archivos exter
ll YÚS + S nos.

File.SaveS CTRL + S Guarda los elementos seleccionados en el proyecto actual.


electedIte
ms

Tools.GoT CTRL + / Coloca el puntero en el cuadro Buscar/Comando de la barra de herramientas Estándar.


oComma
ndLine

View.Back ALT + FLEC Muestra la página anterior en el historial de exploración. Sólo disponible en la ventana Explorador W
ward HA IZQUIER eb.
DA
View.EditL F2 Permite cambiar el nombre del elemento seleccionado en el Explorador de soluciones.
abel

View.For ALT + FLEC Muestra la siguiente página en el historial de exploración. Sólo disponible en la ventana Explorador
ward HA DERECH Web.
A

View.View F7 Muestra el elemento seleccionado en la vista Código del editor.


Code

View.View MAYÚS + F Muestra el elemento seleccionado en la vista Diseñador.


Designer 7

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Otros recursos
Teclas de método abreviado
Entorno de desarrollo de Visual C#

Teclas de método abreviado para el Diseñador HTML, esquema


de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes sólo se pueden utilizar al modificar archivos en el Diseñador
HTML. Algunas combinaciones de teclas sólo están disponibles en una vista específica del diseñador. Entre las combinaciones
de teclas que se pueden utilizar en el Diseñador HTML, se incluyen
Teclas de método abreviado para desplazarse por el texto, Configuración general de desarrollo,
Teclas de método abreviado para la selección de texto, Configuración general de desarrollo y
Teclas de método abreviado para la manipulación de texto, Configuración general de desarrollo.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre d Teclas de m Descripción


e comando étodo abrev
iado
Format.Bold CTRL + B Alterna el texto seleccionado entre negrita y normal. Sólo disponible en la vista Diseño.

Format.Con CTRL + L Cuando hay texto seleccionado, muestra el cuadro de diálogo Hipervínculo. Sólo disponible en la
vertToHype vista Diseño.
rlink

Format.Inse CTRL + MAY Muestra el cuadro de diálogo Marcador. Sólo disponible en la vista Diseño.
rtBookmark ÚS + L

Format.Italic CTRL + I Alterna el texto seleccionado entre cursiva y normal. Sólo disponible en la vista Diseño.

Format.Und CTRL + U Alterna el texto seleccionado entre subrayado y normal. Sólo disponible en la vista Diseño.
erline

Layout.Inser CTRL + ALT Agrega una columna a la izquierda de la columna actual en la tabla. Sólo disponible en la vista Dise
tColumntot + FLECHA IZ ño.
heLeft QUIERDA

Layout.Inser CTRL + ALT Agrega una columna a la derecha de la columna actual en la tabla. Sólo disponible en la vista Diseñ
tColumntot + FLECHA DE o.
heRight RECHA

Layout.Inser CTRL + ALT Agrega una fila encima de la fila actual en la tabla. Sólo disponible en la vista Diseño.
tRowAbove + FLECHA AR
RIBA

Layout.Inser CTRL + ALT Agrega una fila debajo de la fila actual en la tabla. Sólo disponible en la vista Diseño.
tRowBelow + FLECHA AB
AJO

Project.Add CTRL + M, CT Agrega un nuevo archivo *.aspx al sitio Web y abre el archivo en el Diseñador HTML. Sólo disponibl
ContentPag RL + C e en la vista Diseño.
e
View.AutoCl CTRL + MAY Reemplaza de forma temporal el comportamiento predeterminado de la etiqueta de cierre por la et
oseTagOver ÚS + PUNTO iqueta actual. Para obtener más información, vea Opciones específicas de etiqueta. Sólo disponible
ride en la vista Código fuente.

View.Details CTRL + MAY Muestra iconos para los elementos HTML que no tienen representación visual, como comentarios, s
ÚS + Q ecuencias de comandos y delimitadores de elementos en posición absoluta. Sólo disponible en la vi
sta Diseño.

View.EditMa CTRL + M, CT Abre el archivo *.master en la vista Código fuente. Sólo disponible en la vista Diseño.
ster RL + M

View.NextVi CTRL + AV P Cambia entre la vista Diseño, la vista Código fuente y la vista Código de servidor en el docume
ew ÁG nto actual. Disponible en todas las vistas.

View.NonVi CTRL + ALT Muestra los símbolos para elementos no gráficos, como elementos div, span, form y script. Sólo dis
sualControl + Q ponible en la vista Diseño.
s

View.ShowS MAYÚS + AL Muestra un menú de etiquetas inteligentes de comandos comunes para los controles de servidor W
martTag T + F10 eb. Sólo disponible en la vista Diseño.

View.ViewD MAYÚS + F7 Cambia a la vista Diseño en el documento actual. Sólo disponible en la vista Código fuente.
esigner

View.ViewM MAYÚS + F7 Cambia a la vista Código fuente en el documento actual. Sólo disponible en la vista Diseño.
arkup

View.Visible CTRL + Q Muestra un borde de 1 píxel alrededor de los elementos HTML que admiten un atributo BORDER es
Borders tablecido en cero. Algunos ejemplos de estos elementos HTML son las tablas, las celdas de tabla y l
as divisiones. Sólo disponible en la vista Diseño.

Window.Pre CTRL + RE P Cambia entre la vista Diseño, la vista Código fuente y la vista Código de servidor en el docume
viousTab ÁG nto actual. Disponible en todas las vistas.

Vea también
Referencia
Diseñador HTML
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para el Diseñador XML, esquema


de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes sólo se pueden utilizar cuando se trabaja en el Diseñador XML.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de coma Teclas de método abrevi Descripción


ndo ado
Schema.Collapse CTRL + SIGNO MENOS (-) Contrae elementos anidados. Sólo disponible en la vista de esquema del Dise
ñador XML.

Schema.Expand CTRL + SIGNO IGUAL (=) Contrae elementos anidados. Sólo disponible en la vista de esquema del Dise
ñador XML.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la manipulación de controles,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar para desplazar, seleccionar y cambiar el
tamaño de los controles en las superficies de diseño.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de coman Teclas de método abrevia Descripción


do do
Edit.MoveControlDo FLECHA ABAJO Desplaza el control seleccionado hacia abajo en incrementos de 1 píxel en l
wn a superficie de diseño.

Edit.MoveControlDo CTRL + FLECHA ABAJO Desplaza el control seleccionado hacia abajo en incrementos de 8 píxeles e
wnGrid n la superficie de diseño.

Edit.MoveControlLef FLECHA IZQUIERDA Desplaza el control a la izquierda en incrementos de 1 píxel en la superficie


t de diseño.

Edit.MoveControlLef CTRL + FLECHA IZQUIERDA Desplaza el control a la izquierda en incrementos de 8 píxeles en la superfic
tGrid ie de diseño.

Edit.MoveControlRig FLECHA DERECHA Desplaza el control a la derecha en incrementos de 1 píxel en la superficie d


ht e diseño.

Edit.MoveControlRig CTRL + FLECHA DERECHA Desplaza el control a la derecha en incrementos de 8 píxeles en la superfici
htGrid e de diseño.

Edit.MoveControlUp FLECHA ARRIBA Desplaza el control hacia arriba en incrementos de 1 píxel en la superficie d
e diseño.

Edit.MoveControlUp CTRL + FLECHA ARRIBA Desplaza el control hacia arriba en incrementos de 8 píxeles en la superficie
Grid de diseño.

Edit.SelectNextContr TAB Se desplaza al siguiente control de la página en función de la propiedad


ol Tabindex del control.

Edit.SelectPreviousC MAYÚS + TAB Se desplaza al control seleccionado anteriormente en la página.


ontrol

Edit.ShowTileGrid ENTRAR Muestra la cuadrícula en la superficie de diseño.

Edit.SizeControlDow MAYÚS + FLECHA ABAJO Aumenta el alto del control en incrementos de 1 píxel en la superficie de dis
n eño.

Edit.SizeControlDow CTRL + MAYÚS + FLECHA A Aumenta el alto del control en incrementos de 8 píxeles en la superficie de
nGrid BAJO diseño.
Edit.SizeControlLeft MAYÚS + FLECHA IZQUIERD Reduce el ancho del control en incrementos de 1 píxel en la superficie de di
A seño.

Edit.SizeControlLeft CTRL + MAYÚS + FLECHA IZ Reduce el ancho del control en incrementos de 8 píxeles en la superficie de
Grid QUIERDA diseño.

Edit.SizeControlRigh MAYÚS + FLECHA DERECHA Aumenta el ancho del control en incrementos de 1 píxel en la superficie de
t diseño.

Edit.SizeControlRigh CTRL + MAYÚS + FLECHA D Aumenta el ancho del control en incrementos de 8 píxeles en la superficie d
tGrid ERECHA e diseño.

Edit.SizeControlUp MAYÚS + FLECHA ARRIBA Reduce el alto del control en incrementos de 1 píxel en la superficie de dise
ño.

Edit.SizeControlUpG CTRL + MAYÚS + FLECHA A Reduce el alto del control en incrementos de 8 píxeles en la superficie de di
rid RRIBA seño.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la depuración, esquema de


Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar al depurar código.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de coma Teclas d Descripción


ndo e métod
o abrevi
ado
Debug.ApplyCodeC ALT + F1 Inicia una generación que permite utilizar la característica Editar y continuar para aplicar los ca
hanges 0 mbios al código que se va a depurar.

Debug.Autos CTRL + D Muestra la ventana Automático para ver los valores de las variables que se hallan en ese mom
, CTRL + ento dentro del ámbito de la línea de ejecución actual, en el procedimiento actual.
A

Debug.BreakAll CTRL + A Detiene temporalmente la ejecución de todos los procesos en una sesión de depuración. Dispon
LT + Inte ible sólo en modo de ejecución.
r

Debug.BreakAtFunc CTRL + D Muestra el cuadro de diálogo Nuevo punto de interrupción.


tion , CTRL +
N

Debug.Breakpoints CTRL + D Muestra el cuadro de diálogo Puntos de interrupción, donde puede agregar y modificar punt
, CTRL + os de interrupción.
B

Debug.CallStack CTRL + D Muestra la ventana Pila de llamadas para mostrar una lista de todos los procedimientos o mar
, CTRL + cos de pila activos correspondientes al subproceso de ejecución actual. Disponible sólo en mod
C o de ejecución.

Debug.DeleteAllBre CTRL + Borra todos los puntos de interrupción del proyecto.


akpoints MAYÚS
+ F9

Debug.Disassembly CTRL + A Muestra la ventana Desensamblador.


LT + D

Debug.EnableBreak CTRL + F Cambia el punto de interrupción de deshabilitado a habilitado.


points 9

Debug.Exceptions CTRL + D Muestra el cuadro de diálogo Excepciones.


, CTRL +
E

Debug.Immediate CTRL + D Muestra la ventana Inmediato, donde es posible evaluar expresiones y ejecutar comandos indi
, CTRL + I viduales.
Debug.Locals CTRL + D Muestra la ventana Variables locales para ver las variables y los valores que contienen para ca
, CTRL + da uno de los procedimientos del marco de pila actual.
L

Debug.Memory1 CTRL + A Muestra la ventana Memoria 1 para ver búferes, cadenas y otros datos de gran tamaño que no
LT + M, 1 se ven bien en las ventanas Inspección o Variables.

Debug.Memory2 CTRL + A Muestra la ventana Memoria 2 para ver búferes, cadenas y otros datos de gran tamaño que no
LT + M, 2 se ven bien en las ventanas Inspección o Variables.

Debug.Memory3 CTRL + A Muestra la ventana Memoria 3 para ver búferes, cadenas y otros datos de gran tamaño que no
LT + M, 3 se ven bien en las ventanas Inspección o Variables.

Debug.Memory4 CTRL + A Muestra la ventana Memoria 4 para ver búferes, cadenas y otros datos de gran tamaño que no
LT + M, 4 se ven bien en las ventanas Inspección o Variables.

Debug.Modules CTRL + D Muestra la ventana Módulos, que permite ver los archivos .dll o .exe utilizados por el programa
, CTRL + . En la depuración de varios procesos, puede hacer clic con el botón secundario del mouse y des
M pués hacer clic en Mostrar módulos para todos los programas.

Debug.Processes CTRL + D Muestra la ventana Procesos. Disponible en modo de ejecución.


, CTRL +
P

Debug.QuickWatch CTRL + D Muestra el cuadro de diálogo Inspección rápida que contiene el valor actual de la expresión se
, CTRL + leccionada. Disponible sólo en modo de interrupción. Utilice este comando para examinar el val
Q or actual de una variable, propiedad u otra expresión para la que no haya definido una expresió
n de inspección.

Debug.Registers CTRL +D, Muestra la ventana Registros, que presenta el contenido de los registros para depurar aplicacio
CTRL + R nes de código nativo.

Debug.Restart CTRL + Termina una sesión de depuración, vuelve a generar y, a continuación, comienza a ejecutar la ap
MAYÚS licación desde el principio. Disponible en modos de interrupción y ejecución.
+ F5

Debug.RunToCurso CTRL + F En modo de interrupción, reanuda la ejecución del código desde la instrucción actual hasta la in
r 10 strucción seleccionada. El indicador de margen de la línea de ejecución actual aparece en la barr
a indicadora de margen. En modo de diseño, inicia el depurador y ejecuta el código hasta la ubic
ación del cursor.

Debug.ScriptExplor CTRL + A Muestra la ventana Explorador de secuencias de comandos que muestra el conjunto de doc
er LT + N umentos que está depurando. Disponible en modo de ejecución.

Debug.SetNextState CTRL + Establece el punto de ejecución en la línea de código que se elija.


ment MAYÚS
+ F10

Debug.ShowNextSt ALT + N Resalta la siguiente instrucción que se va a ejecutar.


atement ÚM *

Debug.Start F5 Asocia automáticamente el depurador y ejecuta la aplicación desde el proyecto de inicio especifi
cado en el cuadro de diálogo Propiedades de <Proyecto>. Cambia a Continuar si se encuentr
a en modo de interrupción.
Debug.StartWithout CTRL + F Ejecuta el código sin llamar al depurador.
Debugging 5

Debug.StepInto F11 Ejecuta el código una instrucción cada vez, siguiendo la ejecución hasta las llamadas a funciones
.

Debug.StepIntoCurr CTRL + A Disponible en la ventana Procesos.


entProcess LT + F11

Debug.StepOut MAYÚS Ejecuta las líneas restantes de una función en la cual se encuentra el punto de ejecución actual.
+ F11

Debug.StepOutCurr CTRL + Disponible en la ventana Procesos.


entProcess MAYÚS
+ ALT +
F11

Debug.StepOver F10 Ejecuta la línea siguiente de código, pero no sigue la ejecución a través de ninguna llamada a un
a función.

Debug.SetpOverCu CTRL + A Disponible en la ventana Procesos.


rrentProcess LT + F10

Debug.StopDebugg MAYÚS Detiene la ejecución de la aplicación actual en el programa. Disponible en modos de interrupció
ing + F5 n y ejecución.

Debug.Threads CTRL + D Muestra la ventana Subprocesos para ver todos los subprocesos del proceso actual e informaci
, CTRL + ón sobre ellos.
T

Debug.ToggleBreak F9 Establece o quita un punto de interrupción en la línea actual.


point

Debug.ToggleDisas CTRL + D Muestra la información de desensamblaje del archivo de código fuente actual. Disponible sólo e
sembly , CTRL + n modo de interrupción.
D

Debug.Watch CTRL + A Muestra la ventana Inspección1 para ver los valores de expresiones de inspección o variables s
LT + W, 1 eleccionadas.

Debug.Watch2 CTRL + A Muestra la ventana Inspección2 para ver los valores de expresiones de inspección o variables s
LT + W, 2 eleccionadas.

Debug.Watch3 CTRL + A Muestra la ventana Inspección3 para ver los valores de expresiones de inspección o variables s
LT + W, 3 eleccionadas.

Debug.Watch4 CTRL + A Muestra la ventana Inspección4 para ver los valores de expresiones de inspección o variables s
LT + W, 4 eleccionadas.

DebuggerContextM ALT + F9, Quita el punto de interrupción seleccionado. Disponible sólo en la ventana Puntos de interrupci
enus.BreakpointsWi D ón.
ndow.Delete
DebuggerContextM ALT +F9, Muestra la ventana Desensamblador. Disponible sólo en la ventana Puntos de interrupción.
enus. BreakpointsW A
indow.GoToDisasse
mbly

DebuggerContextM ALT + F9, Se desplaza a la ubicación del punto de interrupción seleccionado en el archivo de código. Disp
enus. BreakpointsW S onible sólo en la ventana Puntos de interrupción.
indow.GoToSource
Code

Tools.AttachToProc CTRL + A Muestra el cuadro de diálogo Asociar al proceso, que permite depurar varios programas a la v
ess LT + P ez en una única solución.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para datos, esquema de Visual C#


2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar con datos en el entorno de desarrollo
integrado (IDE).
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de co Teclas de mé Descripción


mando todo abrevia
do
Data.Column CTRL + L Agrega una nueva columna a la parte inferior del conjunto de datos. Sólo disponible en el Edi
tor de DataSet.

Data.Execute CTRL + ALT + Ejecuta el objeto de base de datos activo.


F5

Data.InsertColu INSERT Inserta una nueva columna por encima de la columna seleccionada en el conjunto de datos. S
mn ólo disponible en el Editor de DataSet.

Data.RunSelectio CTRL + Q Ejecuta la selección actual en el editor SQL.


n

Data.ShowDataS MAYÚS + ALT Muestra la ventana Orígenes de datos.


ources +D

Data.StepInto ALT + F5 Modo de depuración de Ir a instrucciones en el objeto de base de datos activo actualmente.

QueryDesigner.C CTRL + T Cancela o detiene la consulta actualmente en ejecución. Sólo disponible en el Diseñador de c
ancelRetrievingD onsultas y vistas.
ata

QueryDesigner.C CTRL +2 Muestra el panel Criterios del Diseñador de consultas y vistas. Sólo disponible en el Diseñ
riteria ador de consultas y vistas.

QueryDesigner. CTRL +1 Muestra el panel Diagrama del Diseñador de consultas y vistas. Sólo disponible en el Dise
Diagram ñador de consultas y vistas.

QueryDesigner.E CTRL + R Ejecuta la consulta. Sólo disponible en el Diseñador de consultas y vistas.


xecuteSQL

QueryDesigner. CTRL + G Cuando se ejecuta en el panel Resultados, este comando desplaza el foco a la tira de la herra
GoToRow mientas acoplada en la parte inferior del diseñador. Sólo disponible en el Diseñador de cons
ultas y vistas.

QueryDesigner.J CTRL + MAYÚ Habilita el modo JOIN. Sólo disponible en el Diseñador de consultas y vistas.
oinMode S+J
QueryDesigner.R CTRL +4 Muestra el panel Resultados del Diseñador de consultas y vistas. Sólo disponible en el Dis
esults eñador de consultas y vistas.

QueryDesigner.S CTRL + 3 Muestra el panel SQL del Diseñador de consultas y vistas. Sólo disponible en el Diseñador
QL de consultas y vistas.
View.Datasets CTRL + ALT + Muestra la ventana Conjuntos de datos de informe del Diseñador de informes.
D

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para desplazarse por el texto,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse en los editores de texto para desplazarse por
un documento abierto.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de co Teclas de método a Descripción


mando breviado
Edit.CharLeft FLECHA IZQUIERDA Desplaza el punto de inserción un carácter a la izquierda.

Edit.CharRight FLECHA DERECHA Desplaza el punto de inserción un carácter a la derecha.

Edit.ClearBookm CTRL + B, CTRL + C Quita todos los marcadores sin nombre del documento actual.
arks

Edit.DocumentE CTRL + FIN Desplaza el punto de inserción a la última línea del documento.
nd

Edit.DocumentSt CTRL + INICIO Desplaza el punto de inserción a la primera línea del documento.
art

Edit.GoTo CTRL + G Muestra el cuadro de diálogo Ir a la línea.

Edit.GoToBrace CTRL + ] Desplaza el punto de inserción a la siguiente llave del documento.

Edit.LineDown FLECHA ABAJO Desplaza el punto de inserción una línea hacia abajo.

Edit.LineEnd FIN Desplaza el punto de inserción al final de la línea actual.

Edit.LineStart INICIO Desplaza el punto de inserción al principio de la línea.

Edit.LineUp FLECHA ARRIBA Desplaza el punto de inserción una línea hacia arriba.

Edit.NextBookm CTRL + B, CTRL + N Desplaza el punto de inserción a la ubicación del siguiente marcador.
ark

Edit.NextError CTRL + MAYÚS + F1 Se desplaza a la siguiente entrada de error en la ventana Lista de errores, que automát
2 icamente se desplaza a la sección afectada de texto del editor.

Edit.PageDown AV PÁG Se desplaza hacia abajo una pantalla en la ventana del editor.

Edit.PageUp RE PÁG Se desplaza hacia arriba una pantalla en la ventana del editor.

Edit.PreviousBo CTRL + B, CTRL + P Desplaza el punto de inserción a la ubicación del marcador anterior.
okmark
Edit.QuickInfo CTRL + K, CTRL + I Muestra la Información rápida, en función del lenguaje actual.

Edit.ScrollLineD CTRL + FLECHA ABA Desplaza el texto una línea hacia abajo. Disponible sólo al trabajar en los editores de tex
own JO to.
Edit.ScrollLineU CTRL + FLECHA ARRI Desplaza el texto una línea hacia arriba. Disponible sólo al trabajar en los editores de te
p BA xto.

Edit.ToggleBook CTRL + K, CTRL + K Establece o quita un marcador en la línea actual.


mark
O bien,
CTRL + B, CTRL + T

Edit.ViewBottom CTRL + AV PÁG Se desplaza a la última línea visible de la ventana activa.

Edit.ViewTop CTRL + RE PÁG Se desplaza a la primera línea visible de la ventana activa.

Edit.WordNext CTRL + FLECHA DER Desplaza el punto de inserción una palabra a la derecha.
ECHA

Edit.WordPrevio CTRL + FLECHA IZQ Desplaza el punto de inserción una palabra a la izquierda.
us UIERDA

View.BrowseNex CTRL + MAYÚS + 1 Se desplaza a la definición, declaración o referencia siguiente de un elemento. Disponib
t le en la ventana Examinador de objetos y Vista de clases.

View.BrowsePre CTRL + MAYÚS +2 Se desplaza a la definición, declaración o referencia anterior de un elemento. Disponibl
vious e en la ventana Examinador de objetos y Vista de clases.

View.NavigateB CTRL + SIGNO MEN Se desplaza a la línea de código anteriormente examinada.


ackward OS (-)

View.NavigateF CTRL + MAYÚS + SI Se desplaza a la siguiente línea de código examinada.


orward GNO MENOS (-)

View.PopBrowse CTRL + MAYÚS +8 Se desplaza al elemento anterior invocado en el código del archivo actual.
Context

View.ForwardBr CTRL + MAYÚS +7 Se desplaza al elemento siguiente invocado en el código del archivo actual.
owseContext

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la selección de texto,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse en los editores de texto para seleccionar texto
en un documento abierto.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de comand Teclas de método abreviad Descripción


o o
Edit.CharLeftExtend MAYÚS + FLECHA IZQUIERDA Mueve el cursor un carácter a la izquierda y extiende la selección.

Edit.CharLeftExtendCol MAYÚS + ALT + FLECHA IZQU Mueve el cursor un carácter a la izquierda y extiende la selección de col
umn IERDA umna.

Edit.CharRightExtend MAYÚS + FLECHA DERECHA Mueve el cursor un carácter a la derecha y extiende la selección.

Edit.CharRightExtendC MAYÚS + ALT + FLECHA DERE Mueve el cursor un carácter a la derecha y extiende la selección de colu
olumn CHA mna.

Edit.DocumentEndExte CTRL + MAYÚS + FIN Selecciona el texto que hay desde el cursor hasta la última línea del doc
nd umento.

Edit.DocumentStartExt CTRL + MAYÚS + INICIO Selecciona el texto que hay desde el cursor hasta la primera línea del d
end ocumento.

Edit.GoToBraceExtend CTRL + MAYÚS + ] Desplaza el cursor a la siguiente llave y extiende la selección.

Edit.LineDownExtend MAYÚS + FLECHA ABAJO Extiende la selección del texto una línea hacia abajo, a partir de la ubica
ción del cursor.

Edit.LineDownExtendC MAYÚS + ALT + FLECHA ABAJ Mueve el puntero una línea hacia abajo y extiende la selección de colu
olumn O mna.

Edit.LineEndExtend MAYÚS + FIN Selecciona el texto desde el cursor al final de la línea actual.

Edit.LineEndExtendCol MAYÚS + ALT + FIN Desplaza el cursor al final de la línea y extiende la selección de columna
umn .

Edit.LineStartExtend MAYÚS + INICIO Selecciona texto desde el cursor hasta el inicio de la línea.

Edit.LineStartExtendCo MAYÚS + ALT + INICIO Desplaza el cursor al principio de la línea y extiende la selección de colu
lumn mna.

Edit.LineUpExtend MAYÚS + FLECHA ARRIBA Selecciona texto hacia arriba línea a línea, a partir de la ubicación del cu
rsor.

Edit.LineUpExtendColu MAYÚS + ALT + FLECHA ARRI Mueve el cursor hacia arriba una línea y extiende la selección de colum
mn BA na.
Edit.PageDownExtend MAYÚS + AV PÁG Extiende la selección una página hacia abajo.

Edit.PageUpExtend MAYÚS + RE PÁG Extiende la selección una página hacia arriba.

Edit.SelectAll CTRL + A Selecciona todo el contenido del documento actual.

Edit.SelectCurrentWor CTRL + MAYÚS + W Selecciona la palabra que contiene el cursor o la palabra a la derecha d
d el cursor.

Edit.SelectToLastGoBa CTRL + SIGNO IGUAL (=) Selecciona el contenido existente entre la ubicación actual del Editor ha
ck sta la ubicación anterior en éste.

Edit.ViewBottomExten CTRL + MAYÚS + AV PÁG Desplaza el cursor a la última línea del documento y extiende la selecci
d ón.

Edit.ViewTopExtend CTRL + MAYÚS + RE PÁG Extiende la selección al comienzo de la ventana activa.

Edit.WordNextExtend CTRL + MAYÚS + FLECHA DE Extiende la selección una palabra hacia la derecha.
RECHA

Edit.WordNextExtendC CTRL + MAYÚS + ALT + FLEC Desplaza el cursor una palabra a la derecha y extiende la selección de c
olumn HA DERECHA olumna.

Edit.WordPreviousExte CTRL + MAYÚS + FLECHA IZQ Extiende la selección una palabra hacia la izquierda.
nd UIERDA

Edit.WordPreviousExte CTRL + MAYÚS + ALT + FLEC Desplaza el cursor una palabra a la izquierda y extiende la selección de
ndColumn HA IZQUIERDA columna.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la manipulación de texto,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse en los editores de texto para eliminar, desplazar
o dar formato a texto en un documento abierto.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de Teclas de Descripción


comando método ab
reviado
Edit.BreakLin ENTRAR Inserta una nueva línea.
e
Nota
En algunos editores, como la vista Diseño del Diseñador HTML, la tecla ENTRAR se comporta de
forma diferente en función del contexto. Para obtener más información, consulte la documentació
n existente sobre el editor que está utilizando.

Edit.CharTra CTRL + T Intercambia los caracteres de ambos lados del cursor. Por ejemplo, AC|BD se vuelve AB|CD. Disponi
nspose ble sólo en editores de texto.

Edit.Collapse CTRL + M, C Oculta la etiqueta HTML seleccionada y muestra puntos suspensivos (. .) en su lugar. Puede ver la et
Tag TRL + T iqueta completa como información sobre herramientas colocando el puntero del mouse sobre los .
. ..

Edit.Collapse CTRL + M, C Determina automáticamente los límites lógicos para crear regiones en el código, como procedimien
ToDefinition TRL + O tos y, a continuación, los oculta.
s

Edit.Comme CTRL + E, C Marca la línea de código actual como comentario, utilizando la sintaxis de comentario correcta para
ntSelection TRL + C el lenguaje de programación.

Edit.Complet CTRL + K, C Muestra la finalización de palabras basada en el lenguaje actual.


eWord TRL + W

Edit.CopyPar CTRL + MA Copia la información de parámetros mostrada por IntelliSense en el Portapapeles.


ameterTip YÚS + ALT
+C

Edit.DeleteBa RETROCESO Elimina un carácter a la izquierda del cursor.


ckwards

Edit.DeleteH CTRL + E, C Contrae el espacio en blanco de la selección o elimina el espacio en blanco adyacente hasta el curso
orizontalWhi TRL + \ r si no hay una selección.
tespace

Edit.FormatD CTRL +E, CT Aplica el formato de sangría y espaciado del lenguaje como se ha especificado en el panel Formato
ocument RL + D de dicho lenguaje en la sección Editor de texto del cuadro de diálogo Opciones.
Edit.FormatS CTRL + E, C Aplica sangría correctamente a las líneas seleccionadas de código basándose en las líneas circunda
election TRL + F ntes de código.

Edit.Generat CTRL + K, C Crea una nueva declaración de método para la llamada al método en la que se encuentra el cursor.
eMethodSub TRL + M
Para obtener más información, vea Generar código auxiliar del método.

Edit.HideSele CTRL + M, C Oculta el texto seleccionado. Un icono de señal marca la ubicación del texto oculto en el archivo.
ction TRL + H

Edit.InsertTa TAB Aplica una sangría de un número especificado de espacios a la línea de texto.
b

Edit.InsertSni CTRL + K, C Fragmento de código Insert.


ppet TRL + X
Para obtener más información, vea Fragmentos de código (C#).

Edit.LineCut CTRL + L Corta al Portapapeles todas las líneas seleccionadas, o la línea actual si no se ha seleccionado nada.

Edit.LineDele CTRL + MA Elimina todas las líneas seleccionadas o, si no hay nada seleccionado, la línea actual.
te YÚS + L

Edit.LineOpe CTRL + ENT Inserta una nueva línea en blanco encima del cursor.
nAbove RAR

Edit.LineOpe CTRL + MA Inserta una nueva línea en blanco debajo del cursor.
nBelow YÚS + ENTR
AR

Edit.LineTran MAYÚS + A Desplaza la línea que contiene el punto de inserción debajo de la línea siguiente.
spose LT + T

Edit.ListMem CTRL + J Muestra los miembros de la clase actual para la finalización de instrucciones al modificar código.
bers

Edit.MakeLo CTRL + U Cambia el texto seleccionado a caracteres en minúscula.


wercase

Edit.MakeUp CTRL + MA Cambia el texto seleccionado a caracteres en mayúscula.


percase YÚS + U

Edit.OverTyp INSERT Cambia entre los modos de inserción y sobrescritura. Disponible sólo cuando se trabaja en editores
eMode de texto.

Edit.Paramet CTRL + MA Muestra información sobre herramientas acerca del parámetro actual, en función del lenguaje actua
erInfo YÚS + ESPA l. Sólo disponible en la vista Código fuente del Diseñador HTML.
CIO

Edit.PastePar CTRL + MA Pega la información de parámetros previamente copiada en IntelliSense a la ubicación indicada por
ameterTip YÚS + ALT el cursor.
+P

Edit.StopHidi CTRL + M, C Quita la información de esquematización para la región seleccionada actualmente.


ngCurrent TRL + U
Edit.StopOutl CTRL + M, C Quita toda la información de esquematización del documento completo.
ining TRL + P

Edit.SwapAn CTRL + E, C Intercambia los puntos de delimitación y final de la selección actual.


chor TRL + A

Edit.TabLeft MAYÚS + T Desplaza las líneas seleccionadas a la posición de tabulación de la izquierda.


AB

Edit.ToggleAl CTRL + M, C Alterna todas las secciones anteriormente marcadas como texto oculto entre los estados oculto y vi
lOutlining TRL + L sible.

Edit.ToggleO CTRL + M, C Alterna la sección de texto oculto seleccionada actualmente entre los estados oculto y visible.
utliningExpa TRL + M
nsion

Edit.ToggleT CTRL + E, C Establece o quita un acceso directo en la línea actual.


askListShort TRL + T
cut

Edit.ToggleW CTRL +E, CT Habilita o deshabilita el ajuste de línea en un editor.


ordWrap RL + W

Edit.Uncom CTRL + E, C Quita la sintaxis de comentario de la línea de código actual.


mentSelectio TRL + U
n

Edit.ViewWhi CTRL + E, C Muestra u oculta espacios y tabulaciones.


teSpace TRL + S
O bien,
CTRL + R, C
TRL + W

Edit.WordDel CTRL + SUP Elimina la palabra a la derecha del cursor.


eteToEnd RIMIR

Edit.WordDel CTRL + RET Elimina la palabra a la izquierda del cursor.


eteToStart ROCESO

Edit.WordTra CTRL + MA Transpone las palabras de cualquier lado del cursor. Por ejemplo, |End Sub se cambiaría a Sub End|.
nspose YÚS + T

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la administración de


ventanas, esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse para desplazar, cerrar o explorar ventanas de
documentos o herramientas.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de coma Teclas de mét Descripción


ndo odo abreviad
o
View.FullScreen MAYÚS + ALT Activa y desactiva el modo de Pantalla completa.
+ ENTRAR

View.NavigateBack CTRL + SIGNO Vuelve al documento o ventana anterior en el historial de exploración.


ward MENOS (-)

View.NavigateForw CTRL + SIGNO Se desplaza al documento o ventana siguiente en el historial de exploración.


ard IGUAL (=)

Window.ActivateDo ESC Cierra un menú o cuadro de diálogo, cancela una operación en curso o coloca el foco en la
cumentWindow ventana de documento actual.

Window.CloseDocu CTRL + F4 Cierra la ventana secundaria MDI actual.


mentWindow

Window.CloseTool MAYÚS + ESC Cierra la ventana de herramienta actual.


Window

Window.MoveToN CTRL + F2 Mueve el puntero a la barra desplegable que se encuentra en la parte superior del editor d
avigationBar e código cuando el editor se encuentra en la vista Código o en la vista Código del Servid
or.

Window.NextDocu CTRL + F6 Recorre en ciclo las ventanas secundarias MDI una a la vez.
mentWindow

Window.NextDocu CTRL + TAB Muestra el Navegador del IDE, con la primera ventana de documento seleccionada.
mentWindowNav

Window.NextPane ALT + F6 Se desplaza a la ventana de herramienta siguiente.

Window.NextTab CTRL + AV PÁ Se desplaza a la siguiente ficha del documento o ventana.


G

Window.NextTool ALT + F7 Muestra el Navegador del IDE, con la primera ventana de herramientas seleccionada.
WindowNav

Window.PreviousD CTRL + MAYÚ Se desplaza al documento anterior en el editor o diseñador.


ocumentWindow S + F6
Window.PreviousD CTRL + MAYÚ Muestra el Navegador del IDE, con la ventana de documento anterior seleccionada.
ocumentWindowN S + TAB
av

Window.PreviousP MAYÚS + ALT Se desplaza a la ventana seleccionada anteriormente.


ane + F6

Window.PreviousS MAYÚS + F6 Se desplaza al panel anterior de un documento en una vista de paneles de división.
plitPane

Window.PreviousT CTRL + RE PÁ Se desplaza a la ficha anterior del documento o ventana.


ab G

Window.PreviousT MAYÚS + ALT Muestra el Navegador del IDE, con la ventana de herramientas anterior seleccionada.
oolWindowNav + F7

Window.ShowEzM CTRL + ALT + Sólo muestra una lista emergente de todos los documentos abiertos.
DIFileList FLECHA ABAJ
O

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado de la Ayuda integrada, esquema


de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse para ver y desplazarse entre los temas de la
ayuda.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de Teclas de métod Descripción


comando o abreviado
Help.Content CTRL + F1, CTRL Muestra la ventana Contenido de la documentación de MSDN.
s +C

Help.Dynami Ctrl + F1, CTRL + Muestra la ventana Ayuda dinámica.


cHelp D

Help.F1Help F1 Muestra un tema de la ayuda que corresponde a la interfaz de usuario seleccionada.

Help.HelpFav CTRL + F1, CTRL Muestra Favoritos de la Ayuda.


orites +F

Help.HowDoI CTRL + F1, CTRL Muestra la página Cómo correspondiente a la configuración de usuario seleccionada.
+h

Help.Index CTRL + F1, I Muestra la ventana Índice de la documentación de MSDN.

Help.IndexRe Ctrl + F1, Ctrl + T Muestra la ventana Resultados del índice.


sults

Help.NextTop ALT + FLECHA AB Muestra el siguiente tema de la tabla de contenido. Sólo disponible en la ventana de ayuda d
ic AJO el explorador (Web).
O bien,
ALT + FLECHA DE
RECHA

Help.Previous ALT + FLECHA AR Muestra el tema anterior de la tabla de contenido. Sólo disponible en la ventana de ayuda del
Topic RIBA explorador (Web).
OR
ALT + FLECHA IZ
QUIERDA

Help.Search CTRL + F1, CTRL Muestra la página de Ayuda de Visual Studio con la ficha Buscar activa. Esta página permite
+S buscar palabras o frases en la documentación incluida en MSDN.

Help.Searchr CTRL + F1, CTRL Muestra la página de Ayuda de Visual Studio con la ficha Buscar y con el foco en la lista de te
esults +R mas generada por la última búsqueda.
Help.Window MAYÚS + F1 Muestra un tema de la Ayuda que corresponde a la interfaz de usuario actual.
Help

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Valores de configuración de Visual Studio
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Examinador de objetos,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar en el Examinador de objetos.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre Teclas de mé Descripción


de coma todo abrevia
ndo do
Edit.FindS ALT + F12 Muestra el panel Buscar símbolo del cuadro de diálogo Buscar y reemplazar.
ymbol

Edit.GoTo CTRL + F12 Muestra la definición del símbolo seleccionado en el código.


Declaratio
n

Edit.GoTo F12 Muestra la declaración del símbolo seleccionado en el código.


Definition

Edit.Quick MAYÚS + ALT Busca el objeto o miembro seleccionado en el archivo y muestra las coincidencias en la ventana Res
FindSymb + F12 ultados de la búsqueda de símbolos.
ol

View.Obje CTRL + ALT + Muestra el Examinador de objetos para ver las clases, las propiedades, los métodos, los eventos y
ctBrowser J las constantes disponibles en los paquetes y bibliotecas de objetos, así como en los procedimientos
del proyecto.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para macros, esquema de Visual


C# 2005
Las combinaciones de teclas de método abreviado siguientes pueden utilizarse al trabajar con macros.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de coman Teclas de método a Descripción


do breviado
View.MacroExplorer ALT + F8 Muestra la ventana Explorador de macros, en la que se muestran todas las macr
os disponibles en la selección actual.

Tools.MacrosIDE ALT + F11 Inicia el IDE de macros, Macros de Visual Studio.

Tools.RecordTempor CTRL + MAYÚS + R Coloca el IDE de Visual Studio en modo de grabación de macros.
aryMacro

Tools.RunTemporary CTRL + MAYÚS + P Reproduce una macro grabada.


Macro

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para ventanas de herramientas,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes permiten mostrar ventanas de herramientas específicas.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de co Teclas de mé Descripción


mando todo abrevia
do
Tools.CodeSnipp CTRL + K, CTR Muestra el Administrador de fragmentos de código, que permite buscar e insertar fragmento
etManager L+B s de código en archivos.

View.Bookmark CTRL + W, CT Muestra la ventana Marcador.


Window RL + B

View.ClassView CTRL + W, CT Muestra la ventana Vista de clases.


RL + C

View.ClassView CTRL + K, CTR Cambia el foco al cuadro Búsqueda de vistas de clases.


GoToSearchCo L + V
mbo

View.CodeDefini CTRL + W, CT Muestra la ventana Definición de código.


tionWindow RL + D

View.Command CTRL + W, CT Muestra la ventana Comando, que permite escribir comandos que manipulan el entorno de
Window RL + A desarrollo integrado (IDE).

View.Document CTRL + W, CT Muestra la ventana Esquema del documento para ver el esquema plano o jerárquico del do
Outline RL + U cumento actual.

View.ErrorList CTRL + W, CT Muestra la ventana Lista de errores.


RL + E

View.FindSymbo CTRL + W, CT
lResults RL + Q

View.ObjectBro CTRL + W, CT
wser RL + J

View.Output CTRL + W, CT Muestra la ventana Resultados para ver los mensajes de estado en tiempo de ejecución.
RL + O

View.PendingCh CTRL + W, CT
eckins RL + G

View.Properties CTRL + W, CT Muestra la ventana Propiedades, que enumera las propiedades y eventos en tiempo de dise
Window RL + P ño del elemento seleccionado actualmente.
View.PropertyPa MAYÚS + F4 Muestra las páginas de propiedades del elemento seleccionado.
ges

View.ResourceVi CTRL + W, CT Muestra la ventana Vista de recursos.


ew RL + R

View.ServerExpl CTRL + W, CT Muestra el Explorador de servidores, que permite ver y manipular servidores de bases de d
orer RL + L atos, registros de eventos, colas de mensajes, servicios Web y otros servicios del sistema oper
ativo.

View.SolutionEx CTRL + W, CT Muestra el Explorador de soluciones, que enumera los proyectos y archivos de la solución
plorer RL + S actual.

View.TaskList CTRL + W, CT Muestra la ventana Lista de tareas, donde se pueden personalizar, clasificar por categorías y
RL + T administrar tareas, comentarios, accesos directos, advertencias y mensajes de error.

View.Toolbox CTRL + W, CT Muestra el Cuadro de herramientas, que contiene controles y otros elementos que pueden i
RL + X ncluirse o utilizarse en el código.

View.WebBrows CTRL + W, CT Muestra la ventana Explorador Web, que permite ver páginas en Internet.
er RL + W

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para proyectos, esquema de Visual


C# 2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar para agregar nuevos elementos a un proyecto,
generar un proyecto o abrir proyectos.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de Teclas de méto Descripción


comando do abreviado
Build.BuildS F6 Genera la solución.
olution

Build.Cancel CTRL + INTERRU Detiene la generación actual.


MPIR

Build.Compil CTRL + F7 Crea un archivo objeto que contiene código máquina, directivas del vinculador, secciones, refer
e encias externas y nombres de datos y funciones para el archivo seleccionado.

File.NewFile CTRL + N Muestra el cuadro de diálogo Nuevo archivo, donde puede seleccionar un nuevo archivo para
agregarlo al proyecto actual.

File.NewProj CTRL + MAYÚS Muestra el cuadro de diálogo Nuevo proyecto.


ect +N

File.OpenFile CTRL + O Muestra el cuadro de diálogo Abrir archivo.

File.OpenPro CTRL + MAYÚS Muestra el cuadro de diálogo Abrir proyecto, donde se pueden agregar proyectos existentes a
ject +O la solución.

Project.AddC MAYÚS + ALT + Muestra el cuadro de diálogo Agregar nuevo elemento y selecciona la plantilla Clase como p
lass C redeterminada.

Project.AddE MAYÚS + ALT + Muestra el cuadro de diálogo Agregar elemento existente, que permite agregar un archivo e
xistingItem A xistente al proyecto actual.

Project.Add CTRL + MAYÚS Muestra el cuadro de diálogo Agregar nuevo elemento, que permite agregar un archivo nue
NewItem + A vo al proyecto actual.

Project.Over CTRL + ALT + IN Permite reemplazar los métodos de clase base en una clase derivada.
ride SERT

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Editor de imágenes, esquema


de Visual C# 2005
En la tabla siguiente se incluyen las teclas de de método abreviado de los comandos del Editor de imágenes que están
asociadas a teclas de manera predeterminada. Para cambiar las teclas de método abreviado, haga clic en Opciones en el menú
Herramientas, expanda Entorno y, a continuación, haga clic en Teclado. Para obtener más información, vea
Cómo: Trabajar con combinaciones de teclas de método abreviado.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Comando Teclas Descripción


Image.AirBrushTool CTRL + A Dibuja, con un aerógrafo, en el tamaño y el color seleccionados.

Image.BrushTool CTRL + B Dibuja, con un pincel, en el tamaño, la forma y el color seleccionados.

Image.CopyAndOut CTRL + MAYÚS + U Crea una copia de la selección actual y la resalta. Si la selección actual contiene el co
lineSelection lor de fondo, se excluirá si ha seleccionado transparente.

Image.DrawOpaque CTRL + J Convierte la selección actual en opaca o transparente.

Image.EllipseTool CTRL + P Dibuja una elipse con el ancho de línea y el color seleccionados.

Image.EraserTool CTRL + MAYÚS + I Borra una parte de la imagen (con el color de fondo actual).

Image.FilledEllipseT CTRL + MAYÚS + AL Dibuja una elipse rellena.


ool T+P

Image.FilledRectang CTRL + MAYÚS + AL Dibuja un rectángulo relleno.


leTool T+R

Image.FilledRoundR CTRL + MAYÚS + AL Dibuja un rectángulo redondeado relleno.


ectangleTool T+W

Image.FillTool CTRL + F Rellena un área.

Image.FlipHorizonta CTRL + H Voltea la imagen o la selección en sentido horizontal.


l

Image.FlipVertical MAYÚS + ALT + H Voltea la imagen o la selección en sentido vertical.

Image.LargerBrush CTRL + = Aumenta el tamaño del pincel en un píxel en cada dirección. Para disminuir el tama
ño del pincel, vea Image.SmallerBrush en esta tabla.

Image.LineTool CTRL + L Dibuja una línea recta con el tamaño, la forma y el color seleccionados.

Image.Magnificatio CTRL + M Cambia a la herramienta Aumentar, que permite ampliar secciones específicas de u
nTool na imagen.
Image.Magnify CTRL + MAYÚS + M Alterna entre el aumento actual y un aumento de 1:1.

Image.NewImageTy INSERT Abre el cuadro de diálogo Nuevo tipo de imagen de <dispositivo>, que permite cre
pe ar una imagen para un tipo de imagen diferente.

Image.NextColor CTRL + ] Cambia el color de primer plano de dibujo al siguiente color de la paleta.
O bien,
CTRL + FLECHA DER
ECHA

Image.NextRightCol CTRL + MAYÚS + ] Cambia el color de fondo por el siguiente color de la paleta.
or
O bien,
MAYÚS + CTRL + FL
ECHA DERECHA

Image.OutlinedEllip MAYÚS + ALT + P Dibuja una elipse rellena con un contorno.


seTool

Image.OutlinedRou MAYÚS + ATL + R Dibuja un rectángulo relleno con contorno.


ndRectangleTool

Image.OutlinedRou MAYÚS + ALT + W Dibuja un rectángulo redondeado relleno con un contorno.


ndRectangleTool

Image.PencilTool CTRL + I Dibuja con un lápiz de un solo píxel.

Image.PreviousColo CTRL + [ Cambia el color de primer plano de dibujo al color de la paleta anterior.
r
O bien,
CTRL + FLECHA IZQ
UIERDA

Image.PreviousRigh CTRL + MAYÚS + [ Cambia el color de fondo de dibujo al color de la paleta anterior.
tColor
O bien,
MAYÚS + CTRL + FL
ECHA IZQUIERDA

Image.RectangleSel MAYÚS + ALT + S Selecciona una parte rectangular de la imagen para moverla, copiarla o editarla.
ectionTool

Image.RectangleTo ATL + R Dibuja un rectángulo con el ancho de línea y el color seleccionados.


ol

Image.Rotate90Deg CTRL + MAYÚS + H Gira la imagen o la selección 90 grados.


rees

Image.RoundedRect ALT + W Dibuja un rectángulo redondeado con el ancho de línea y el color seleccionados.
angleTool

Image.ShowGrid CTRL + ALT + S Muestra u oculta la cuadrícula de píxeles (activa o desactiva la opción Cuadrícula d
e píxelesen la cuadro de diálogo Configuración de cuadrícula).
Image.ShowTileGrid CTRL + MAYÚS + AL Muestra u oculta la cuadrícula de mosaico (activa o desactiva la opción Cuadrícula
T+S de mosaicoen la cuadro de diálogo Configuración de cuadrícula).

Image.SmallBrush CTRL + . (PUNTO) Reduce el tamaño del pincel a un píxel. Vea también Image.LargerBrush y Image.Sm
allerBrush en esta tabla.

Image.SmallBrush CTRL + - (MENOS) Reduce el tamaño del pincel en un píxel en cada dirección. Para volver a ampliar el t
amaño del pincel, vea Image.LargerBrush en esta tabla.

Image.TextTool CTRL + T Abre el cuadro de diálogo Herramienta de texto.

Image.UseSelection CTRL + U Dibuja utilizando como pincel la selección actual.


AsBrush

Image.ZoomIn CTRL + MAYÚS + . ( Aumenta la ampliación de la vista actual.


punto)
O bien,
CTRL + FLECHA ARR
IBA

Image.ZoomOut CTRL + , (coma) Reduce la ampliación de la vista actual.


O bien,
CTRL + FLECHA ABA
JO

Para obtener información sobre cómo agregar recursos a proyectos administrados, vea Recursos de aplicaciones en la Guía del
desarrollador de .NET Framework. Para obtener información sobre cómo agregar manualmente archivos de recursos a
proyectos administrados, cómo obtener acceso a recursos, cómo mostrar recursos estáticos y cómo asignar cadenas de
recursos a propiedades, vea Tutorial: Adaptar formularios Windows Forms y
Tutorial: Utilizar los recursos de adaptación con ASP.NET.
Requisitos
Ninguno
Vea también
Referencia
Editor de imágenes
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Editor de cuadros de diálogo,


esquema de Visual C# 2005
En la tabla siguiente se incluyen los métodos abreviados de teclado predeterminados para los comandos del Editor de cuadros
de diálogo. Para cambiar las teclas de método abreviado, haga clic en Opciones en el menú Herramientas, expanda Entorno
y, a continuación, haga clic en Teclado. Para obtener más información, vea
Cómo: Trabajar con combinaciones de teclas de método abreviado.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Comando Teclas Descripción


Format.AlignBotto CTRL + MAYÚS + FLECHA A Alinea los bordes inferiores de los controles seleccionados con el control dom
ms BAJO inante.

Format.AlignCente MAYÚS + F9 Alinea los centros verticales de los controles seleccionados con el control do
rs minante.

Format.AlignLefts CTRL + MAYÚS + FLECHA I Alinea los bordes izquierdos de los controles seleccionados con el control do
ZQUIERDA minante.

Format.AlignMiddl F9 Alinea los centros horizontales de los controles seleccionados con el control d
es ominante.

Format.AlignRight CTRL + MAYÚS + FLECHA D Alinea los bordes derechos de los controles seleccionados con el control domi
s ERECHA nante.

Format.AlignTops CTRL + MAYÚS + FLECHA A Alinea los bordes superiores de los controles seleccionados con el control do
RRIBA minante.

Format.ButtonBott CTRL + B Coloca los botones seleccionados a lo largo de la parte inferior central del cua
om dro de diálogo.

Format.ButtonRigh CTRL + R Coloca los botones seleccionados en la esquina superior derecha del cuadro d
t e diálogo.

Format.CenterHori CTRL + MAYÚS + F9 Centra los controles horizontalmente en el cuadro de diálogo.


zontal

Format.CenterVert CTRL + F9 Centra los controles verticalmente en el cuadro de diálogo.


ical

Format.CheckMne CTRL + M Comprueba que las teclas de acceso son únicas.


monics

Format.SizeToCont MAYÚS + F7 Cambia el tamaño del control o controles seleccionados para ajustar el texto
ent del título.

Format.SpaceAcro ALT + FLECHA DERECHA Separa de manera uniforme los controles seleccionados en dirección horizont
ss al.
Format.SpaceDow ALT + FLECHA ABAJO Separa de manera uniforme los controles seleccionados en dirección vertical.
n

Format.TabOrder CTRL + D Establece el orden los controles dentro del cuadro de diálogo.

Format.TestDialog CTRL + T Ejecuta el cuadro de diálogo para comprobar su aspecto y comportamiento.

Format.ToggleGui CTRL + G Recorre en ciclo las opciones de no cuadrícula, guías y cuadrícula para la edici
des ón de cuadros de diálogo.

Para obtener información sobre cómo agregar recursos a proyectos administrados, vea Recursos de aplicaciones en la Guía del
desarrollador de .NET Framework. Para obtener información sobre cómo agregar manualmente archivos de recursos a
proyectos administrados, cómo obtener acceso a recursos, cómo mostrar recursos estáticos y cómo asignar cadenas de
recursos a propiedades, vea Tutorial: Adaptar formularios Windows Forms y
Tutorial: Utilizar los recursos de adaptación con ASP.NET.
Vea también
Referencia
Editor de cuadros de diálogo
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para buscar y reemplazar,


esquema de Visual C# 2005
Utilice las combinaciones de teclas de método abreviado siguientes para buscar texto en un archivo único o en varios archivos,
y para buscar objetos y miembros.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de c Teclas de mé Descripción


omando todo abrevia
do
Edit.Find CTRL + F Muestra la ficha Rápida del cuadro de diálogo Buscar y reemplazar.

Edit.FindAllRef CTRL + K, CTR Muestra la lista de lugares donde se encuentran todas las referencias de símbolos.
erences L+R

Edit.FindInFile CTRL + MAYÚ Muestra la ficha En archivos del cuadro de diálogo Buscar y reemplazar.
s S+F

Edit.FindNext F3 Encuentra la siguiente aparición del texto de búsqueda anterior.

Edit.FindNextS CTRL + F3 Encuentra la siguiente aparición del texto seleccionado actualmente en el documento.
elected

Edit.FindPrevi MAYÚS + F3 Encuentra la aparición anterior del texto de búsqueda.


ous

Edit.FindPrevi CTRL + MAYÚ Encuentra la aparición anterior del texto seleccionado actualmente o la palabra donde se encue
ousSelected S + F3 ntra el punto de inserción.

Edit.GoToFind CTRL + / Coloca el punto de inserción en el cuadro Buscar/Comando de la barra de herramientas Están
Combo dar.

Edit.Increment CTRL + I Inicia la búsqueda incremental. Si se inicia la búsqueda incremental, pero no se escribe ningún c
alSearch arácter, recupera el modelo de búsqueda anterior. Si se encuentra texto, busca la siguiente apari
ción.

Edit.Replace CTRL + H Muestra las opciones de reemplazo de la ficha Rápida del cuadro de diálogo Buscar y reempl
azar.

Edit.ReplaceIn CTRL + MAYÚ Muestra las opciones de reemplazo de la ficha En archivos del cuadro de diálogo Buscar y ree
Files S+H mplazar.

Edit.ReverseIn CTRL + MAYÚ Cambia la dirección de la búsqueda incremental para comenzar al final del archivo y avanzar ha
crementalSear S + I cia el principio.
ch

Edit.StopSearc ALT + F3, S Detiene la operación actual de Buscar en archivos.


h
View.FindSym CTRL + W, CT Muestra la ventana Resultados de la búsqueda de símbolos, que muestra las coincidencias d
bolResults RL + Q e las búsquedas de símbolos.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la refactorización, esquema


de Visual C# 2005
Las combinaciones de teclas siguientes son los métodos abreviados para realizar las operaciones de Refactorización.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de co Teclas de Descripción


mando método a
breviado
Refactor.Encaps CTRL + R, Muestra el Encapsular campo (Cuadro de diálogo), que permite crear una propiedad a partir de u
ulateField CTRL + E n campo existente y, a continuación, actualiza el código para hacer referencia a la nueva propieda
d.

Refactor.ExtractI CTRL + R, Muestra el Extraer interfaz (Cuadro de diálogo), que permite crear una nueva interfaz con miemb
nterface CTRL + I ros derivados de una clase, estructura o interfaz existentes.

Refactor.Extract CTRL + R, Muestra el Extraer método (Cuadro de diálogo), que permite crear un nuevo método a partir de u
Method CTRL + M n fragmento de código de un método existente.

Refactor.Promot CTRL + R, Mueve una variable de un uso local a un método, indizador o parámetro de constructor y actualiz
eLocalVariablet CTRL + P a correctamente los sitios de llamada. Para obtener más información, vea
oParameter Promocionar una variable local a parámetro.

Refactor.Remov CTRL + R, Muestra el cuadro de diálogo Quitar parámetros, que quita los parámetros de los métodos, indi
eParameters CTRL + V zadores o delegados cambiando la declaración en cualquier ubicación en la que se llama al miem
bro. Para obtener más información, vea Quitar parámetros.

Refactor.Renam F2 Muestra el Cambiar nombre (Cuadro de diálogo), que permite cambiar el nombre de los identific
e adores para los símbolos de código como campos, variables locales, métodos, espacios de nombr
O bien, es, propiedades y tipos.
CTRL +R, C
TRL + R

Refactor.Reorde CTRL + R, Muestra el Reordenar parámetros (Cuadro de diálogo), que permite cambiar el orden de los pará
rParameters CTRL + O metros de los métodos, indizadores y delegados.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Editor de recursos


administrados, esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes sólo se pueden utilizar cuando se edita en el Editor de recursos
administrados. Para obtener más información, vea Página Recursos, Diseñador de proyectos.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre d Teclas de mét Descripción


e comand odo abreviado
o
Edit.EditCell F2 Cambia al modo de edición de la celda seleccionada en la vista Otros y la vista Cadenas.

Edit.Remov SUPRIMIR Quita el archivo seleccionado en las vistas Archivos, Imágenes, Iconos y Audio.
e

Edit.Remov CTRL + SUPRI Elimina la fila seleccionada en la vista Otros y la vista Cadenas.
eRow MIR

Resources. CTRL +4 Cambia el Editor de recursos administrados a la vista Audio, que muestra los archivos de sonido
Audio del proyecto actual. Los formatos de los archivos mostrados incluyen .wav, .wma y .mp3.

Resources.F CTRL +5 Cambia el editor de recursos administrados a vista Archivos, que muestra los archivos que no se
iles encuentran en las demás vistas.

Resources.I CTRL + 3 Cambia el Editor de recursos administrados a la vista Iconos, que muestra los archivos de icono (
cons *.ico) del proyecto actual.

Resources.I CTRL +2 Cambia el Editor de recursos administrados a la vista Imágenes, que muestra los archivos de im
mages agen del proyecto actual. Los formatos de archivos mostrados incluyen .bmp, .jpg y .gif.

Resources. CTRL +6 Cambia el Editor de recursos administrados a la vista Otros, que muestra una cuadrícula de confi
Other guración para agregar otros tipos que admiten la serialización de cadenas.

Resources.S CTRL +1 Cambia el Editor de recursos administrados a la vista Cadenas, que muestra cadenas en una cua
trings drícula con columnas para el nombre, valor y comentarios del recurso de cadena.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Recursos en formato de archivo .Resx
Entorno de desarrollo de Visual C#

Teclas de método abreviado para fragmentos de código,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes se pueden utilizar para trabajar con fragmentos de código.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de c Teclas de mét Descripción


omando odo abreviad
o
Edit.InsertSnip CTRL + K, CTRL Muestra el Selector de fragmentos de código, que permite seleccionar un fragmento de código
pet +X mediante IntelliSense e insertar después el fragmento de código en la posición del cursor.

Edit.Surround CTRL + K, CTRL Muestra el Selector de fragmentos de código, que permite seleccionar un fragmento de código
With +S mediante IntelliSense y ajustar después el fragmento alrededor del texto seleccionado.

Tools.CodeSni CTRL + K, CTRL Muestra el Administrador de fragmentos de código, que permite buscar e insertar fragmentos
ppetsManager + B de código en archivos.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Diagrama de clase, esquema de


Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes sólo se pueden utilizar al trabajar con diagramas de clase.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre Teclas d Descripción


de coma e métod
ndo o abrevi
ado
ClassDiag NUM - (s Contrae los nodos expandidos en la ventana Detalles de clase o contrae el compartimiento de formas sel
ram.Colla igno me eccionadas en el diagrama.
pse nos)

ClassDiag NUM + ( Expande los nodos contraídos en la ventana Detalles de clase o expande el compartimiento de formas se
ram.Expa signo má leccionadas en el diagrama.
nd s)

Edit.Delet CTRL + S Quita el elemento seleccionado del diagrama de clase.


e UPRIMIR

Edit.Expa MAYÚS Expande o contrae los tipos base en el compartimiento de formas seleccionadas.
ndCollap + ALT +
seBaseTy B Por ejemplo, si Interfaz1 hereda de Interfaz2, Interfaz3 e Interfaz4, las interfaces parentales se enumeran e
peList n el compartimiento de formas correspondiente a Interfaz1. Con este comando, puede contraer la lista de i
nterfaces heredadas para que sólo se muestre información de resumen sobre el número de interfaces bas
e heredadas por Interfaz1.

Edit.Navi MAYÚS Selecciona el círculo de interfaz para un compartimiento de formas. El círculo aparece en formas que impl
gateToLol + ALT + ementan una o más interfaces.
lipop L

Edit.Rem SUPRIMI Quita el compartimiento de formas seleccionadas del diagrama.


oveFrom R
Diagram

View.Vie ENTRAR Para el elemento seleccionado, abre el archivo correspondiente y coloca el cursor en la ubicación correcta.
wCode
O bien,
F7

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Otros recursos
Trabajar con diagramas de clase
Entorno de desarrollo de Visual C#

Teclas de método abreviado para la ventana Marcadores,


esquema de Visual C# 2005
Las combinaciones de teclas de método abreviado siguientes sólo se pueden utilizar cuando se trabaja con marcadores, ya sea
en la Marcador (Ventana) o en el editor.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Nombre de comando Teclas de método abreviado Descripción


Edit.ClearBookmarks CTRL + B, CTRL + C Quita todos los marcadores del documento

Edit.EnableBookmark CTRL + B, CTRL + E Habilita el uso de marcadores en el documento actual.

Edit.NextBookmark CTRL + B, CTRL + N Se desplaza al siguiente marcador del documento.

Edit.PreviousBookmark CTRL + B, CTRL + P Se desplaza al marcador anterior.

Edit.ToggleBoomark CTRL + B, CTRL + T Habilita o deshabilita un marcador en la línea actual del documento.

View.BookmarkWindow CTRL + W, CTRL + B Muestra la ventana Marcador.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Entorno de desarrollo de Visual C#

Teclas de método abreviado del Editor de aceleradores y del


Editor de cadenas, esquema de Visual C# 2005
Utilice las siguientes combinaciones de teclas de método abreviado en el Editor de aceleradores o en el Editor de cadenas.
Nota
Las opciones disponibles en los cuadros de diálogo, así como los nombres y ubicaciones de los comandos de menú que se v
en podrían diferir de lo que se describe en la Ayuda, en función de los valores de configuración o de edición activos. Para ca
mbiar su configuración, haga clic en Importar y exportar configuraciones en el menú Herramientas. Para obtener más in
formación, vea Valores de configuración de Visual Studio.

Comand Teclas de mét Descripción


o odo abreviad
o
Edit.New INSERT Agrega una nueva entrada para un método abreviado de teclado. Sólo disponible en el Editor de ac
Accelerat eleradores.
or

Edit.New INSERT Agrega una nueva entrada a la tabla de cadenas. Sólo disponible en el Editor de cadenas.
String

Edit.Next CTRL + W Muestra el cuadro de mensaje Capturar tecla siguiente, que le indica que presione las teclas que
KeyTyped desea utilizar como métodos abreviados de teclado. Sólo disponible en el Editor de aceleradores.

Vea también
Conceptos
Teclas de método abreviado predeterminadas de Visual C# 2005
Conceptos del lenguaje Visual C#

Migrar a Visual C#
En esta sección se presenta la sintaxis y los conceptos de C# para los programadores que migran desde otros lenguajes de
programación. También contiene la documentación de referencia del Ayudante para la conversión del lenguaje Java, que se
puede utilizar para convertir código fuente de Java en código fuente de C#.
En esta sección
C# para desarrolladores de Java
Compara la sintaxis y construcción del lenguaje C# y del lenguaje Java.
Convertir aplicaciones de Java a Visual C#
Describe el Ayudante para la conversión del lenguaje Java, una herramienta para trasladar los proyectos de Java a Visual C#.
C# para los desarrolladores de C++
Compara el lenguaje C# con algunas características del lenguaje C++.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Visual C#
Introducción a Visual C#
Conceptos del lenguaje Visual C#

C# para desarrolladores de Java


Los temas de esta sección proporcionan una introducción al lenguaje C# y .ENT. Framework.
En esta sección
Lenguaje de programación C# para desarrolladores de Java
Ejemplos de código de C# para desarrolladores de Java
Tipos de aplicación de C# para programadores de Java
Vea también
Conceptos
Ayudante para la conversión del lenguaje Java
Otros recursos
Introducción a Visual C#
Conceptos del lenguaje Visual C#

Lenguaje de programación C# para desarrolladores de Java


En esta sección se tratan las similitudes y diferencias entre los lenguajes de programación C# y Java.
En esta sección
Convenciones para los archivos de código fuente (C# y Java)
Tipos de datos (C# y Java)
Operadores (C# y Java)
Control de flujo (C# y Java)
Instrucciones de bucle (C# y Java)
Fundamentos de las clases (C# y Java)
Main () y otros métodos (C# y Java)
Utilizar un número indeterminado de parámetros (C# y Java)
Propiedades (C# y Java)
Structs (C# y Java)
Matrices
Herencia y clases derivadas (C# y Java)
Eventos
Sobrecarga de operadores (C# y Java)
Excepciones (C# y Java)
Técnicas avanzadas de C# (C# y Java)
Recolección de elementos no utilizados (C# y Java)
Código seguro y no seguro (C# y Java)
Resumen (C# y Java)
Secciones relacionadas
Guía de programación de C#
Visual C#
Migrar a Visual C#
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Convenciones para los archivos de código fuente (C# y Java)


La convención de nomenclatura para archivos que contienen clases de C# es un poco diferente a la de Java. En Java, todos los
archivos de código fuente tienen extensión .java. Cada archivo de código fuente contiene una declaración de clase pública de
nivel superior y el nombre de clase debe coincidir con el nombre de archivo. Es decir, una clase denominada Customer
declarada con un ámbito público se debe definir en un archivo de código fuente con el nombre Customer.java.
La extensión .cs indica que se trata de código fuente de C#. A diferencia de Java, los archivos de código fuente pueden contener
más de una declaración de clase pública de nivel superior y no es necesario que el nombre de archivo coincida con ninguno de
los nombres de las clases.
Declaraciones de nivel superior
En Java y C#, el código fuente comienza con algunas declaraciones de nivel superior en una secuencia determinada. Existen
sólo algunas diferencias entre las declaraciones realizadas en programas de Java y C#.
Declaraciones de nivel superior en Java
En Java, puede agrupar las clases con la palabra clave package. Una clase empaquetada debe utilizar la palabra clave package
en la primera línea ejecutable del archivo de código fuente. A continuación de ésta viene cualquier instrucción de importación
necesaria para tener acceso a clases de otros paquetes y, a continuación, la declaración de clase, como se muestra a
continuación:

package Acme;
import java.io.*;
class Customer
{
...
}

Declaraciones de nivel superior en C#


C# utiliza el concepto de espacio de nombres para agrupar clases relacionadas lógicamente mediante la palabra clave
namespace. Éstos actúan de forma similar a los paquetes de Java; además, podría aparecer una clase con el mismo nombre en
dos espacios de nombres diferentes. Para tener acceso a clases definidas en un espacio de nombres externo al actual, utilice la
directiva using seguida del nombre del espacio de nombres, como se muestra a continuación:
C#
using System.IO;

namespace Acme
{
class Customer
{
// ...
}
}

Tenga en cuenta que las directivas using se pueden colocar dentro de una declaración de espacio de nombres, en cuyo caso
esos espacios de nombres importados forman parte del espacio de nombres contenedor.
Java no permite varios paquetes en el mismo archivo de código fuente. Sin embargo, C# permite varios espacios de nombres
en un solo archivo .cs, como se muestra a continuación:
C#
namespace AcmeAccounting
{
public class GetDetails
{
// ...
}
}
namespace AcmeFinance
{
public class ShowDetails
{
// ...
}
}

Nombres completos y alias de espacios de nombres


Al igual que en Java, puede tener acceso a clases de .NET Framework o de espacios de nombres definidos por el usuario sin
una referencia using para ese espacio de nombres mediante el nombre completo de la clase, como DataSet o
AcmeAccounting.GetDetails en el ejemplo anterior.

Los nombres completos pueden ser largos y difíciles de manejar, en cuyo caso puede utilizar la palabra clave using para
especificar un nombre corto, o un alias, que haga el código más legible.
En el código siguiente, se crea un alias para hacer referencia al código escrito por una compañía ficticia:
C#
using DataTier = Acme.SQLCode.Client;

class OutputSales
{
static void Main()
{
int sales = DataTier.GetSales("January");
System.Console.WriteLine("January's Sales: {0}", sales);
}
}

Observe que en la sintaxis de WriteLine, con {x} en la cadena de formato, la x denota la posición en la lista de argumentos en la
que se va a insertar el valor. Si el método GetSales devolvió 500, el resultado de la aplicación sería el siguiente:
January's Sales: 500

Directivas de preprocesamiento
Al igual que C y C++, C# incluye directivas de preprocesamiento que ofrecen la posibilidad de omitir condicionalmente
secciones de archivos de código fuente, informar de errores y condiciones de advertencia y delimitar regiones características
del código fuente. El término "directivas de preprocesamiento" sólo se utiliza con el fin de mantener la coherencia con los
lenguajes de programación C y C++, puesto que C# no incluye un paso de preprocesamiento independiente. Para obtener más
información, vea Directivas de preprocesador de C#.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Tipos de datos (C# y Java)


En este tema se describen algunas de las similitudes y diferencias principales en cómo se representan y asignan los datos, y se
recolectan los elementos no utilizados en Java y en C#.
Tipos de datos compuestos
El concepto de clase como tipo de datos compuesto de campos, métodos y eventos es similar en Java y C#. (La herencia de
clases se describe independientemente en el tema titulado Herencia y clases derivadas (C# y Java).) C# introduce el concepto
de estructura como tipo de datos compuesto asignado por pila que no admite la herencia. En la mayoría de los otros aspectos,
las estructuras son muy similares a las clases. Las estructuras proporcionan una manera ligera de agrupar campos y métodos
relacionados para el uso en los bucles de pequeñas dimensiones y otros escenarios donde el rendimiento es crucial.
C# permite crear un método de destructor al que se llama antes de que se destruyan las instancias de una clase. En Java, se
puede utilizar un método finalize para contener código que limpia los recursos antes de que se recolecten los elementos no
utilizados del objeto. En C#, el que realiza esta función es el destructor de clase. El destructor se parece a un constructor sin los
argumentos y con un carácter de tilde delante (~).
Tipos de datos integrados
C# proporciona todos los tipos de datos que están disponibles en Java y agrega compatibilidad para los números sin signo y
un nuevo tipo de punto flotante de 128 bits de alta precisión.
Para cada tipo de datos primitivo en Java, la biblioteca de clases principal proporciona una clase contenedora, que lo
representa como un objeto de Java. Por ejemplo, la clase Int32 contiene el tipo de datos int y la clase Double contiene el tipo
de datos double.
Por otro lado, todos los tipos de datos primitivos en C# son objetos en el espacio de nombres System. Para cada tipo de datos,
se proporciona un nombre corto o alias. Por ejemplo, int es el nombre corto correspondiente a System.Int32 y double es la
forma abreviada de System.Double.
En la tabla siguiente se proporciona la lista de tipos de datos de C# y sus alias. Como puede ver, los primeros ocho de estos
tipos corresponden a los tipos primitivos disponibles en Java. Sin embargo, tenga en cuenta que el tipo boolean de Java se
denomina bool en C#.
Nombre Clase . Tipo Anc Intervalo (bits)
corto NET ho
byte Byte Entero sin signo 8 0 a 255

sbyte SByte Entero con signo 8 -128 a 127

int Int32 Entero con signo 32 -2.147.483.648 a 2.147.483.647

uint UInt32 Entero sin signo 32 0 a 4294967295

short Int16 Entero con signo 16 -32.768 a 32.767

ushort UInt16 Entero sin signo 16 0 a 65535

long Int64 Entero con signo 64 -922337203685477508 a 92233


7203685477507

ulong UInt64 Entero sin signo 64 0 a 18446744073709551615

float Single Tipo de punto flotante de precisión simple 32 -3,402823e38 a 3,402823e38

double Double Tipo de punto flotante de precisión doble 64 -1,79769313486232e308 a 1,797


69313486232e308
char Char Un carácter Unicode 16 Símbolos Unicode utilizados en el
texto

bool Boolean Tipo Boolean lógico 8 True o false

object Object Tipo base de todos los otros tipos

string String Una secuencia de caracteres

decimal Decimal Tipo preciso fraccionario o integral, que puede representar números 128 ±1.0 × 10e−28 a ±7.9 × 10e28
decimales con 29 dígitos significativos

Dado que C# representa todos los tipos de datos primitivos como objetos, es posible llamar a un método de objeto de un tipo
de datos primitivo. Por ejemplo:
C#
static void Main()
{
int i = 10;
object o = i;
System.Console.WriteLine(o.ToString());
}

Esto se logra con la ayuda de las conversiones automáticas boxing y unboxing. Para obtener más información, vea
Conversión boxing y unboxing (Guía de programación de C#).
Constantes
Java y C# proporcionan la capacidad para declarar una variable cuyo valor se especifica en tiempo de compilación y no se
puede cambiar en tiempo de ejecución. Java utiliza el modificador de campo final para declarar este tipo de variable, mientras
que C# utiliza la palabra clave const. Además de const, C# proporciona la palabra clave readonly para declarar variables a las
que se puede asignar un valor una vez en tiempo de ejecución, ya sea en la instrucción de declaración o en otra parte del
constructor. Después de la inicialización, el valor de una variable readonly no puede cambiar. Un escenario en el que las
variables readonly son útiles es cuando los módulos que se han compilado independientemente tienen que compartir datos
como un número de versión. Si el módulo A se actualiza y se vuelve a compilar con un nuevo número de versión, el módulo B
se puede inicializar con ese nuevo valor constante sin tener que volver a compilarlo.
Enumeraciones
Las enumeraciones se utilizan para agrupar constantes con nombres en forma similar a la forma en que se utilizan en C y C++;
no están disponibles en Java. En el ejemplo siguiente se define una enumeración Color sencilla.
C#
public enum Color
{
Green, //defaults to 0
Orange, //defaults to 1
Red, //defaults to 2
Blue //defaults to 3
}

También se pueden asignar valores integrales a las enumeraciones, tal como se muestra en la siguiente declaración de
enumeración:
C#
public enum Color2
{
Green = 10,
Orange = 20,
Red = 30,
Blue = 40
}

En el siguiente ejemplo de código se llama al método GetNames del tipo Enum para mostrar las constantes disponibles para
una enumeración. Luego, asigna un valor a una enumeración y muestra el valor.
C#
class TestEnums
{
static void Main()
{
System.Console.WriteLine("Possible color choices: ");

//Enum.GetNames returns a string array of named constants for the enum.


foreach(string s in System.Enum.GetNames(typeof(Color)))
{
System.Console.WriteLine(s);
}
Color favorite = Color.Blue;

System.Console.WriteLine("Favorite Color is {0}", favorite);


System.Console.WriteLine("Favorite Color value is {0}", (int) favorite);
}
}

Resultado
Possible color choices:
Green
Orange
Red
Blue
Favorite Color is Blue
Favorite Color value is 3

Cadenas
Los tipos de cadena en Java y C# denotan un comportamiento similar con leves diferencias. Ambos tipos de cadena son
inmutables, lo que significa que los valores de las cadenas no se pueden cambiar una vez que se han creado las cadenas. En
ambos casos, los métodos que parecen modificar el contenido real de una cadena crean en realidad una nueva cadena que se
devolverá como resultado, dejando la cadena original sin cambios. El proceso de comparación de los valores de cadena es
diferente en C# y Java. Para comparar los valores de cadena en Java, los desarrolladores deben llamar al método equals de un
tipo string, mientras que el operador == compara los tipos de referencia de forma predeterminada. En C#, los desarrolladores
pueden utilizar los operadores == o != para comparar directamente valores de cadena. Aunque una cadena es un tipo de
referencia en C#, los operadores == y != compararán, en forma predeterminada, los valores de las cadenas en lugar de las
referencias.
Como en Java, los desarrolladores de C# no deben usar el tipo string para concatenar cadenas con el fin de evitar la
sobrecarga de crear nuevas clases de cadenas cada vez que se concatene la cadena. En su lugar, los desarrolladores pueden
utilizar la clase StringBuilder, que es funcionalmente equivalente a la clase StringBuffer de Java.
Literales de cadena
C# proporciona la posibilidad de evitar el uso de secuencias de escape como "\t" para la ficha o "\" para los caracteres de barra
diagonal inversa dentro de las constantes de cadena. Para ello, simplemente declare la cadena textual mediante el símbolo @
para preceder la asignación del valor de cadena. Los siguientes ejemplos muestran cómo utilizar los caracteres de escape y
cómo asignar literales de cadena:
C#
static void Main()
{
//Using escaped characters:
string path1 = "\\\\FileShare\\Directory\\file.txt";
System.Console.WriteLine(path1);

//Using String Literals:


string path2 = @"\\FileShare\Directory\file.txt";
System.Console.WriteLine(path2);
}

Conversión y conversión de tipos


Java y C# siguen reglas similares para la conversión automática y la conversión de tipos de datos.
Al igual que Java, C# admite conversiones de tipo implícitas y explícitas. En el caso de conversiones de ampliación, las
conversiones son implícitas. Por ejemplo, la siguiente conversión de int a long es implícita, como en Java:
C#
int int1 = 5;
long long1 = int1; //implicit conversion

La siguiente es una lista de conversiones implícitas entre los tipos de datos de .NET Framework:
Tipo de origen Tipo de destino
Byte short, ushort, int, uint, long, ulong, float, double o decimal

Sbyte short, int, long, float, double o decimal

Int long, float, double o decimal

Uint long, ulong, float, double o decimal

Short int, long, float, double o decimal

Ushort int, uint, long, ulong, float, double o decimal

Long float, double o decimal

Ulong float, double o decimal

Float double

Char ushort, int, uint, long, ulong, float, double o decimal

Puede convertir el tipo de expresiones que desee convertir explícitamente usando la misma sintaxis que en Java:
C#
long long2 = 5483;
int int2 = (int)long2; //explicit conversion

La tabla siguiente muestra las conversiones explícitas.


Tipo de origen Tipo de destino
Byte sbyte o char

Sbyte byte, ushort, uint, ulong o char

Int sbyte, byte, short, ushort, uint, ulong o char

Uint sbyte, byte, short, ushort, int o char

Short sbyte, byte, ushort, uint, ulong o char

Ushort sbyte, byte, short o char

Long sbyte, byte, short, ushort, int, uint, ulong o char

Ulong sbyte, byte, short, ushort, int, uint, ulong o char

Float sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal

Double sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal

Char sbyte, byte o short

Decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double

Tipos de referencia y valor


C# admite dos tipos de variables:
Tipos de valor
Estos son los tipos de datos primitivos integrados, como char, int y float, así como también los tipos definidos por el
usuario declarados con la estructura.
Tipos de referencia
Clases y otros tipos de datos complejos que se construyen a partir de los tipos primitivos. Las variables de estos tipos no
contienen una instancia del tipo, sino sólo una referencia a una instancia.
Si se crean dos variables del tipo de valor, i y j, como se muestra a continuación, i y j son completamente independientes entre
sí:
C#
int i = 10;
int j = 20;

Tienen ubicaciones de memoria independiente:

Si cambia el valor de una de estas variables, la otra no se verá afectada de forma natural. Por ejemplo, si tiene una expresión
como la siguiente, aún no existe ninguna conexión entre las variables:
C#
int k = i;

Es decir, si cambia el valor de i, k permanecerá con el valor que tenía i en el momento de la asignación.
C#
i = 30;

System.Console.WriteLine(i.ToString()); // 30
System.Console.WriteLine(k.ToString()); // 10

Sin embargo, los tipos de referencia actúan de forma diferente. Por ejemplo, podría declarar dos variables de la siguiente
forma:
C#
Employee ee1 = new Employee();
Employee ee2 = ee1;

Ahora, puesto que las clases son tipos de referencia de C#, ee1 se conoce como referencia a Employee. La primera de las dos
líneas anteriores crea una instancia de Employee en memoria y define ee1 para que haga referencia a ella. Así, cuando se
establece ee2 para que sea igual a ee1, el primero contiene un duplicado de la referencia a la clase de la memoria. Si ahora
cambia las propiedades de ee2, las propiedades de ee1 reflejan estos cambios, ya que ambas apuntan al mismo objeto de la
memoria, tal como aparece a continuación:

Conversiones boxing y unboxing


El proceso de convertir el tipo de un valor en el tipo de una referencia se denomina conversión boxing. El proceso inverso,
convertir el tipo de una referencia en el tipo de un valor, se denomina conversión unboxing. Esto queda reflejado en el ejemplo
de código siguiente:
C#
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing

Java requiere que esas conversiones se realicen manualmente. Los tipos de datos primitivos se pueden convertir en objetos de
clases contenedoras construyendo esos objetos o aplicando la conversión boxing. De igual manera, los valores de los tipos de
datos primitivos se pueden extraer de los objetos de las clases contenedoras llamando a un método adecuado de estos
objetos, o realizar una conversión unboxing. Para obtener más información acerca de las conversiones boxing y unboxing, vea
Conversión boxing (Guía de programación de C#) o Conversión unboxing (Guía de programación de C#).
Vea también
Referencia
Tipos de datos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Visual C#
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Operadores (C# y Java)


C# ofrece todos los operadores compatibles con Java aplicables, como se muestra en la tabla siguiente. Al final de la tabla, verá
algunos operadores nuevos disponibles en C#, pero no en Java:
Categoría Símbolo
Unario ++ -- + - ! ~ ()

Multiplicativo */%

Sumatorio +-

Desplazamiento << >>

Relacionales < > <= >= instanceof

Igualdad == !=

AND lógico &

XOR lógico ^

OR lógico |

AND condicional &&

OR condicional ||

Condicional ?:

Asignación = *= /= %= += -= <<= >>= &= ^= |=

Tipo de operando typeof

Tamaño del operando sizeof

Exigir comprobación de desbordamiento checked

Suprimir comprobación de desbordamiento unchecked

El único operador de Java no disponible en C# es el operador de desplazamiento (>>>). Este operador está presente en Java
debido a la ausencia de variables sin signo en ese lenguaje, para los casos en que se requiere el desplazamiento a la derecha
para insertar un uno (1) en los bits más significativos.
C# admite variables sin signo y, por consiguiente, sólo necesita el operador >> estándar. Este operador genera resultados
diferentes, lo que depende de si el operando está con o sin signo. Desplazar a la derecha un número sin signo inserta un 0 en
el bit más significativo, mientras que desplazar a la derecha un número con signo copia el bit más significativo anterior.
Operadores Checked y Unchecked
Las operaciones aritméticas producirán desbordamiento si el resultado es demasiado grande para el número de bits asignados
al tipo de datos en uso. Ese desbordamiento se puede comprobar u omitir en una operación aritmética integral dada con las
palabras clave checked y unchecked. Si se trata de una expresión constante que utiliza checked, se genera un error en
tiempo de compilación.
El siguiente es un ejemplo simple que muestra el uso de estos operadores:
C#
class TestCheckedAndUnchecked
{
static void Main()
{
short a = 10000;
short b = 10000;

short c = (short)(a * b); // unchecked by default


short d = unchecked((short)(10000 * 10000)); // unchecked
short e = checked((short)(a * b)); // checked - run-time error

System.Console.WriteLine(10000 * 10000); // 100000000


System.Console.WriteLine(c); // -7936
System.Console.WriteLine(d); // -7936
System.Console.WriteLine(e); // no result
}
}

En este código, el operador unchecked evita el error en tiempo de compilación que, de lo contrario, se produciría por la
instrucción siguiente:
C#
short d = unchecked((short)(10000 * 10000)); // unchecked

La siguiente expresión utiliza el operador unchecked de manera predeterminada, por lo que el valor produce un
desbordamiento pero no lo comunica:
C#
short c = (short)(a * b); // unchecked by default

Con el operador checked, se puede exigir que se compruebe el desbordamiento de la expresión en tiempo de ejecución:
C#
short e = checked((short)(a * b)); // checked - run-time error

Al asignar los primeros dos valores a d y c se produce un desbordamiento, que no se comunica, con un valor de -7936 cuando
se ejecuta el programa, pero al intentar multiplicar el valor por e con checked(), el programa producirá una excepción
OverflowException.
Nota
También puede controlar si desea comprobar el desbordamiento aritmético en un bloque de código con el modificador de c
ompiladores de línea de comandos (/checked) o directamente en Visual Studio por cada proyecto.

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Control de flujo (C# y Java)


Las instrucciones de control de flujo, como if else y switch, son muy similares en Java y C#.
Instrucciones de bifurcación
Las instrucciones de bifurcación cambian el flujo de la ejecución del programa en tiempo de ejecución según ciertas
condiciones.
if, else y else if
Estas instrucciones son idénticas en ambos lenguajes.
La instrucción switch
En ambos lenguajes, la instrucción switch proporciona múltiples operaciones de bifurcación condicionales. Sin embargo, existe
una diferencia en cuanto a que Java permite "pasar explícitamente" un caso y ejecutar el siguiente, a menos que se utilice una
instrucción break al final del caso. En cambio, C# exige el uso de una instrucción break o goto al final de cada caso y, si no hay
ninguna presente, el compilador produce el siguiente error:
El control no puede pasar explícitamente de una etiqueta de caso a otra.
Se debe tener en cuenta que donde un caso no especifica un código para ejecutar cuando coincide ese caso, el control pasará
al caso siguiente. Al utilizar goto en una instrucción switch, sólo se puede saltar a otro bloque de casos en el mismo
modificador. Si desea saltar al caso predeterminado, debe utilizar goto default. De lo contrario, utilice goto case cond,
donde cond es la condición que coincide con el caso al que desee saltar. Otra diferencia con la instrucción switch de Java es
que, en Java, sólo se pueden realizar cambios en tipos enteros, mientras que C# permite realizar cambios en una variable de
cadena.
Por ejemplo, lo siguiente sería válido en C#, pero no en Java:
C#
static void Main(string[] args)
{
switch (args[0])
{
case "copy":
//...
break;

case "move":
//...
goto case "delete";
case "del":
case "remove":
case "delete":
//...
break;

default:
//...
break;
}
}

El valor que devuelve goto


En Java, goto es una palabra clave reservada que no se implementa. Sin embargo, puede utilizar instrucciones con etiquetas
break o continue para lograr un propósito similar a goto.
C# permite a la instrucción goto saltar a una instrucción con etiquetas. Sin embargo, se debe considerar que para saltar a una
etiqueta determinada, la instrucción goto debe estar dentro del ámbito de la etiqueta. Es decir, goto no se puede utilizar para
saltar a un bloque de instrucciones, aunque se puede saltar desde uno, para saltar desde una clase o para salir del bloque
finally en instrucciones try...catch. No se recomienda el uso de goto en la mayoría de los casos, ya que contradice las buenas
prácticas de la programación orientada a objetos.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Visual C#
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Instrucciones de bucle (C# y Java)


Las instrucciones de bucle repiten un bloque de código especificado hasta que se cumpla una condición determinada.
Bucles for
La sintaxis y el funcionamiento de los bucles for son iguales en C# y Java:
C#
for (int i = 0; i<=9; i++)
{
System.Console.WriteLine(i);
}

Bucles foreach
C# introduce un nuevo tipo de bucle denominado bucle foreach, que es similar a For Each de Visual Basic. El bucle foreach
permite la iteración a través de cada elemento en una clase contenedora, como una matriz, que admite la interfaz IEnumerable.
El código siguiente muestra el uso de la instrucción foreach para obtener el contenido de una matriz:
C#
static void Main()
{
string[] arr= new string[] {"Jan", "Feb", "Mar"};

foreach (string s in arr)


{
System.Console.WriteLine(s);
}
}

Para obtener más información, vea Matrices (C# y Java).


Bucles while y do...while
La sintaxis y el funcionamiento de las instrucciones while y do...while son iguales en ambos lenguajes:
C#
while (condition)
{
// statements
}

C#
do
{
// statements
}
while(condition); // Don't forget the trailing ; in do...while loops

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Fundamentos de las clases (C# y Java)


En las secciones siguientes se comparan los modificadores de C# y Java.
Modificadores de acceso
Los modificadores de C# son bastante similares a los de Java, con varias diferencias pequeñas. Cada miembro de una clase, o
la propia clase, se puede declarar con un modificador de acceso para definir el ámbito de acceso permitido. Las clases no
declaradas dentro de otras clases sólo pueden especificar los modificadores públicos o internos. Las clases anidadas, como
otros miembros de clase, pueden especificar cualquiera de los cinco modificadores de acceso siguientes:
public
Visible para todos.
protected
Visible sólo desde clases derivadas.
private
Visible sólo dentro de la clase dada.
internal
Visible sólo dentro del mismo ensamblado.
protected internal
Visible sólo para el ensamblado actual o los tipos derivados de la clase contenedora.
Modificadores public, protected y private
Un modificador public permite que el miembro esté disponible en cualquier parte, tanto dentro como fuera de la clase. Un
modificador protected indica que el acceso está limitado al interior de la clase contenedora o las clases derivadas de ésta. Un
modificador private implica que el acceso sólo es posible desde dentro del tipo contenedor. En C#, el modificador de acceso
predeterminado es privado, mientras que en Java el acceso se establece como predeterminado en cualquier parte desde
dentro del paquete contenedor.
Modificador internal
A un elemento internal sólo se puede tener acceso desde dentro del ensamblado actual. Un ensamblado de .NET Framework
es casi equivalente a un archivo JAR de Java; representa las unidades de creación a partir de las cuales se pueden crear otros
programas.
Modificador protected internal
Un elemento protected internal está visible sólo para el ensamblado actual o los tipos derivados de la clase contenedora.
Modificador sealed
Una clase con el modificador sealed en la declaración de clase es lo opuesto a una clase abstracta: no se puede heredar. Puede
marcar una clase como sealed para evitar que otras clases reemplacen su funcionalidad. Naturalmente, una clase con el
modificador sealed no puede ser abstracta. Observe también que a una estructura se le aplica implícitamente el modificador
sealed; por consiguiente, no se puede heredar. El modificador sealed es equivalente a marcar una clase con la palabra clave
final en Java.
Modificador readonly
Para definir una constante en C#, utilice el modificador const o readonly en lugar de la palabra clave final de Java. El factor
distintivo entre los dos modificadores de C# es que los elementos const se tratan en tiempo de compilación, mientras que
valores de los campos readonly se especifican en tiempo de ejecución. Esto significa que la asignación a los campos readonly
se puede producir tanto en el constructor de clase como en la declaración. Por ejemplo, la clase siguiente declara una variable
readonly denominada IntegerVariable que se inicializa en el constructor de clase:
C#
public class SampleClass
{
private readonly int intConstant;
public SampleClass () //constructor
{
// You are allowed to set the value of the readonly variable
// inside the constructor
intConstant = 5;
}

public int IntegerConstant


{
set
{
// You are not allowed to set the value of the readonly variable
// anywhere else but inside the constructor

// intConstant = value; // compile-time error


}
get
{
return intConstant;
}
}
}
class TestSampleClass
{
static void Main()
{
SampleClass obj= new SampleClass();

// You cannot perform this operation on a readonly field.


obj.IntegerConstant = 100;

System.Console.WriteLine("intConstant is {0}", obj.IntegerConstant); // 5


}
}

Si se aplica un modificador readonly a un campo estático, se debe inicializar en el constructor estático de la clase.
Vea también
Referencia
Modificadores de acceso (Guía de programación de C#)
Constantes (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Main () y otros métodos (C# y Java)


En esta sección se analizan algunos métodos y la forma en que los parámetros del método se pasan por referencia y por valor.
El método Main ()
Cada aplicación de C# debe contener un método Main único, que especifique dónde debe comenzar la ejecución del
programa. En C#, Main se pone en mayúsculas, mientras que Java utiliza main en minúscula.
Main puede devolver sólo int o void y tiene un argumento de matriz de cadena opcional para representar parámetros de
línea de comandos:
C#
static int Main(string[] args)
{
//...
return 0;
}

El parámetro de matriz de cadena, que contiene todos los argumentos de la línea de comandos pasados, funciona igual que en
Java. Así, args[0] especifica el primer parámetro de línea de comandos, args[1] denota el segundo parámetro, etc. A
diferencia de C++, la matriz args no contiene el nombre del archivo EXE.
Otros métodos
Cuando se pasan parámetros a un método, se pueden pasar por valor o por referencia. Los parámetros de valor simplemente
toman el valor de cualquier variable para utilizarlo en el método. Por lo tanto, el valor de variable en el código de llamada no
se ve afectado por las acciones realizadas en los parámetros de un método.
Sin embargo, los parámetros de referencia apuntan a una variable declarada en el código de llamada; por lo tanto, los métodos
modificarán el contenido de esa variable cuando se pase por referencia.
Pasar por referencia
En Java y C#, los parámetros de método que hacen referencia a un objeto siempre se pasan por referencia, mientras que los
parámetros de tipo de datos primitivos se pasan por valor.
En C#, todos los parámetros se pasan por valor de manera predeterminada. Para pasarlos por referencia, se necesita
especificar una de las palabras clave ref u out. La diferencia entre estas dos palabras clave radica en la inicialización de los
parámetros. Un parámetro ref se debe inicializar antes de su utilización, mientras que un parámetro out no debe inicializarse
explícitamente sin que antes se haya pasado por referencia y se haya omitido cualquier valor anterior.
La palabra clave ref
Especifique esta palabra clave en un parámetro cuando desee que el método llamado cambie permanentemente el valor de las
variables utilizadas como parámetros. De esta manera, en lugar de pasar el valor de una variable utilizada en la llamada, se
pasa una referencia a la propia variable. Entonces el método funciona en la referencia, de modo que los cambios realizados al
parámetro durante la ejecución del método se conservan en la variable original utilizada como parámetro para el método.
El código siguiente muestra un ejemplo de esto en el método Add, donde el segundo parámetro int se pasa por referencia con
la palabra clave ref:
C#
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}

static void Main()


{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);

Add(10, ref total);


System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}

El resultado de este sencillo ejemplo demuestra que los cambios realizados al parámetro resultante se reflejan en la variable
total, utilizada en la llamada al método Add :
Original value of 'total': 20
Value after calling Add(): 30

Esto se debe a que el parámetro resultante hace referencia a la ubicación de memoria real que ocupa la variable total en el
código de llamada. Una propiedad de una clase no es una variable; por lo tanto, no se puede utilizar directamente como
parámetro ref.
La palabra clave ref debe preceder al parámetro cuando se llama al método, al igual que en la declaración de método.
La palabra clave out
La palabra clave out tiene un efecto muy similar a la palabra clave ref. Las modificaciones realizadas a un parámetro declarado
que utiliza out serán visibles fuera del método. Las dos diferencias con respecto a ref son que todo valor inicial de un
parámetro out se omite dentro del método y que un parámetro out se debe asignar durante la ejecución del método:
C#
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}

static void Main()


{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}

En este caso, el tercer parámetro para el método Add se declara con la palabra clave out y las llamadas al método también
necesitan la palabra clave out para ese parámetro. El resultado será:
Original value of 'total': 20
Value after calling Add(): 110

Por lo tanto, en resumen, utilice la palabra clave ref cuando desee que un método modifique una variable existente y utilice la
palabra clave out, para devolver un valor generado dentro del método. Generalmente, esto se utiliza junto con el valor que el
método devuelve cuando éste genera más de un valor resultante para el código de llamada.
Vea también
Referencia
Main() y argumentos de línea de comandos (Guía de programación de C#)
Pasar parámetros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Utilizar un número indeterminado de parámetros (C# y Java)


C# permite enviar a un método un número variable de parámetros mediante la especificación de la palabra clave params
cuando se declara el método. La lista de argumentos también puede contener parámetros normales, pero se debe tener en
cuenta que el parámetro declarado con la palabra clave params debe ir en último lugar. Toma la forma de una matriz de
longitud variable y sólo puede haber un parámetro params por cada método.
Cuando el compilador intenta resolver una llamada al método, busca un método cuya lista de argumentos coincida con el
método llamado. Si no se puede encontrar una sobrecarga de métodos que coincida con la lista de argumentos, pero hay una
versión que coincide con un parámetro params del tipo apropiado, se llamará a ese método y los argumentos adicionales se
colocarán en una matriz.
En el ejemplo siguiente se ilustra esta idea:
C#
class TestParams
{
private static void Average(string title, params int[] values)
{
int sum = 0;
System.Console.Write("Average of {0} (", title);

for (int i = 0; i < values.Length; i++)


{
sum += values[i];
System.Console.Write(values[i] + ", ");
}
System.Console.WriteLine("): {0}", (float)sum/values.Length);
}
static void Main()
{
Average ("List One", 5, 10, 15);
Average ("List Two", 5, 10, 15, 20, 25, 30);
}
}

En el ejemplo anterior, el método Average se declara con un parámetro params de matriz de tipo integer, lo que permite
llamarlo con cualquier número de argumentos. El resultado se muestra a continuación:
Average of List One (5, 10, 15, ): 10
Average of List Two (5, 10, 15, 20, 25, 30, ): 17.5

Se puede especificar un parámetro params de tipo Object si se desea permitir parámetros indeterminados de diferentes tipos.
Vea también
Referencia
Pasar matrices como parámetros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Propiedades (C# y Java)


En C#, una propiedad es un miembro con nombre de una clase, estructura o interfaz que ofrece una forma ordenada de tener
acceso a campos privados mediante lo que se denomina métodos de descriptor de acceso get y set.
En el ejemplo de código siguiente declara una propiedad denominada Species para la clase Animal, que resume el acceso a la
variable privada denominada name:
C#
public class Animal
{
private string name;

public string Species


{
get
{
return name;
}
set
{
name = value;
}
}
}

A menudo, la propiedad tendrá el mismo nombre que el miembro interno al que tiene acceso, pero con una letra mayúscula
inicial, por ejemplo, Name en el caso anterior o el miembro interno tendrá un prefijo _. Observe también el parámetro implícito
denominado value que se utiliza en el descriptor de acceso set; éste tiene el tipo de la variable miembro subyacente.
De hecho, los descriptores de acceso se representan en forma interna como métodos get_X() y set_X() para mantener la
compatibilidad con los lenguajes basados en .NET Framework, que no admiten descriptores de acceso. Una vez que una
propiedad está definida, es muy fácil obtener o establecer su valor:
C#
class TestAnimal
{
static void Main()
{
Animal animal = new Animal();
animal.Species = "Lion"; // set accessor
System.Console.WriteLine(animal.Species); // get accessor

}
}

Si una propiedad sólo tiene un descriptor de acceso get, es una propiedad de sólo lectura. Si sólo tiene un descriptor de acceso
set, es una propiedad de sólo escritura. Si tiene ambos, es una propiedad de lectura y escritura.
Vea también
Referencia
Propiedades (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Structs (C# y Java)


C# admite la palabra clave struct, que es otro elemento que se origina en C pero no está disponible en Java. struct se puede
considerar como una clase ligera. Aunque las structs pueden contener constructores, constantes, campos, métodos,
propiedades, indizadores, operadores y tipos anidados, se utilizan principalmente para encapsular grupos de campos
relacionados. Dado que las estructuras son tipos de valor, se pueden asignar de un modo ligeramente más eficaz que las
clases. Las structs difieren de las clases en que no pueden ser abstractas y no admiten la herencia de implementaciones.
En el ejemplo siguiente, se inicializa struct con la palabra clave new, se llama al constructor predeterminado sin parámetros y,
a continuación, se establecen los miembros de la instancia.
C#
public struct Customer
{
public int ID;
public string Name;

public Customer(int customerID, string customerName)


{
ID = customerID;
Name = customerName;
}
}

class TestCustomer
{
static void Main()
{
Customer c1 = new Customer(); //using the default constructor

System.Console.WriteLine("Struct values before initialization:");


System.Console.WriteLine("ID = {0}, Name = {1}", c1.ID, c1.Name);
System.Console.WriteLine();

c1.ID = 100;
c1.Name = "Robert";

System.Console.WriteLine("Struct values after initialization:");


System.Console.WriteLine("ID = {0}, Name = {1}", c1.ID, c1.Name);
}
}

Resultado
Cuando se compila y ejecuta el código anterior, el resultado muestra que las variables struct se inicializan de manera
predeterminada. La variable int se inicializa en 0 y la variable string se inicializa en una cadena vacía:
Struct values before initialization:
ID = 0, Name =
Struct values after initialization:
ID = 100, Name = Robert

Vea también
Tareas
Ejemplo Structs
Conceptos
Guía de programación de C#
Estructuras (Guía de programación de C#)
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Matrices (C# y Java)


Las matrices son colecciones ordenadas de elementos del mismo tipo de datos a los que se tiene acceso utilizando el nombre
de la matriz junto con el desplazamiento del elemento deseado desde el inicio de la matriz. Hay algunas diferencias
importantes entre C# y Java en lo referente a cómo se declaran y utilizan las matrices.
Matriz unidimensional
Una matriz unidimensional almacena un número fijo de elementos en modo lineal, lo que requiere sólo un valor de índice
único para identificar cualquier elemento. En C#, los corchetes de la declaración de matriz deben seguir al tipo de datos y no se
pueden colocar después del nombre de variable, como se permite en Java. Así, una matriz de tipo integers se declara
mediante la siguiente sintaxis:
C#
int[] arr1;

La siguiente declaración no es válida en C#:


C#
//int arr2[]; //compile error

Una vez que se declara una matriz, se utiliza la palabra clave new para establecer su tamaño, como en Java. En el ejemplo
siguiente se declara la referencia de la matriz:
C#
int[] arr;
arr = new int[5]; // create a 5 element integer array

A continuación, se tiene acceso a los elementos de una matriz unidimensional mediante una sintaxis idéntica a la de Java. Los
índices de matriz de C# también se basan en cero. La sintaxis siguiente obtiene acceso al último elemento de la matriz anterior:
C#
System.Console.WriteLine(arr[4]); // access the 5th element

Inicialización
Los elementos de la matriz de C# se pueden inicializar en el momento de su creación mediante la misma sintaxis que Java:
C#
int[] arr2Lines;
arr2Lines = new int[5] {1, 2, 3, 4, 5};

A diferencia de Java, el número de inicializadores de C# debe coincidir exactamente con el tamaño de la matriz. Puede utilizar
esta función para declarar e inicializar una matriz de C# en una sola línea:
C#
int[] arr1Line = {1, 2, 3, 4, 5};

Esta sintaxis crea una matriz de tamaño igual al número de inicializadores.


Inicializar en un bucle del programa
La otra manera de inicializar una matriz en C# es utilizar el bucle for. El siguiente bucle establece cada elemento de una matriz
en cero:
C#
int[] TaxRates = new int[5];

for (int i=0; i<TaxRates.Length; i++)


{
TaxRates[i] = 0;
}

Matrices escalonadas
Tanto C# como Java admiten la creación de matrices escalonadas o no rectangulares, en las que cada fila contiene un número
diferente de columnas. Por ejemplo, la siguiente matriz escalonada tiene cuatro entradas en la primera fila y tres en la segunda:
C#
int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[4];
jaggedArray[1] = new int[3];

Matrices multidimensionales
Con C#, se pueden crear matrices multidimensionales normales que son como una matriz de valores del mismo tipo. Mientras
Java y C# admiten matrices escalonadas, C# también admite matrices multidimensionales o matrices de matrices.
Declare una matriz rectangular multidimensional mediante la siguiente sintaxis:
C#
int[,] arr2D; // declare the array reference
float[,,,] arr4D; // declare the array reference

Una vez declarada, asigne memoria a la matriz del modo siguiente:


C#
arr2D = new int[5,4]; // allocate space for 5 x 4 integers

A continuación, se tiene acceso a los elementos de la matriz con la sintaxis siguiente:


C#
arr2D[4,3] = 906;

Dado que las matrices se basan en cero, esta línea establece el elemento de la quinta columna de la cuarta fila en 906.
Inicialización
Se pueden crear, configurar e inicializar matrices multidimensionales en una instrucción única a través de uno de los métodos
siguientes:
C#
int[,] arr4 = new int [2,3] { {1,2,3}, {4,5,6} };
int[,] arr5 = new int [,] { {1,2,3}, {4,5,6} };
int[,] arr6 = { {1,2,3}, {4,5,6} };

Inicializar en un bucle del programa


Todos los elementos de una matriz se pueden inicializar con un bucle anidado, tal como se muestra aquí:
C#
int[,] arr7 = new int[5,4];

for(int i=0; i<5; i++)


{
for(int j=0; i<4; j++)
{
arr7[i,j] = 0; // initialize each element to zero
}
}

La clase System.Array
En .NET Framework, las matrices se implementan como instancias de la clase Array. Esta clase proporciona varios métodos
útiles, como Sort y Reverse.
En el ejemplo siguiente se muestra lo fácil que es trabajar con estos métodos. En primer lugar, se invierten los elementos de
una matriz mediante el método Reverse y, a continuación, se ordenan con el método Sort:
C#
class ArrayMethods
{
static void Main()
{
// Create a string array of size 5:
string[] employeeNames = new string[5];
// Read 5 employee names from user:
System.Console.WriteLine("Enter five employee names:");
for(int i=0; i<employeeNames.Length; i++)
{
employeeNames[i]= System.Console.ReadLine();
}
// Print the array in original order:
System.Console.WriteLine("\nArray in Original Order:");
foreach(string employeeName in employeeNames)
{
System.Console.Write("{0} ", employeeName);
}

// Reverse the array:


System.Array.Reverse(employeeNames);

// Print the array in reverse order:


System.Console.WriteLine("\n\nArray in Reverse Order:");
foreach(string employeeName in employeeNames)
{
System.Console.Write("{0} ", employeeName);
}

// Sort the array:


System.Array.Sort(employeeNames);

// Print the array in sorted order:


System.Console.WriteLine("\n\nArray in Sorted Order:");
foreach(string employeeName in employeeNames)
{
System.Console.Write("{0} ", employeeName);
}
}
}
Resultados
Enter five employee names:
Luca
Angie
Brian
Kent
Beatriz
Array in Original Order:
Luca Angie Brian Kent Beatriz
Array in Reverse Order:
Beatriz Kent Brian Angie Luca
Array in Sorted Order:
Angie Beatriz Brian Kent Luca

Vea también
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Herencia y clases derivadas (C# y Java)


La funcionalidad de una clase existente se puede extender al crear una nueva clase que se deriva de ella. La clase derivada
hereda las propiedades de la clase base y es posible agregar o reemplazar métodos y propiedades según sea necesario.
En C#, el operador :, que equivale a extends e implements en Java, define la herencia e implementación de interfaces. La
clase base siempre debe estar en el extremo izquierdo en la declaración de clase.
Como Java, C# no admite herencia múltiple, lo que significa que las clases no pueden heredar más de una clase. Sin embargo,
se pueden utilizar interfaces para ese propósito, de la misma manera que en Java.
El código siguiente define una clase denominada CoOrds con dos variables miembro privadas x e y que representan la posición
del punto. Se tiene acceso a estas variables mediante propiedades denominadas X e Y, respectivamente:
C#
public class CoOrds
{
private int x, y;

public CoOrds() // constructor


{
x = 0;
y = 0;
}

public int X
{
get { return x; }
set { x = value; }
}

public int Y
{
get { return y; }
set { y = value; }
}
}

Una nueva clase, denominada ColorCoOrds, se deriva de la clase CoOrds del siguiente modo:
C#
public class ColorCoOrds : CoOrds

Luego, ColorCoOrds hereda todos los campos y métodos de la clase base, a la cual se pueden agregar nuevos campos y
métodos para proporcionar características adicionales en la clase derivada, según sea necesario. En este ejemplo, se agrega un
miembro privado y descriptores de acceso para agregar color a la clase:
C#
public class ColorCoOrds : CoOrds
{
private System.Drawing.Color screenColor;

public ColorCoOrds() // constructor


{
screenColor = System.Drawing.Color.Red;
}

public System.Drawing.Color ScreenColor


{
get { return screenColor; }
set { screenColor = value; }
}
}

El constructor de la clase derivada llama implícitamente al constructor de la clase base o la superclase, en terminología de Java.
En caso de herencia, se llama a todos los constructores de clase base antes que a los constructores de la clase derivada en el
orden en que las clases aparecen en la jerarquía de clases.
Convertir un tipo a una clase base
Como en Java, no se puede utilizar una referencia a una clase base para tener acceso a los miembros y métodos de una clase
derivada, aunque la referencia de la clase base pueda contener una referencia válida a un objeto del tipo derivado.
Implícitamente, se puede hacer referencia a una clase derivada con una referencia al tipo derivado:
C#
ColorCoOrds color1 = new ColorCoOrds();
CoOrds coords1 = color1;

En este código, la referencia de clase base, coords1, contiene una copia de la referencia color1.
La palabra clave base
Se puede tener acceso a los miembros de clase base en una subclase incluso cuando los miembros de base se reemplazan en
la superclase utilizando la palabra clave base. Por ejemplo, puede crear una clase derivada que contenga un método con la
misma firma que la clase base. Si se precede ese método con la palabra clave new, se indica que se trata de un método
totalmente nuevo que pertenece a la clase derivada. También se podría proporcionar un método para tener acceso al método
original de la clase base con la palabra clave base.
Por ejemplo, supongamos que la clase base CoOrds tuviera un método denominado Invert() que intercambia las
coordenadas x e y. Se podría proporcionar un sustituto para este método en la clase derivada ColorCoOrds con un código
como éste:
C#
public new void Invert()
{
int temp = X;
X = Y;
Y = temp;
screenColor = System.Drawing.Color.Gray;
}

Como se puede observar, este método intercambia x e y, luego establece el color del punto en gris. Se podría proporcionar
acceso a la implementación base para este método creando otro método en ColorCoOrds, como el de este ejemplo:
C#
public void BaseInvert()
{
base.Invert();
}

A continuación, se invoca el método base en un objeto ColorCoOrds mediante una llamada al método BaseInvert().
C#
ColorCoOrds color1 = new ColorCoOrds();
color1.BaseInvert();

Recuerde que se obtendría el mismo efecto si se asignara una referencia de la clase base a una instancia de ColorCoOrds y, a
continuación, se tuviera acceso a sus métodos:
C#
CoOrds coords1 = color1;
coords1.Invert();

Seleccionar los constructores


Los objetos de clase base siempre se construyen antes que cualquier clase derivada. De esta forma, el constructor de la clase
base se ejecuta antes que el constructor de la clase derivada. Si la clase base tiene más de un constructor, la clase derivada
puede decidir a qué constructor se va a llamar. Por ejemplo, podría modificar la clase CoOrds para agregar un segundo
constructor, del siguiente modo:
C#
public class CoOrds
{
private int x, y;

public CoOrds()
{
x = 0;
y = 0;
}

public CoOrds(int x, int y)


{
this.x = x;
this.y = y;
}
}

Luego, podría cambiar la clase ColorCoOrds para utilizar uno de los constructores disponibles mediante la palabra clave base:
C#
public class ColorCoOrds : CoOrds
{
public System.Drawing.Color color;
public ColorCoOrds() : base ()
{
color = System.Drawing.Color.Red;
}

public ColorCoOrds(int x, int y) : base (x, y)


{
color = System.Drawing.Color.Red;
}
}

En Java, esta funcionalidad se implementa con la palabra clave super.


Reemplazar el método
Una clase derivada puede reemplazar el método de una clase base si se proporciona una nueva implementación del método
declarado. Una diferencia importante entre Java y C# es que, de forma predeterminada, los métodos de Java se marcan como
virtuales, mientras que en C# los métodos se deben marcar explícitamente como virtuales con el modificador virtual. Los
descriptores de acceso de propiedades, así como los métodos, se pueden reemplazar de manera muy similar.
Métodos virtuales
Un método que será reemplazado en una clase derivada se declara con el modificador virtual. En una clase derivada, el
método reemplazado se declara con el modificador override.
El modificador override denota un método o propiedad de una clase derivada que reemplaza un método o propiedad con el
mismo nombre y firma en la clase base. El método base, que será reemplazado, se debe declarar como virtual, abstract u
override: no es posible reemplazar un método no virtual o estático de esta forma. El método o la propiedad reemplazados y
aquellos que se reemplazan deben tener los mismos modificadores de nivel de acceso.
El ejemplo siguiente muestra un método virtual denominado StepUp que es reemplazado en una clase derivada con el
modificador que lo reemplaza:
C#
public class CountClass
{
public int count;

public CountClass(int startValue) // constructor


{
count = startValue;
}

public virtual int StepUp()


{
return ++count;
}
}

class Count100Class : CountClass


{
public Count100Class(int x) : base(x) // constructor
{
}

public override int StepUp()


{
return ((base.count) + 100);
}
}

class TestCounters
{
static void Main()
{
CountClass counter1 = new CountClass(1);
CountClass counter100 = new Count100Class(1);

System.Console.WriteLine("Count in base class = {0}", counter1.StepUp());


System.Console.WriteLine("Count in derived class = {0}", counter100.StepUp());
}
}

Cuando se ejecuta este código, se observa que el constructor de la clase derivada utiliza el cuerpo del método proporcionado
en la clase base, lo que permite inicializar el recuento de miembros sin duplicar el código. Éste es el resultado:
Count in base class = 2
Count in derived class = 101

Clases abstractas
Una clase abstracta declara uno o más métodos o propiedades como abstractos. La clase que declara dichos métodos no les
proporciona una implementación, aunque una clase abstracta también puede contener métodos no abstractos, es decir,
métodos para los que se ha proporcionado una implementación. No se puede crear directamente una instancia de una clase
abstracta; sólo se puede crear una instancia de una clase derivada. Estas clases derivadas deben proporcionar
implementaciones para todos los métodos y propiedades abstractos, mediante la palabra clave override, a menos que el
miembro derivado se declare abstracto.
El ejemplo siguiente declara una clase abstracta Employee. También se crea una clase derivada denominada Manager, que
proporciona una implementación del método abstracto Show() definido en la clase Employee:
C#
public abstract class Employee
{
protected string name;

public Employee(string name) // constructor


{
this.name = name;
}
public abstract void Show(); // abstract show method
}

public class Manager: Employee


{
public Manager(string name) : base(name) {} // constructor

public override void Show() //override the abstract show method


{
System.Console.WriteLine("Name : " + name);
}
}

class TestEmployeeAndManager
{
static void Main()
{
// Create an instance of Manager and assign it to a Manager reference:
Manager m1 = new Manager("H. Ackerman");
m1.Show();

// Create an instance of Manager and assign it to an Employee reference:


Employee ee1 = new Manager("M. Knott");
ee1.Show(); //call the show method of the Manager class
}
}

Este código invoca la implementación del método Show() proporcionado por la clase Manager e imprime el nombre del
empleado en pantalla. Éste es el resultado:
Name : H. Ackerman
Name : M. Knott

Interfaces
Una interfaz es un tipo de clase esqueleto que contiene firmas de método pero no incluye ninguna implementación de método.
De esta manera, las interfaces son como clases abstractas que contienen sólo métodos abstractos. Las interfaces de C# son
muy similares a las de Java y funcionan de manera muy similar.
Todos los miembros de una interfaz son públicos por definición y una interfaz no puede contener constantes, campos
(miembros de datos privados), constructores, destructores ni ningún tipo de miembro estático. El compilador generará un
error si se especifica un modificador para los miembros de una interfaz.
Las clases se pueden derivar de una interfaz para implementar esa interfaz. Estas clases derivadas deben proporcionar
implementaciones para todos los métodos de la interfaz, a menos que la clase derivada se declare abstracta.
Una interfaz se declara de forma idéntica en Java. En una definición de interfaz, una propiedad indica sólo su tipo y si es de
sólo lectura, sólo escritura o de lectura y escritura únicamente por medio de las palabras clave get y set. La interfaz siguiente
declara una propiedad de sólo lectura:
C#
public interface ICDPlayer
{
void Play(); // method signature
void Stop(); // method signature

int FastForward(float numberOfSeconds);

int CurrentTrack // read-only property


{
get;
}
}

Una clase se puede heredar de esta interfaz utilizando dos puntos, en lugar de la palabra clave implements de Java. La clase
que se implementa debe proporcionar definiciones para todos los métodos y cualquier descriptor de acceso de la propiedad
necesario, del siguiente modo:
C#
public class CDPlayer : ICDPlayer
{
private int currentTrack = 0;

// implement methods defined in the interface


public void Play()
{
// code to start CD...
}

public void Stop()


{
// code to stop CD...
}

public int FastForward(float numberOfSeconds)


{
// code to fast forward CD using numberOfSeconds...
return 0; //return success code
}

public int CurrentTrack // read-only property


{
get
{
return currentTrack;
}
}

// Add additional methods if required...


}

Implementar múltiples interfaces


Una clase puede implementar múltiples interfaces mediante la sintaxis siguiente:
C#
public class CDAndDVDComboPlayer : ICDPlayer, IDVDPlayer

Si una clase implementa más de una interfaz donde hay ambigüedad en los nombres de los miembros, se resuelve utilizando
el calificador completo del nombre de la propiedad o método. Es decir, la clase derivada puede resolver el conflicto si se utiliza
el nombre completo del método para indicar a qué interfaz pertenece, como en ICDPlayer.Play().
Vea también
Referencia
Herencia (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Eventos (C# y Java)


Un evento constituye un método para que una clase notifique a los usuarios de un objeto que algo interesante sucede al
objeto, como, por ejemplo, que se ha hecho clic en un control de una interfaz gráfica de usuario. Esta notificación se denomina
provocar un evento. Un objeto que produce un evento se conoce como origen o remitente del evento.
A diferencia del control de eventos en Java, que se realiza mediante la implementación de clases de agente de escucha
personalizadas, los programadores de C# pueden utilizar delegados para el control de eventos. Un delegado es un tipo que
hace referencia a un método. Cuando se asigna un método a un delegado, éste se comporta exactamente como el método. Es
similar a un puntero a función de C++, pero posee seguridad de tipos.
El método delegado se puede utilizar como cualquier otro método, con parámetros y un valor devuelto, como en este ejemplo:

public delegate int ReturnResult(int x, int y);

Para obtener más información sobre los delegados, vea Delegados (Guía de programación de C#).
Los eventos, al igual que los métodos, tienen una firma que incluye un nombre y una lista de parámetros. Esta firma se define
mediante un tipo de delegado, por ejemplo:

public delegate void MyEventHandler(object sender, System.EventArgs e);

Es común hacer que el primer parámetro se refiera al origen del evento y que el segundo parámetro sea el objeto que contiene
los datos relacionados con el evento. Sin embargo, el lenguaje C# no requiere ni exige este diseño; una firma de evento puede
ser la misma que cualquier firma de delegado válida, siempre y cuando devuelva un valor void.
Un evento se puede declarar utilizando la palabra clave event como este ejemplo:

public event MyEventHandler TriggerIt;

Para desencadenar el evento, defina el método que se va a invocar cuando el evento se provoca como en este ejemplo:

public void Trigger()


{
TriggerIt();
}

Para provocar un evento, llame al delegado y pase los parámetros relacionados con el evento. A continuación, el delegado
llamará a todos los controladores que se hayan agregado al evento. Cada evento puede tener más de un controlador asignado
para recibir el evento. En este caso, el evento llama automáticamente a cada receptor. Provocar un evento requiere sólo una
llamada al evento sin tener en cuenta el número de receptores.
Si desea que una clase reciba un evento, suscríbala a ese evento agregándole el delegado mediante el operador +=, por
ejemplo:

myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod);

Para cancelar la suscripción a un evento, quite el delegado del evento utilizando al operador -=, por ejemplo:

myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

Para obtener más información sobre eventos, vea Eventos (Guía de programación de C#).
Nota
En C# 2.0, los delegados pueden encapsular métodos con nombre y métodos anónimos. Para obtener más información sobr
e los métodos anónimos, vea Métodos anónimos (Guía de programación de C#).
Ejemplo
El ejemplo siguiente define un evento con tres métodos asociados a él. Cuando se desencadena el evento, los métodos se
ejecutan. A continuación, se quita un método del evento y se desencadena de nuevo el evento.

// Declare the delegate handler for the event:


public delegate void MyEventHandler();

class TestEvent
{
// Declare the event implemented by MyEventHandler.
public event MyEventHandler TriggerIt;
// Declare a method that triggers the event:
public void Trigger()
{
TriggerIt();
}
// Declare the methods that will be associated with the TriggerIt event.
public void MyMethod1()
{
System.Console.WriteLine("Hello!");
}
public void MyMethod2()
{
System.Console.WriteLine("Hello again!");
}
public void MyMethod3()
{
System.Console.WriteLine("Good-bye!");
}
static void Main()
{
// Create an instance of the TestEvent class.
TestEvent myEvent = new TestEvent();

// Subscribe to the event by associating the handlers with the events:


myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
// Trigger the event:
myEvent.Trigger();

// Unsuscribe from the the event by removing the handler from the event:
myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
System.Console.WriteLine("\"Hello again!\" unsubscribed from the event.");
// Trigger the new event:
myEvent.Trigger();
}
}

Resultado
Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!

Vea también
Referencia
event (Referencia de C#)
delegate (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Sobrecarga de operadores (C# y Java)


Al igual que C++, C# permite sobrecargar operadores para utilizarlos en clases propias. Esto hace posible que utilizar un tipo
de datos definido por el usuario parezca tan natural y lógico como utilizar un tipo de datos fundamental. Por ejemplo, podría
crear un nuevo tipo de datos denominado ComplexNumber para representar un número complejo y proporcionar métodos que
realicen operaciones matemáticas en esos números mediante operadores aritméticos estándar, como utilizar el operador +
para sumar dos números complejos.
Para sobrecargar un operador, se escribe una función que tenga el nombre del operador seguido del símbolo del operador
que se va a sobrecargar. Por ejemplo, a continuación se muestra cómo sobrecargar el operador +:
C#
public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

Todas las sobrecargas de operador son métodos estáticos de la clase. También tenga en cuenta que si sobrecarga el operador
de igualdad (==), también debe sobrecargar el operador de desigualdad (!=). Los operadores < y >, y los operadores < = y >
= también se deberían sobrecargar en pares.
La lista completa de operadores que se pueden sobrecargar es la siguiente:
Operadores unarios: +, -, !, ~, ++, --, true, false
Operadores binarios: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=
El ejemplo de código siguiente crea una clase ComplexNumber que sobrecarga los operadores + y -:
C#
public class ComplexNumber
{
private int real;
private int imaginary;

public ComplexNumber() : this(0, 0) // constructor


{
}

public ComplexNumber(int r, int i) // constructor


{
real = r;
imaginary = i;
}
// Override ToString() to display a complex number in the traditional format:
public override string ToString()
{
return(System.String.Format("{0} + {1}i", real, imaginary));
}

// Overloading '+' operator:


public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
}
// Overloading '-' operator:
public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
}
}

Esta clase permite crear y manipular dos números complejos con código de la manera siguiente:
C#
class TestComplexNumber
{
static void Main()
{
ComplexNumber a = new ComplexNumber(10, 12);
ComplexNumber b = new ComplexNumber(8, 9);

System.Console.WriteLine("Complex Number a = {0}", a.ToString());


System.Console.WriteLine("Complex Number b = {0}", b.ToString());

ComplexNumber sum = a + b;
System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());
ComplexNumber difference = a - b;
System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());
}
}

Como se muestra en el programa, los operadores más y menos se pueden utilizar ahora casi intuitivamente en objetos que
pertenecen a la clase ComplexNumber. Éste es el resultado que se obtendría:
Complex Number a = 10 + 12i
Complex Number b = 8 + 9i
Complex Number sum = 18 + 21i
Complex Number difference = 2 + 3i

Java no admite la sobrecarga de operadores, aunque internamente sobrecarga el operador + para la concatenación de
cadenas.
Vea también
Tareas
Ejemplo Operator Overloading
Referencia
Operadores sobrecargables (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Excepciones (C# y Java)


El control de excepciones en C# es muy similar al de Java.
Cada vez que sucede algo muy grave durante la ejecución de un programa, Common Language Runtime (CLR) de .NET
Framework crea un objeto Exception que detalla el error. En .NET Framework, Exception es la clase base para todas las clases
de excepción. Existen dos categorías de excepciones que derivan de la clase Exception: SystemException y
ApplicationException. Todos los tipos del espacio de nombres System derivan de SystemException, mientras que las
excepciones definidas por el usuario deben derivar de ApplicationException para poder diferenciar entre los errores en
tiempo de ejecución y los de aplicación. Algunas excepciones System comunes incluyen:
IndexOutOfRangeException: se utiliza un índice mayor que el tamaño de una matriz o colección.
NullReferenceException: se utilizó una propiedad o método de una referencia antes de que esa referencia se haya
establecido en una instancia válida.
ArithmeticException: una operación produce desbordamiento o subdesbordamiento.
FormatException: un argumento u operando está en formato incorrecto.
Al igual que en Java, cuando se utiliza código que es responsable de producir una excepción, ese código se tiene que colocar
dentro de un bloque try . Inmediatamente después, uno o más bloques catch proporcionan el control de errores. También
puede utilizar un bloque finally para cualquier código que desee ejecutar, sin importar si se produce o no una excepción. Para
obtener más información, vea try-catch (Referencia de C#) y try-catch-finally (Referencia de C#).
Cuando se utilizan varios bloques catch, las excepciones detectadas se deben colocar en orden creciente de generalidad, ya
que sólo se ejecutará el primer bloque catch que coincida con la excepción producida. El compilador de C# forzará este
proceso, mientras que el compilador de Java no lo hará.
A diferencia de Java, C# no requiere un argumento para un bloque catch; si no se especifica ningún argumento, el bloque
catch se aplica a cualquier clase Exception.
Por ejemplo, al leer un archivo, podría encontrar una excepción FileNotFoundException o IOException, y quizás desee colocar el
identificador FileNotFoundException más específico en primer lugar, como se muestra en el código siguiente:
C#
try
{
// code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
// handle the file not found exception first
}
catch (System.IO.IOException e)
{
// handle any other IO exceptions second
}
catch
{
// a catch block without a parameter
// handle all other exceptions last
}
finally
{
// this is executed whether or not an exception occurs
// use to release any external resources
}

Puede crear clases de excepción propias que deriven de Exception. Por ejemplo, el siguiente código crea una clase
InvalidDepartmentException que se podría producir, por ejemplo, si el departamento dado para un nuevo Employee no es
válido. El constructor de clase para la excepción definida por el usuario llama al constructor de la clase base con la palabra
clave base, que envía un mensaje adecuado:
C#
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException(string department) : base("Invalid Department: " + de
partment)
{
}
}

A continuación, podría producir una excepción con código como el siguiente:


C#
class Employee
{
private string department;

public Employee(string department)


{
if (department == "Sales" || department == "Marketing")
{
this.department = department;
}
else
{
throw new InvalidDepartmentException(department);
}
}
}

C# no admite excepciones controladas. En Java, éstas se declaran con la palabra clave throws para especificar que un método
puede producir un tipo particular de excepción que el código de llamada debe controlar.
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Técnicas avanzadas de C# (C# y Java)


C# proporciona algunas características de lenguaje útiles, como los indizadores, atributos y delegados, que permiten emplear
técnicas de programación avanzadas.
Indizadores
Los indizadores proporcionan una forma de tener acceso a class o struct de la misma manera que a una matriz. Por ejemplo, se
puede utilizar una clase que representa un departamento único en una compañía. La clase podría contener los nombres de
todos los empleados del departamento y los indizadores podrían permitir el acceso a estos nombres, del siguiente modo:
C#
sales[0] = "Nikki";
sales[1] = "Becky";

Los indizadores se habilitan definiendo una propiedad con la firma siguiente, por ejemplo, en la definición de clase:
C#
public string this [int index] //indexer

A continuación, se proporcionan los métodos get y set como se haría para una propiedad normal. Estos descriptores de acceso
son los que especifican a qué miembro interno se hace referencia cuando se utiliza el indizador.
En el siguiente ejemplo, se crea una clase denominada Department que utiliza indizadores para tener acceso a los empleados
de ese departamento, representados internamente como una matriz de cadenas:
C#
public class Department
{
private string name;
private const int MAX_EMPLOYEES = 10;
private string[] employees = new string[MAX_EMPLOYEES]; //employee array

public Department(string departmentName) //constructor


{
name = departmentName;
}

public string this [int index] //indexer


{
get
{
if (index >= 0 && index < MAX_EMPLOYEES)
{
return employees[index];
}
else
{
throw new System.IndexOutOfRangeException();
}
}
set
{
if (index >= 0 && index < MAX_EMPLOYEES)
{
employees[index] = value;
}
else
{
throw new System.IndexOutOfRangeException();
}
}
}

// code for the rest of the class...


}

A continuación, puede crear una instancia de esta clase y tener acceso a ella como se muestra en el ejemplo de código
siguiente:
C#
class TestDepartment
{
static void Main()
{
Department sales = new Department("Sales");

sales[0] = "Nikki";
sales[1] = "Becky";

System.Console.WriteLine("The sales team is {0} and {1}", sales[0], sales[1]);


}
}

El resultado es:
The sales team is Nikki and Becky

Para obtener más información, vea Indizadores (Guía de programación de C#).


Atributos
C# proporciona un mecanismo, denominado atributo, para agregar información declarativa sobre los tipos. Los atributos son
de algún modo similares al concepto de anotaciones en Java. La información adicional sobre un tipo se coloca dentro de
etiquetas declarativas que preceden la definición de tipo. En los ejemplos siguientes se muestra cómo utilizar los atributos de
.NET Framework para decorar una clase o un método.
En el ejemplo siguiente, el método GetTime se marca como servicio Web XML al agregar el atributo WebMethodAttribute.
C#
public class Utilities : System.Web.Services.WebService
{
[System.Web.Services.WebMethod] // Attribute
public string GetTime()
{
return System.DateTime.Now.ToShortTimeString();
}
}

Agregar el atributo WebMethod provoca que .NET Framework se ocupe automáticamente del intercambio de XML/SOAP
necesario para llamar a esta función. Al llamar a este servicio Web, se recupera el valor siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">7:26 PM</string>

En el ejemplo siguiente, la clase Employee se marca como serializable al agregar el atributo SerializableAttribute. Mientras el
campo Salary esté marcado como público, no se serializará puesto que está marcado con el atributo NonSerializedAttribute.
C#
[System.Serializable()]
public class Employee
{
public int ID;
public string Name;
[System.NonSerialized()] public int Salary;
}

Para obtener más información, vea Crear atributos personalizados (Guía de programación de C#).
Delegados
Los lenguajes como C++, Pascal y otros admiten el concepto de punteros a función, que le permiten seleccionar a qué función
desea llamar en tiempo de ejecución.
Java no proporciona ninguna construcción con la funcionalidad de puntero a función, pero C# sí lo permite. A través del uso de
la clase Delegate, una instancia de delegate encapsula un método que es una entidad a la que se puede llamar.
En el caso de los métodos de instancia, el delegado consta de una instancia de la clase contenedora y un método en la
instancia. En los métodos estáticos, una entidad a la que se puede llamar consta de una clase y un método estático en la clase.
Así, se puede utilizar un delegado para invocar una función de cualquier objeto y los delegados se orientan a objetos, tienen
seguridad de tipos y son seguros.
Hay tres pasos para definir y utilizar los delegados:
Declaración
Creación de instancias
Invocación
Los delegados se declaran con la siguiente sintaxis:
C#
delegate void Del1();

Este delegado se puede utilizar posteriormente para hacer referencia a cualquier función que devuelve un valor void y no toma
ningún argumento.
Asimismo, a fin de crear un delegado para cualquier función que tome un parámetro de cadena y devuelva un valor long,
utilizaría la sintaxis siguiente:
C#
delegate long Del2(string s);

A continuación, podría asignar este delegado a cualquier método con esta firma, como:
C#
Del2 d; // declare the delegate variable
d = DoWork; // set the delegate to refer to the DoWork method

Donde la firma de DoWork es:


C#
public static long DoWork(string name)

Reasignar los delegados


Los objetos Delegate son inmutables; es decir, la firma con la que coinciden no se puede cambiar una vez establecida. Sin
embargo, puede señalar a otro método siempre y cuando ambos tengan la misma firma. En este ejemplo, se reasigna d a un
nuevo objeto de delegado para que d invoque el método DoMoreWork. Sólo se puede hacer esto si DoWork y DoMoreWork tienen
la misma firma.
C#
Del2 d; // declare the delegate variable
d = DoWork; // set the delegate to refer to the DoWork method
d = DoMoreWork; // reassign the delegate to refer to the DoMoreWork method

Invocar delegados
Invocar un delegado es bastante sencillo. Simplemente sustituya el nombre de la variable de delegado para el nombre de
método. Esto invoca el método Add con los valores 11 y 22, y devuelve un resultado de tipo long que se asigna a la variable
sum:

C#
Del operation; // declare the delegate variable
operation = Add; // set the delegate to refer to the Add method
long sum = operation(11, 22); // invoke the delegate

En el ejemplo siguiente se muestra la generación, creación de instancias e invocación de un delegado:


C#
public class MathClass
{
public static long Add(int i, int j) // static
{
return (i + j);
}

public static long Multiply (int i, int j) // static


{
return (i * j);
}
}

class TestMathClass
{
delegate long Del(int i, int j); // declare the delegate type

static void Main()


{
Del operation; // declare the delegate variable
operation = MathClass.Add; // set the delegate to refer to the Add method
long sum = operation(11, 22); // use the delegate to call the Add metho
d

operation = MathClass.Multiply; // change the delegate to refer to the Multiply me


thod
long product = operation(30, 40); // use the delegate to call the Multiply
method

System.Console.WriteLine("11 + 22 = " + sum);


System.Console.WriteLine("30 * 40 = " + product);
}
}

Resultado
11 + 22 = 33
30 * 40 = 1200

Una instancia de delegado debe contener una referencia de objeto. El ejemplo anterior soluciona esto al declarar los métodos
como estáticos, lo que significa que no hay necesidad de especificar una referencia de objeto. Sin embargo, si un delegado
hace referencia a un método de instancia, se debe proporcionar la referencia de objeto del modo siguiente:
C#
Del operation; // declare the delegate variable
MathClass m1 = new MathClass(); // declare the MathClass instance
operation = m1.Add; // set the delegate to refer to the Add method

En este ejemplo, Add y Multiply son métodos de instancia de MathClass. Si los métodos de MathClass no se declaran como
estáticos, se los invoca a través del delegado mediante una instancia de MathClass, de la forma siguiente:
C#
public class MathClass
{
public long Add(int i, int j) // not static
{
return (i + j);
}

public long Multiply (int i, int j) // not static


{
return (i * j);
}
}
class TestMathClass
{
delegate long Del(int i, int j); // declare the delegate type

static void Main()


{
Del operation; // declare the delegate variable
MathClass m1 = new MathClass(); // declare the MathClass instance

operation = m1.Add; // set the delegate to refer to the Add method


long sum = operation(11, 22); // use the delegate to call the Add method

operation = m1.Multiply; // change the delegate to refer to the Multiply method


long product = operation(30, 40); // use the delegate to call the Multiply method
System.Console.WriteLine("11 + 22 = " + sum);
System.Console.WriteLine("30 * 40 = " + product);
}
}

Resultado
Este ejemplo proporciona el mismo resultado que el ejemplo anterior, en el que los métodos se declararon como estáticos.
11 + 22 = 33
30 * 40 = 1200

Delegados y eventos
.NET Framework también utiliza delegados en gran medida para las tareas de control de eventos, como un evento de clic de un
botón en una aplicación para Windows o Web. Mientras que el control de eventos de Java se realiza generalmente
implementando clases de agente de escucha personalizadas, los desarrolladores de C# pueden aprovechar los delegados para
el control de eventos. event se declara como un campo con un tipo de delegado, sólo que la palabra clave event precede a la
declaración del evento. Los eventos generalmente se declaran como public, pero se permite cualquier modificador de
accesibilidad. En el ejemplo siguiente se muestra la declaración de delegate y event.
C#
// Declare the delegate type:
public delegate void CustomEventHandler(object sender, System.EventArgs e);

// Declare the event variable using the delegate type:


public event CustomEventHandler CustomEvent;

Los delegados de evento son de multidifusión, lo que significa que pueden guardar referencias a más de un método de control
de eventos. Un delegado actúa como remitente de eventos de la clase que provoca el evento y mantiene una lista de los
controladores registrados para el evento. En el ejemplo siguiente se muestra cómo suscribir varias funciones a un evento. La
clase EventClass contiene el delegado, el evento y un método para invocar el evento. Tenga en cuenta que un evento sólo se
puede invocar desde la clase que lo declaró. La clase TestEvents se puede suscribir luego al evento mediante el operador += y
la suscripción se puede cancelar con el operador -=. Cuando se llama al método InvokeEvent, éste desencadena el evento y las
funciones que se hayan suscrito al evento se desencadenarán en forma sincrónica, como se muestra en el ejemplo siguiente.
C#
public class EventClass
{
// Declare the delegate type:
public delegate void CustomEventHandler(object sender, System.EventArgs e);

// Declare the event variable using the delegate type:


public event CustomEventHandler CustomEvent;

public void InvokeEvent()


{
// Invoke the event from within the class that declared the event:
CustomEvent(this, System.EventArgs.Empty);
}
}

class TestEvents
{
private static void CodeToRun(object sender, System.EventArgs e)
{
System.Console.WriteLine("CodeToRun is executing");
}

private static void MoreCodeToRun(object sender, System.EventArgs e)


{
System.Console.WriteLine("MoreCodeToRun is executing");
}

static void Main()


{
EventClass ec = new EventClass();

ec.CustomEvent += new EventClass.CustomEventHandler(CodeToRun);


ec.CustomEvent += new EventClass.CustomEventHandler(MoreCodeToRun);

System.Console.WriteLine("First Invocation:");
ec.InvokeEvent();

ec.CustomEvent -= new EventClass.CustomEventHandler(MoreCodeToRun);

System.Console.WriteLine("\nSecond Invocation:");
ec.InvokeEvent();
}
}

Resultado
First Invocation:
CodeToRun is executing
MoreCodeToRun is executing
Second Invocation:
CodeToRun is executing
Vea también
Tareas
Ejemplo de delegados
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Eventos (Guía de programación de C#)
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Recolección de elementos no utilizados (C# y Java)


En C y C++, es necesario que el programador asigne los recursos de varios objetos una vez declarados, antes de que los
objetos se puedan utilizar de forma segura. También es responsabilidad del programador volver a liberar estos recursos para
el bloque de espacio en memoria una vez utilizado el objeto. Si no se liberan los recursos, se dice que el código tiene pérdida
de memoria, porque cada vez más recursos se utilizan inútilmente. Por otra parte, si los recursos se liberan de forma
prematura, se puede producir pérdida de datos, daños en otras áreas de memoria y excepciones de puntero nulo.
Java y C# evitan estos peligros al administrar independientemente el período de duración de todos los objetos que una
aplicación utiliza.
En Java, JVM se asegura de liberar la memoria no utilizada mediante el seguimiento de las referencias a los recursos
asignados. Cada vez que JVM detecta que una referencia válida ya no hace referencia a un recurso, se recolectan los elementos
no utilizados del recurso.
En C#, Common Language Runtime (CLR) controla la recolección de elementos no utilizados con una funcionalidad similar a la
de JVM. El recolector de elementos no utilizados de CLR busca periódicamente en el montón de memoria cualquier objeto sin
referencia y libera los recursos contenidos por estos objetos.
Vea también
Conceptos
Guía de programación de C#
Administración de memoria automática
Otros recursos
Ejemplos de código de C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Código seguro y no seguro (C# y Java)


Una característica particularmente interesante de C# es la compatibilidad con el código sin seguridad de tipos. Normalmente,
Common Language Runtime (CLR) asume la responsabilidad de supervisar el comportamiento del código de lenguaje
intermedio de Microsoft (MSIL) y evita cualquier operación cuestionable. No obstante, en ocasiones puede ser conveniente
tener acceso directamente a una funcionalidad de nivel inferior, como llamadas a la API Win32, y se puede hacer siempre y
cuando se asuma la responsabilidad de garantizar que ese código funcione correctamente. Ese código se debe colocar dentro
de bloques no seguros en el código fuente.
La palabra clave unsafe
El código de C# que efectúa llamadas a la API de nivel inferior, utiliza aritmética de punteros o realiza alguna otra operación
poco segura, se debe colocar dentro de bloques marcados con la palabra clave unsafe. Cualquiera de las siguientes situaciones
se puede marcar como no segura:
Un método completo.
Un bloque de código entre llaves.
Una instrucción individual.
El ejemplo siguiente muestra el uso de unsafe en las tres situaciones anteriores:
C#
class TestUnsafe
{
unsafe static void PointyMethod()
{
int i=10;

int *p = &i;
System.Console.WriteLine("*p = " + *p);
System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
}

static void StillPointy()


{
int i=10;

unsafe
{
int *p = &i;
System.Console.WriteLine("*p = " + *p);
System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
}
}
static void Main()
{
PointyMethod();
StillPointy();
}
}

En este código, el método PointyMethod() completo está marcado como no seguro porque declara y utiliza punteros. El
método StillPointy() marca un bloque de código como no seguro porque este bloque una vez más utiliza punteros.
La palabra clave fixed
En código seguro, el recolector de elementos no utilizados tiene bastante libertad para mover un objeto durante su duración
con la misión de organizar y condensar recursos libres. Sin embargo, si el código utiliza punteros, este comportamiento puede
producir fácilmente resultados inesperados; por lo tanto, puede indicar al recolector de elementos no utilizados que no mueva
determinados objetos mediante la instrucción fixed.
En el código siguiente se muestra la palabra clave fixed, que se utiliza para garantizar que el sistema no mueva una matriz
durante la ejecución de un bloque de código en el método PointyMethod(). Observe que fixed sólo se utiliza dentro de código
no seguro:
C#
class TestFixed
{
public static void PointyMethod(char[] array)
{
unsafe
{
fixed (char *p = array)
{
for (int i=0; i<array.Length; i++)
{
System.Console.Write(*(p+i));
}
}
}
}
static void Main()
{
char[] array = { 'H', 'e', 'l', 'l', 'o' };
PointyMethod(array);
}
}

Vea también
Tareas
Ejemplo de código no seguro
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Lenguaje de programación C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Ejemplos de código de C# para desarrolladores de Java


C# es un lenguaje orientado a objetos, simple, elegante y con seguridad en el tratamiento de tipos, que permite a los
programadores crear una gran variedad de aplicaciones. Al combinarse con .NET Framework, Visual C# permite la creación de
aplicaciones para Windows, servicios Web, herramientas de base de datos, componentes, controles, etc.
En esta sección
Desarrollo de aplicaciones de consola (C# y Java)
Describe las aplicaciones de consola en C# para el desarrollador de Java.
E/S de archivo (C# y Java)
Describe las operaciones de entrada/salida (E/S) en C# para el desarrollador de Java y los vínculos con las clases XML para
cargar y guardar el archivo XML.
Acceso a bases de datos (C# y Java)
Compara el acceso a datos en ambos lenguajes.
Desarrollo de la interfaz de usuario (C# y Java)
Describe cómo crear la aplicación de Windows Forms en C# para el desarrollador de Java.
Administración de recursos (C# y Java)
Proporciona temas sobre archivos de recursos de Windows en C# para el desarrollador de Java.
Aplicaciones de servicios Web (C# y Java)
Describe el desarrollo de aplicaciones del servicio Web XML en C# para el desarrollador de Java.
Dispositivos móviles y datos (C# y Java)
Describe cómo interactuar con bases de datos que utilizan C# y los formularios Windows Forms de .NET Framework, así
como también SQL Server, para el desarrollador de Java.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Migrar a Visual C#
Escribir aplicaciones con Visual C#
Conceptos del lenguaje Visual C#

Desarrollo de aplicaciones de consola (C# y Java)


Las aplicaciones de consola leen y escriben hacia y desde la entrada y salida estándar (E/S) sin ninguna interfaz gráfica de
usuario. La anatomía de una aplicación de consola es similar en Java y C# y las clases similares se utilizan para la E/S de la
consola.
Aunque los detalles de las clases y sus firmas de método podrían variar, C# y Java utilizan conceptos similares para realizar
una operación de E/S de consola. Tanto C# como Java utilizan el concepto de punto de entrada principal para la aplicación de
consola y los métodos de lectura y escritura de la consola asociada. En C#, es Main y en Java es main.
Ejemplo "Hello World" de Java
En el código de ejemplo de Java que aparece a continuación, una rutina static void main() acepta una referencia String a
los argumentos de la aplicación. Luego, la rutina main imprime una línea en la consola.

/* A Java Hello World Console Application */


public class Hello {
public static void main (String args[]) {
System.out.println ("Hello World");
}
}

Ejemplo "Hello World" de C#


En el código de ejemplo de C# que aparece a continuación, una rutina static void Main() acepta una referencia string a los
argumentos de la aplicación. Luego, la rutina Main escribe una línea en la consola.
C#
// A C# Hello World Console Application.
public class Hello
{
static void Main()
{
System.Console.WriteLine("Hello World");
}
}

Compilar el código
Si utiliza Visual C#, puede compilar y ejecutar el código en un paso único presionando F5. Si utiliza la línea de comandos y su
archivo se denomina "Hello.cs", invoque el compilador de C# del modo siguiente:
csc Hello.cs
Para obtener más información
Para obtener más información sobre la creación de una aplicación de consola, vea Crear aplicaciones de consola (Visual C#).
Para obtener más información sobre las clases de consola de .NET Framework, vea:
Clase Console, métodos WriteLine y ReadLine.
Opciones del compilador de C#, por categoría.
Lo nuevo en el lenguaje y el compilador de C# 2.0
Para obtener más información sobre la conversión automatizada de Java a C#, vea
What's New in Java Language Conversion Assistant.
Vea también
Referencia
Main() y argumentos de línea de comandos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

E/S de archivo (C# y Java)


Aunque los detalles de las clases y firmas de método pueden variar, C# y Java utilizan conceptos similares para realizar una
operación de E/S de archivo. C# y Java utilizan el concepto de clase de archivo y métodos asociados de lectura y escritura de
archivos. Existen Modelos de objetos de documento (DOM) similares para controlar el contenido XML.
Ejemplo de operaciones de archivo en Java
En Java, puede utilizar el objeto File para realizar operaciones básicas de E/S de archivo, tales como crear, abrir, cerrar, leer un
archivo y escribir en él. Por ejemplo, puede utilizar los métodos de la clase File para realizar operaciones de E/S de archivo, tal
como utilizar los métodos createNewFile o delete de la clase File para crear o eliminar un archivo. Puede utilizar las clases
BufferedReader y BufferedWriter para leer y escribir el contenido de archivos.
En el ejemplo de código siguiente se muestra cómo crear un nuevo archivo, eliminarlo, leer texto de un archivo y escribir en él.

// Java example code to create a new file


try
{
File file = new File("path and file_name");
boolean success = file.createNewFile();
}
catch (IOException e) { }

// Java example code to delete a file.


try
{
File file = new File("path and file_name");
boolean success = file.delete();
}
catch (IOException e) { }

// Java example code to read text from a file.


try
{
BufferedReader infile = new BufferedReader(new FileReader("path and file_name "));
String str;
while ((str = in.readLine()) != null)
{
process(str);
}
infile.close();
}
catch (IOException e)
{
// Exceptions ignored.
}
// Java example code to writing to a file.
try
{
BufferedWriter outfile =
new BufferedWriter(new FileWriter("path and file_name "));
outfile.write("a string");
outfile.close();
}
catch (IOException e) { }

Ejemplo de operaciones de archivo en C#


En C#, para realizar una operación de E/S de archivo, puede utilizar los mismos conceptos básicos comunes para crear, abrir,
cerrar, leer y escribir mediante las clases y métodos equivalentes de .NET Framework. Por ejemplo, puede utilizar los métodos
de la clase File de .NET Framework para realizar operaciones de E/S de archivo. Por ejemplo, puede comprobar la existencia de
un archivo utilizando el método Exists. También puede utilizar el método Create para crear un archivo y, opcionalmente,
reemplazar un archivo existente como se muestra en el ejemplo de código siguiente. Asimismo, con la clase FileStream y el
objeto BufferedStream puede leer y escribir en el archivo.
En el ejemplo de código siguiente se muestra cómo eliminar, crear y leer un archivo, además de escribir en él.
C#
// sample C# code for basic file I/O operations
// exceptions ignored for code simplicity

class TestFileIO
{
static void Main()
{
string fileName = "test.txt"; // a sample file name
// Delete the file if it exists.
if (System.IO.File.Exists(fileName))
{
System.IO.File.Delete(fileName);
}

// Create the file.


using (System.IO.FileStream fs = System.IO.File.Create(fileName, 1024))
{
// Add some information to the file.
byte[] info = new System.Text.UTF8Encoding(true).GetBytes("This is some text in
the file.");
fs.Write(info, 0, info.Length);
}

// Open the file and read it back.


using (System.IO.StreamReader sr = System.IO.File.OpenText(fileName))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
System.Console.WriteLine(s);
}
}
}
}

Secciones relacionadas
Entre las clases de .NET Framework que son útiles para crear, leer y escribir en secuencias, se incluyen las clases StreamReader
y StreamWriter. Otras clases de .NET Framework útiles para controlar y procesar archivos incluyen:
Las clases FileAccess y FileAttribute.
Las clases Directory, DirectoryInfo, Path, FileInfo y DriveInfo.
Las clases BinaryReader y BinaryWriter.
Las clases StringReader y StringWriter.
Las clases TextReader y TextWriter
Las clases XmlReader y XmlWriter.
La clase ToBase64Transform.
Las clases FileStream, BufferedStream y MemoryStream.
Para obtener más información sobre la conversión automatizada de Java a C#, vea
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0.
Para obtener más información sobre seguridad de .NET Framework, vea NET Security.
Vea también
Conceptos
Guía de programación de C#
E/S de archivos asincrónica
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Acceso a bases de datos (C# y Java)


C# y Java utilizan medios similares para obtener acceso a los datos de las bases de datos. Tanto C# como Java requieren que
un controlador de bases de datos realice operaciones reales con bases de datos. Además, ambos requieren una conexión con la
base de datos, una consulta SQL que se ejecutará en la conexión con la base de datos y un conjunto de resultados procedentes
de la ejecución de la consulta.
Comparar controladores de bases de datos
Se pueden utilizar controladores de bases de datos, como JDBC u ODBC, para obtener acceso a datos de Java y C#. El
controlador JDBC (Java Database Connectivity, conectividad de bases de datos de Java) se utiliza desde un programa escrito en
Java. El controlador de ODBC (Open Database Connectivity, Conectividad abierta de bases de datos) es la interfaz de
programación de base de datos que utiliza Microsoft para tener acceso a distintas bases de datos relacionales en diversas
plataformas. También existe un estándar que sirve de puente entre JDBC-ODBC en las versiones Solaris y Windows de la
plataforma Java, para que se pueda utilizar ODBC desde un programa Java.
En Java, se proporciona al controlador la información de la cadena de conexión para un identificador de conexión, de la
siguiente forma:

final static private String url = "jdbc:oracle:server,user,pass, …)";

En C#, si se utiliza .NET Framework, no es necesario cargar controladores ODBC ni JDBC para tener acceso a la base de datos.
Sólo hay que establecer la cadena de conexión para el objeto de conexión a bases de datos, de la siguiente forma:
C#
static string connectionString = "Initial Catalog=northwind;Data Source=(local);Integrated
Security=SSPI;";
static SqlConnection cn = new SqlConnection(connectionString);

Para obtener más información sobre el controlador ODBC para bases de datos Oracle, vea ODBC Driver for Oracle. Para
obtener información adicional sobre el proveedor OLE DB para bases de datos DB2, vea
Microsoft Host Integration Server 2000 Developer's Guide y
Administration and Management of Data Access Using the OLE DB Provider for DB2.
Microsoft® SQL Server™ 2000 Driver for JDBC es un controlador JDBC de tipo 4, que proporciona acceso a SQL Server
2000 a través de cualquier subprograma, aplicación o servidor de aplicaciones habilitado para Java.
Ejemplo de lectura de bases de datos de Java
En Java, para realizar una operación de lectura de bases de datos, se puede utilizar un objeto ResultSet creado por el método
executeQuery del objeto Statement. El objeto ResultSet contiene los datos devueltos por la consulta. A continuación, puede
recorrer en iteración el objeto ResultSet para obtener acceso a los datos.
El ejemplo siguiente proporciona el código Java que se va a leer en una base de datos.

Connection c;
try
{
Class.forName (_driver);
c = DriverManager.getConnection(url, user, pass);
}
catch (Exception e)
{
// Handle exceptions for DriverManager
// and Connection creation:
}
try
{
Statement stmt = c.createStatement();
ResultSet results = stmt.executeQuery(
"SELECT TEXT FROM dba ");
while(results.next())
{
String s = results.getString("ColumnName");
// Display each ColumnName value in the ResultSet:
}
stmt.close();
}
catch(java.sql.SQLException e)
{
// Handle exceptions for executeQuery and getString:
}

Asimismo, para realizar una operación de escritura en la base de datos, se crea un objeto Statement a partir del objeto
Connection. El objeto Statement tiene métodos para ejecutar consultas SQL y actualizaciones en una base de datos. Las
actualizaciones y consultas se encuentran en una cadena que contiene el comando SQL de una operación de escritura que se
utilizó en el método executeUpdate del objeto Statement para devolver un objeto ResultSet.
Ejemplo de lectura de bases de datos de C#
En C#, mediante .NET Framework, el acceso a los datos se simplifica aún más a través del conjunto de clases proporcionado
por ADO.NET, que admite el acceso a bases de datos con los controladores ODBC, así como también, a través de proveedores
OLE DB. Las aplicaciones de C# pueden interactuar con bases de datos SQL para la lectura, escritura y búsqueda de datos
mediante clases ADO.NET de .NET Framework y a través de Microsoft Data Access Component (MDAC). El espacio de nombres
y las clases System.Data.SqlClient de .NET Framework facilitan aún más el acceso a las bases de datos de SQL Server.
En C#, para realizar una operación de lectura de la base de datos, puede utilizar una conexión, un comando y una tabla de
datos. Por ejemplo, para conectarse a una base de datos de SQL Server con el espacio de nombres System.Data.SqlClient,
puede utilizar lo siguiente:
Una clase SqlConnection.
Una consulta, como una clase SqlCommand.
Un conjunto de resultados, como una clase DataTable.
.NET Framework proporciona DataAdapter, que reúne estos tres objetos, de la siguiente forma:
El objeto SqlConnection se establece mediante la propiedad de conexión del objeto DataAdapter.
La consulta que se ejecutará se especifica con la propiedad SelectCommand de DataAdapter.
El objeto DataTable se crea utilizando el método Fill del objeto DataAdapter. El objeto DataTable contiene los datos
del conjunto de resultados devueltos por la consulta. Puede recorrer en iteración el objeto DataTable para tener acceso
a las filas de datos usando la colección de filas.
Para compilar y ejecutar el código, necesita lo que se indica a continuación; de lo contrario, se produce un error en la línea
databaseConnection.Open(); y se produce una excepción.

Microsoft Data Access Components (MDAC) versión 2.7 o posterior.


Si utiliza Microsoft Windows XP o Windows Server 2003, ya dispone de MDAC 2.7. Sin embargo, si utiliza Microsoft
Windows 2000, es posible que tenga que actualizar la versión de MDAC instalada en el equipo. Para obtener más
información, vea MDAC Installation.
Tener acceso a la base de datos Northwind de SQL Server y privilegios de seguridad integrados para el nombre de
usuario actual que ejecuta el código en un servidor SQL Server local con la base de datos de ejemplo Northwind
instalada.
C#
// Sample C# code accessing a sample database
// You need:
// A database connection
// A command to execute
// A data adapter that understands SQL databases
// A table to hold the result set

namespace DataAccess
{
using System.Data;
using System.Data.SqlClient;

class DataAccess
{
//This is your database connection:
static string connectionString = "Initial Catalog=northwind;Data Source=(local);Int
egrated Security=SSPI;";
static SqlConnection cn = new SqlConnection(connectionString);

// This is your command to execute:


static string sCommand = "SELECT TOP 10 Lastname FROM Employees ORDER BY EmployeeID
";

// This is your data adapter that understands SQL databases:


static SqlDataAdapter da = new SqlDataAdapter(sCommand, cn);
// This is your table to hold the result set:
static DataTable dataTable = new DataTable();

static void Main()


{
try
{
cn.Open();

// Fill the data table with select statement's query results:


int recordsAffected = da.Fill(dataTable);

if (recordsAffected > 0)
{
foreach (DataRow dr in dataTable.Rows)
{
System.Console.WriteLine(dr[0]);
}
}
}
catch (SqlException e)
{
string msg = "";
for (int i=0; i < e.Errors.Count; i++)
{
msg += "Error #" + i + " Message: " + e.Errors[i].Message + "\n";
}
System.Console.WriteLine(msg);
}
finally
{
if (cn.State != ConnectionState.Closed)
{
cn.Close();
}
}
}
}
}

Para obtener más información sobre ADO.NET, vea:


ADO.NET
Obtener acceso a datos (Visual Studio)
Aplicación de ejemplo de ADO.NET
ADO.NET for the Java Programmer
Para obtener más información sobre las clases de acceso a bases de datos de .NET Framework, vea:
System.Data.OracleClient
System.Data.SqlServerCe
System.Data.Odbc
System.Data.OleDb
DataSet de ADO.NET
Utilizar DataSets en ADO.NET
Para obtener más información sobre el Ayudante para la conversión del lenguaje Java, vea
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Desarrollo de la interfaz de usuario (C# y Java)


El completo conjunto de componentes de formularios Windows Forms de .NET Framework se puede utilizar en C# para
programar aplicaciones de formularios del cliente.
Java
La mayoría de las aplicaciones de Java utilizan AWT (Abstract Windowing ToolKit) o Swing, que utiliza la infraestructura de
AWT, incluido el modelo de eventos de AWT, para la programación de formularios. AWT proporciona todas las funciones y
clases básicas de interfaz gráfica de usuario.
Ejemplo de Java
Normalmente, para agregar los componentes, se utiliza un marco, que es una ventana con un título y borde.

JFrame aframe = new JFrame();

La clase Component, que es un objeto con representación gráfica, generalmente se extiende y los métodos heredados se
utilizan o se reemplazan, por ejemplo, el método paint de un componente Shape en el código que se muestra.

import java.awt.*;
import javax.swing.*;

class aShape extends JComponent {


public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;

// Draw the shape.


}

public static void main(String[] args) {


JFrame aframe = new JFrame();
frame.getContentPane().add(new aShape ());
int frameWidth = 300;
int frameHeight = 300;
frame.setSize(frameWidth, frameHeight);
frame.setVisible(true);
}
}

El usuario se puede registrar a fin de escuchar un evento de acción de un componente para controlar eventos. Por ejemplo,
cuando se presiona y se suelta un botón, AWT envía una instancia de ActionEvent a ese botón al llamar a processEvent en el
botón. El método processEvent del botón recibe todos los eventos del botón; pasa un evento de acción al llamar a su propio
método processActionEvent. El último método pasa el evento de acción a cualquier agente de escucha de la acción que
registró un interés en eventos de acción generados por este botón.
C#
En C#, el espacio de nombres y clases System.Windows.Forms de .NET Framework proporciona un completo conjunto de
componentes para el desarrollo de formularios Windows Forms. Por ejemplo, el código siguiente utiliza Label, Button y
MenuStrip.
Ejemplo de C#
Simplemente derive de la clase Form, del modo siguiente:
C#
public partial class Form1 : System.Windows.Forms.Form

y agregue sus propios componentes:


C#
this.button1 = new System.Windows.Forms.Button();
this.Controls.Add(this.button1);

En el código siguiente se muestra cómo agregar una etiqueta, un botón y un menú a un formulario.
C#
namespace WindowsFormApp
{
public partial class Form1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.MenuStrip menu1;
public Form1()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();

this.label1 = new System.Windows.Forms.Label();


this.Controls.Add(this.label1);

this.button1 = new System.Windows.Forms.Button();


this.Controls.Add(this.button1);
this.menu1 = new System.Windows.Forms.MenuStrip();
this.Controls.Add(this.menu1);
}

static void Main()


{
System.Windows.Forms.Application.Run(new Form1());
}
}
}

Al igual que en Java, en C# se puede registrar para escuchar un evento de un componente. Por ejemplo, cuando se presiona y
suelta un botón, el motor en tiempo de ejecución envía un evento Click a cualquier agente de escucha que haya registrado un
interés en el evento Click de este botón.
C#
private void button1_Click(object sender, System.EventArgs e)
{
}

Puede utilizar el código siguiente a fin de registrar button1_Click para controlar el evento Click de una instancia de Button
denominada button1.
C#
// this code can go in InitializeComponent()
button1.Click += button1_Click;

Para obtener más información, vea Crear aplicaciones Web ASP.NET (Visual C#).
Para obtener más información sobre la conversión automatizada de Java a C#, vea
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0.
Para obtener más información sobre las clases de Forms, vea Controles de formularios Windows Forms por función y
System.Windows.Forms.
Vea también
Conceptos
Guía de programación de C#
Diseñar una interfaz de usuario (Visual C#)
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Administración de recursos (C# y Java)


Con Visual Studio, se simplifica la administración de recursos en C#.
Java
Las aplicaciones Java normalmente se incluyen en un archivo JAR, junto con los distintos recursos de una aplicación, como
archivos de clase, archivos de sonido y archivos de imagen. Probablemente utilizará JBuilder o Eclipse, que administra los
archivos JAR de manera muy similar a cómo Visual Studio administra soluciones y proyectos.
C#
En los proyectos de C#, simplemente puede abrir los recursos desde el Explorador de soluciones de Visual Studio.
También puede utilizar Editor de imágenes y Editor binario para trabajar con archivos de recursos en proyectos administrados.
Para obtener más información sobre cómo agregar recursos a proyectos administrados, vea:
Agregar y editar recursos (Visual C#)
Tutorial: Adaptar formularios Windows Forms
Tutorial: Utilizar los recursos de adaptación con ASP.NET
Puede leer estos recursos en la aplicación como contenido externo o recursos incrustados. Por ejemplo, las siguientes líneas de
código utilizan clases del espacio de nombres System.Reflection y clases como Assembly para leer un archivo de recursos
incrustados desde el ensamblado. En este caso, el archivo es assemblyname.file.ext.
C#
static void Main()
{
System.Reflection.Assembly asm =
System.Reflection.Assembly.GetExecutingAssembly();

System.Drawing.Bitmap tiles = new System.Drawing.Bitmap


(asm.GetManifestResourceStream("assemblyname.file.ext"));
}

Para obtener más información, vea Reflexión (Guía de programación de C#).


Para obtener más información sobre los recursos de la aplicación, vea Administrar los recursos de la aplicación.
Para obtener información sobre cómo funciona el editor de recursos generales, vea Editores de recursos.
Para obtener más información sobre cómo modificar archivos de recursos con formato .Resx, vea
Recursos en aplicaciones.
Para obtener más información sobre cómo utilizar XML y la API simplificada para XML (SAX2), vea
SAX2 Developer Guide y XML Developer Center.
Vea también
Conceptos
Guía de programación de C#
Agregar y editar recursos (Visual C#)
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Aplicaciones de servicios Web (C# y Java)


.NET Framework proporciona compatibilidad extensa con la interoperabilidad a través de los servicios Web. En C#, con .NET
Framework, Visual Studio y ASP.NET, la creación de un servicio Web es tan sencilla como crear un proyecto de servicios Web y
agregar un atributo WebMethod a cualquier método público que se desee exponer.
Java
En Java, puede utilizar un paquete de servicios Web para implementar una aplicación como Java Web Services Developer Pack
o Apache SOAP. Por ejemplo, en Java se puede crear un servicio Web con Apache SOAP mediante los pasos siguientes.
Para crear un servicio Web en Java con Apache SOAP
1. Escriba un método de servicio Web, de la manera siguiente:

public class HelloWorld


{

public String sayHelloWorld()


{
return "HelloWorld ";
}
}

2. Cree el descriptor de implementación de Apache SOAP. Éste puede ser similar al descriptor mostrado:

<dd:service xmlns:dd="http://xml.apache.org/xml-soap/deployment"
id="urn:HelloWorld">

<dd:provider type="java"
scope="Application"
methods="sayHelloWorld">

<dd:java class="HelloWorld" static="false" />

</dd:provider>

<dd:faultListener>org.apache.soap.server.DOMFaultListener</dd:faultListener>

<dd:mappings />

</dd:service>

3. Compile la clase HelloWorld y muévala a la ruta de acceso de la clase en el servidor Web.


4. Implemente el servicio Web con la herramienta de línea de comandos.
C#
Crear un servicio Web en C# es más sencillo cuando se utilizan clases de .NET Framework y el entorno de desarrollo integrado
(IDE) de Visual Studio.
Para crear un servicio Web en C# con .NET Framework y Visual Studio
1. Cree una aplicación de servicio Web en Visual Studio. Para obtener más información, vea
Tipos de aplicación de C# para programadores de Java. A continuación se muestra el código generado.
C#
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {

[WebMethod]
public string HelloWorld() {
return "Hello World";
}

2. Busque la línea [WebService(Namespace = "http://tempuri.org/")] y cambie "http://tempuri.org/" por


"http://tempuri.org/".

Para ejecutar el servicio Web en C#


1. Compile y ejecute el servicio. Escriba http://localhost/WebSite1/Service.asmx en el explorador Web, donde localhost es
el nombre del servidor Web de IIS y Service es el nombre del servicio, en este caso Service.
2. El resultado es:

The following operations are supported. For a formal definition, please review the Ser
vice Description.
HelloWorld

3. Haga clic en el vínculo HelloWorld para llamar al método HelloWorld de Service1. El resultado es:

Click here for a complete list of operations.


HelloWorld
Test
To test the operation using the HTTP POST protocol, click the 'Invoke' button.

SOAP 1.1
...
SOAP 1.2
...
HTTP POST
...

4. Haga clic en el botón Invocar para llamar al método HelloWorld de Service1. El resultado es:

<?xml version="1.0" encoding="utf-8" ?>


<string xmlns="http://HowToDevelopWebServicesTest/">Hello World</string>

Para obtener más información sobre servicios Web, vea:


Generar clientes de servicios Web XML
Descripción de servicios Web XML
Cómo: Crear un método de servicio Web XML
Tutorial: Crear un servicio Web XML utilizando Visual Basic o Visual C#
Tutorial: Crear y usar un servicio Web ASP.NET en Visual Web Developer
Para obtener más información sobre la conversión automatizada de Java a C#, vea
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
C# para desarrolladores de Java
Conceptos del lenguaje Visual C#

Dispositivos móviles y datos (C# y Java)


Con C# y .NET Compact Framework, puede administrar y tener acceso a datos de bases de datos de un dispositivo móvil
usando los mismos conceptos y API similares a las que utilizaría en la programación de bases de datos de un equipo de
escritorio. En dispositivos móviles, ADO.NET proporciona un subconjunto de API de equipo de escritorio que tiene como
destino dispositivos Windows CE, incluidos dispositivos Pocket PC y Smartphone. Para obtener más información, vea
Acceso a bases de datos (C# y Java).
Java
En Java, puede utilizar J2ME y JDBC para tener acceso a una base de datos desde un dispositivo móvil. Para obtener más
información, vea Acceso a bases de datos (C# y Java). J2ME no representa una API única en todos los dispositivos y no tiene un
entorno de desarrollo único. Además, J2ME se debe ejecutar dentro de un equipo virtual, KVM o JVM, según la configuración.
C#
En C#, para realizar una operación de lectura de bases de datos, pueden utilizarse los conceptos habituales de conexión,
comando o tabla de datos, tanto en el escritorio como en el dispositivo móvil. Simplemente debe utilizar el espacio de
nombres System.Data.SqlServerCe y sus clases. Por ejemplo, puede hacer lo siguiente:
Utilizar SqlCeConnection para la conexión con bases de datos.
Utilizar SqlCeCommand para el objeto de comando SQL.
Utilizar un objeto de conjunto de resultados como DataTable para el objeto de tabla de datos.
.NET Framework proporciona DataAdapter para que sea fácil utilizar de forma conjunta las clases previamente mencionadas. El
objeto SqlCeConnection se puede establecer mediante la propiedad de conexión del objeto SqlCeDataAdapter.
La consulta que se va a ejecutar se especifica mediante la propiedad SelectCommand de DataAdapter o simplemente se pasa al
constructor de DataAdapter, junto con el objeto de conexión.
C#
da = new SqlCeDataAdapter("SELECT * FROM Users", cn);

El objeto DataTable se crea utilizando el método Fill del objeto DataAdapter. El objeto DataTable contiene los datos del
conjunto de resultados devueltos por la consulta. Se puede recorrer en iteración el objeto DataTable para obtener acceso a las
filas de datos usando la colección Rows.
El código siguiente muestra cómo tener acceso a las filas de una tabla en una base de datos de SQL Server CE (SQLCE) de un
dispositivo móvil.
C#
namespace DataAccessCE
{
using System.Data;
using System.Data.SqlServerCe;

class DataAccessCE
{
public static string connectionString = "";
public static SqlCeConnection cn = null;
public static SqlCeDataAdapter da = null;
public static DataTable dt = new DataTable();

static void Main()


{
connectionString = "Data Source=\\My Documents\\Database.sdf" ;
cn = new SqlCeConnection(connectionString);

da = new SqlCeDataAdapter("SELECT * FROM Users", cn);


da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
System.Console.WriteLine(dr[0]);
}
}
}
}

Para obtener más información al respecto, vea:


Información general acerca de ADO.NET
Obtener acceso a datos (Visual Studio)
Aplicación de ejemplo de ADO.NET
Replication
Synchronizing a Subscription
Para obtener más información sobre la conversión automatizada de Java a C#, vea
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0.
Compilar el código
Antes de poder trabajar con una base de datos SQLCE desde una aplicación, es necesario agregar una referencia a
System.Data.SqlServerCe para el proyecto. Esto se realiza seleccionando Agregar referencia en el menú Proyecto del
entorno de desarrollo. A continuación, seleccione el componente System.Data.SqlServerCe en el cuadro de diálogo Agregar
referencia.
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de la configu
ración activa o la edición. Para cambiar la configuración, elija la opción Importar y exportar configuraciones en el menú H
erramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Programación sólida
Para compilar y ejecutar el código, necesita lo que se indica a continuación; de lo contrario, se produce un error en la línea
da.Fill(dt); y se produce una excepción.

SQL Server CE instalado en el dispositivo.


Una tabla de base de datos en la que existan algunos datos para realizar pruebas en una base de datos SQLCE
denominada Database.sdf. Esta tabla se puede crear en el dispositivo usando herramientas SQL CE; también se puede
replicar desde un equipo de escritorio con SQL Server para generar el archivo .sdf. Puede agregar el archivo .sdf al
proyecto o copiarlo manualmente en el directorio especificado en la cadena de conexión.

Vea también
Referencia
Dispositivos inteligentes
SqlConnection
SqlCommand
Conceptos
Guía de programación de C#
DataSet de ADO.NET
Otros recursos
C# para desarrolladores de Java
Desarrollo de dispositivos inteligentes
Utilizar DataSets en ADO.NET
ADO.NET for the Java Programmer
Conceptos del lenguaje Visual C#

Tipos de aplicación de C# para programadores de Java


Los tipos de aplicación de C# incluyen aplicaciones de consola para Windows, aplicaciones de Windows Forms, aplicaciones
Web ASP.NET, aplicaciones de servicio Web ASP.NET, aplicaciones para dispositivos inteligentes, aplicaciones ActiveX y
aplicaciones de instalación e implementación.
Aplicaciones de consola
Las aplicaciones de consola utilizan la entrada y salida de línea de comandos estándar para entrada y salida, en lugar de un
formulario. Las aplicaciones de consola utilizan la clase System.IO para controlar la entrada y salida. El nombre de la clase se
puede utilizar delante de métodos como System.IO.Console.WriteLine() o se puede incluir una instrucción using al inicio
del programa. Las aplicaciones de consola son fáciles de crear mediante Visual Studio y otros entornos de desarrollo que
incluyan algún editor de texto, como el Bloc de notas de Microsoft® . Para obtener más información, vea
Introducción a Visual Studio, Crear aplicaciones de consola (Visual C#),
Hello World, su primer programa (Guía de programación de C#) y
Main() y argumentos de línea de comandos (Guía de programación de C#).
Aplicaciones de formularios
Las aplicaciones de formularios tienen la interfaz gráfica de usuario familiar de Windows con controles como botones y
cuadros de lista para la entrada de datos. Estas aplicaciones utilizan las clases del espacio de nombres System.Windows.Forms.
Las aplicaciones de formularios son fáciles de crear mediante Visual Studio y otros entornos de desarrollo que incluyan algún
editor de texto, como el Bloc de notas de Microsoft® . Para obtener más información sobre cómo crear una aplicación para
Windows, vea Cómo: Crear un proyecto de aplicación para Windows, Crear aplicaciones Web ASP.NET (Visual C#) y
Crear aplicaciones Web ASP.NET (Visual C#).
Aplicaciones Web ASP.NET
Las aplicaciones ASP.NET son aplicaciones Web que se muestran en un explorador Web, en lugar de mostrarse en una
aplicación de consola o formulario. Las aplicaciones ASP.NET utilizan el espacio de nombres System.Web y clases como
System.Web.UI para controlar la entrada y la salida del explorador. El nombre de la clase se puede utilizar delante de métodos
como using System.Web.UI.HtmlControls; o se puede incluir una instrucción using al inicio del programa. Las aplicaciones
ASP.NET son fáciles de crear mediante Visual Studio y otros entornos de desarrollo que incluyan algún editor de texto, como el
Bloc de notas de Microsoft® . Para obtener más información sobre cómo crear una aplicación ASP.NET, vea
Visual Web Developer. Para obtener más información sobre cómo crear aplicaciones ASP.NET mediante Visual Studio .NET, vea
Información general sobre aplicaciones ASP.NET en diagramas de aplicaciones. Para obtener más información sobre ASP.NET,
vea Aplicaciones Web ASP.NET en .NET Framework. Para obtener más información sobre cómo depurar una aplicación
ASP.NET, vea Depurar aplicaciones Web ASP.NET y Preparación de la depuración: aplicaciones Web ASP.NET.
Aplicación de servicio Web ASP.NET
Se puede obtener acceso a los servicios Web ASP.NET mediante direcciones URL, HTTP y XML, de manera que los programas
que se ejecuten en cualquier plataforma y lenguaje puedan tener acceso a los servicios Web ASP.NET. Las aplicaciones de
servicios Web ASP.NET se pueden mostrar en una consola, un formulario, un explorador Web o un dispositivo inteligente. Las
aplicaciones de servicios Web ASP.NET utilizan los espacios de nombres y clases System.Web y System.Web.Services. Las
aplicaciones de servicios Web ASP.NET son fáciles de crear mediante Visual Studio y otros entornos de desarrollo que incluyan
algún editor de texto, como el Bloc de notas de Microsoft®. Para obtener más información sobre cómo crear una aplicación de
servicios Web, vea Obtener acceso y mostrar datos (Visual C#) y Cómo: Crear un proyecto Servicio Web ASP.NET. Para obtener
más información sobre cómo agregar servicios Web ASP.NET a un proyecto existente, vea
Cómo: Agregar un servicio Web XML a un proyecto Web existente en código administrado. Para obtener más información
sobre los servicios Web ASP.NET, vea Tutorial: Crear y usar un servicio Web ASP.NET en Visual Web Developer y
Tutorial: Crear un servicio Web XML utilizando Visual Basic o Visual C#. Para obtener más información sobre cómo depurar
una aplicación de servicios Web ASP.NET, vea Preparación de la depuración: proyectos de servicio Web XML.
Otros temas relacionados con los servicios Web ASP.NET incluyen:
Generar clientes de servicios Web XML
Descripción de servicios Web XML
Cómo: Crear un método de servicio Web XML
Tutorial: Crear un servicio Web XML utilizando Visual Basic o Visual C#
Tutorial: Crear y usar un servicio Web ASP.NET en Visual Web Developer
How to use Visual Studio .NET 2003 to build and test an XML Web service
Aplicaciones para dispositivos inteligentes
Las aplicaciones para dispositivos inteligentes se ejecutan en dispositivos móviles como PDA y Smartphone. Estas aplicaciones
pueden ser aplicaciones de consola, aplicaciones de Windows Forms o clientes ASP.NET y Web que se muestran en una
consola, formulario o explorador Web. Las aplicaciones para dispositivos inteligentes utilizan los mismos espacios de nombres
y clases que las aplicaciones de escritorio. Sin embargo, estas aplicaciones utilizan Compact Framework en lugar de .NET
Framework. Para obtener más información sobre el desarrollo en un dispositivo móvil para Windows frente al desarrollo en un
escritorio, vea Desarrollar aplicaciones para dispositivos y para escritorio. Algunas versiones del entorno de desarrollo pueden
admitir el desarrollo de algunos o todos los tipos de aplicación de C# en dispositivos móviles. Para obtener más información
sobre cómo crear una aplicación ASP.NET, vea How to create a Smart Device Application y Smart Device Application Wizard.
Otros temas relacionados con los servicios Web ASP.NET incluyen:
Use Visual Studio .NET 2003 to build and test a mobile Web application
Desarrollar aplicaciones para dispositivos inteligentes
Smart Device Programmability Features of Visual Studio .NET
Consideraciones sobre el hardware de dispositivos inteligentes
Tutorial rápido de controles ASP.NET Mobile
Ejemplos de controles ASP.NET Mobile
Smart device Walkthroughs
Tutorial: Crear aplicaciones de Windows Forms para un dispositivo
Tutorial: Depurar formularios Windows Forms en proyectos de dispositivos

Controles ActiveX
De forma similar a Java Beans, un control ActiveX es un componente y corresponde a un "objeto OLE" y un objeto COM
(Modelo de objetos componentes). Un control ActiveX, en la forma más simple, es un objeto COM que admite la interfaz
IUnknown. Los controles ActiveX representan la arquitectura principal para desarrollar componentes de software
programables que pueden reutilizarse en varios contenedores diferentes, que incluyen desde Internet Explorer hasta
herramientas de programación de software y herramientas de productividad para el usuario final. Para obtener más
información sobre los controles ActiveX, vea:
Introduction to ActiveX
Packaging ActiveX Controls
Using ActiveX Controls to Automate Your Web
Designing Secure ActiveX Controls
Using ActiveX Controls with Windows Forms in Visual Studio .NET
Depurar un control ActiveX
Aplicaciones de instalación e implementación
Visual Studio proporciona plantillas para proyectos de instalación e implementación para equipos de escritorio, Web y
dispositivos inteligentes. Una versión diferente del entorno de desarrollo puede admitir la instalación e implementación para
algunos o todos los tipos de aplicación de C# en equipos de escritorio, Web y dispositivos móviles. Para obtener más
información al respecto, vea:
Implementar aplicaciones de .NET Framework.
Distribuir aplicaciones para dispositivos
Instalación de la aplicación en el dispositivo
Walkthrough: Generating Custom CAB files for Device projects
Cabinet Packaging: Internet Explorer Code Download and the Java Package Manager

Temas relacionados
Fundamentos de las operaciones de red de .NET Framework
Fundamentos de las aplicaciones de Windows Forms
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0
Ejemplos de .NET Framework
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Migrar a Visual C#
Ejemplos de código de C# para desarrolladores de Java
Lenguaje de programación C# para desarrolladores de Java
Introducción a Visual C#
Utilizar el entorno IDE de Visual C#
Referencia del Ayudante para la conversión del lenguaje Java

Convertir aplicaciones de Java a Visual C#


Microsoft Visual Studio 2005 proporciona la capacidad de convertir a Visual C#® los proyectos que se hayan creado en Visual
J++® versión 6.0 o que estén escritos en lenguaje Java, para que se puedan aprovechar las ventajas de .NET Framework. El
Ayudante para la conversión del lenguaje Java genera un nuevo proyecto de Visual C# a partir de un proyecto Visual J++ 6.0
existente o de unos archivos en lenguaje Java. El Ayudante para la conversión del lenguaje Java simplifica la tarea de convertir
los archivos existentes.
En esta sección
Lo nuevo en el Ayudante para la conversión del lenguaje Java 3.0
Enumera las características que incluye esta versión del Ayudante para la conversión del lenguaje Java.
Convertir proyectos de Visual J++ o en lenguaje Java a Visual C#
Describe cómo utilizar el Ayudante para la conversión del lenguaje Java.
Convertir aplicaciones Web
Describe cómo adaptar las aplicaciones Web al convertirlas con el Ayudante para la conversión del lenguaje Java.
Conversión de varios tipos de aplicaciones de Java
Aborda los procesos que deben seguirse y los problemas que pueden surgir al convertir distintos tipos de aplicaciones
utilizando el Ayudante para la conversión del lenguaje Java.
Mensajes de diagnóstico de JLCA clasificados por paquete
Proporciona una lista de mensajes de error generados por el Ayudante para la conversión del lenguaje Java.
Secciones relacionadas
Asistente para el Ayudante para la conversión del lenguaje Java
Describe cómo utilizar el asistente.
Conversión de bibliotecas de etiquetas personalizadas JSP
Proporciona una lista de clases de Java para las que se crean clases de soporte que emulan el comportamiento en tiempo de
ejecución de la etiqueta personalizada.
Compilar clases de servlet convertidas antes de abrirlas
Explica cómo abrir formularios Web Forms para las clases de servlet convertidas.
Solución de problemas: coincidencia de páginas de códigos
Describe qué hacer cuando hay páginas de códigos ausentes o no coinciden.
Actualizar manualmente código no convertido
Explica cómo actualizar un código que no se haya podido convertir automáticamente.
Referencia de C#
Proporciona información general sobre el lenguaje Visual C#.
Referencia del Ayudante para la conversión del lenguaje Java

Lo nuevo en el Ayudante para la conversión del lenguaje Java


3.0
Esta versión del Ayudante para la conversión de lenguaje Java incluye las siguientes características:
Compatibilidad para la conversión de aplicaciones de EJB
Compatibilidad para la conversión de aplicaciones CORBA
Compatibilidad para la conversión de aplicaciones RMI
Compatibilidad para la conversión de aplicaciones JMS
Compatibilidad para la conversión de aplicaciones serializadas
Compatibilidad para la conversión de aplicaciones que utilizan JNDI
Compatibilidad para la conversión de aplicaciones JAAS
Compatibilidad para la conversión de aplicaciones JCE
Compatibilidad para la conversión de aplicaciones Java Swing
Compatibilidad para la conversión de aplicaciones JAXP
Compatibilidad para la conversión de aplicaciones TRAX
Compatibilidad para la conversión de aplicaciones que utilizan JavaMail
Un modificador de propiedad para línea de comandos
EJB
Las Enterprise JavaBeans se convierten a clases del espacio de nombres System.EnterpriseServices para ofrecer compatibilidad
con todos los tipos de Enterprise JavaBeans: beans controladas por mensajes, beans de sesión y beans de entidad.
CORBA
Las clases CORBA (Common Request Broker Architecture) se convierten en clases del espacio de nombres
System.Runtime.Remoting para proporcionar compatibilidad con la informática distribuida.
RMI
Las clases RMI (Remote Method Invocation) se convierten en clases del espacio de nombres System.Runtime.Remoting para
proporcionar compatibilidad con las aplicaciones distribuidas y los objetos remotos.
JMS
Las clases JMS (Java Message Service) se convierten en clases del espacio de nombres System.Messaging, que utiliza la cola de
mensajes de Windows.
Aplicaciones serializadas
Las clases que implementan la interfaz java.io.Serializable se convierten para implementar la interfaz
System.Runtime.Serialization.ISerializable.
Aplicaciones que utilizan JNDI
Las clases de interfaz JNDI (Java Naming and Directory Interface) se convierten en las clases del espacio de nombres
System.DirectoryServices para proporcionar servicios de nombres y de directorios. Algunos métodos se convierten en
métodos System.Runtime.Remoting para dar soporte a operaciones remotas de RMI y CORBA.
JAAS
Las clases de JAAS (Java Authentication and Authorization Service) se convierten en clases del espacio de nombres
System.Security para proporcionar todos los servicios de seguridad y autenticación.
JCE
Las clases de JCE (Java Cryptography Extension) se convierten en clases del espacio de nombres System.Security.Cryptography
para proporcionar cifrado y descifrado de mensajes e incrementar la seguridad.
Java Swing
Las clases del paquete javax.swing se convierten en clases del espacio de nombres System.Windows.Forms para
proporcionar controles y componentes de la interfaz de usuario.
JAXP
Las clases de la API Java para procesamiento de XML (JAXP) se convierten en clases del espacio de nombres System.Xml. Se
admiten los modelos SAX y DOM.
TRAX
Las clases de la API de transformación para XML (Transformation API for XML) se convierten en clases del espacio de nombres
System.Xml.Xsl.
Aplicaciones que utilizan JavaMail
Las clases de la API JavaMail se convierten en clases del espacio de nombres System.Web.Mail con el fin de proporcionar
compatibilidad para la creación y envío de mensajes mediante SMTP (Protocolo simple de transferencia de correo).
Modificador de propiedad
Se proporciona un modificador de la línea de comandos (/ProcessGetSetOff) para poder elegir si se dejan los métodos
get/set/is como métodos o si se convierten en propiedades. De manera predeterminada, JLCA convierte estos métodos en
propiedades. Si lo prefiere, puede elegir no utilizar este modificador de la línea de comandos y dejar la mayoría de ellos como
métodos. Por compatibilidad con otras conversiones, los modelos siguientes siempre se convierten en propiedades:
Los métodos de ActiveX se convierten en propiedades concretas de .NET Framework.
Atributos CORBA.
Los métodos de descriptor de acceso, mutator y de comprobación del estado requeridos por .NET Framework.
Propiedades de .NET Framework generadas automáticamente.
Las páginas JSP que utilizan el método setProperty con la propiedad establecida en un carácter comodín (*) no se convierten
correctamente, porque el código SupportClass que se utiliza para emular la configuración de las propiedades de una 'bean'
espera una propiedad, en lugar de un método get/set.
Las propiedades de clases controladoras de Taglib se convierten en métodos get/set, y el código utilizado en la página ASPX
generada para establecer los valores de las propiedades dejará de funcionar, porque los controles personalizados usan
propiedades para establecer una correspondencia con los atributos ASPX en las etiquetas HTML personalizadas.
Si se llama a un método descriptor de acceso de un componente visual en un subproceso diferente del que posee el
componente, se convierte en el método Invoke, que devuelve un tipo object cuando se activa el indicador ProcessGetSetOff.
El valor devuelto debe convertirse al mismo tipo que el valor devuelto del método original.
Paquetes de lenguajes Java no compatibles
Debido a las diferencias entre la arquitectura de CORBA y .NET Framework Remoting, no se admiten los siguientes paquetes y
clases CORBA:
org.omg.CosNaming
org.omg.CosNamingContextExtPackage
org.omg.Dynamic
org.omg.IOP
org.omg.IOP.CodecFactoryPackage
org.omg.IOP.CodecPackage
org.omg.Messaging
org.omg.PortableInterceptor
org.omg.PortableInterceptor.ORBInitInfoPackage
Debido a las diferencias entre la arquitectura de Swing y los formularios Windows Forms, no se admiten los siguientes
paquetes Swing:
javax.swing.plaf
javax.swing.plaf.basic
javax.swing.plaf.metal
javax.swing.plaf.multi
Dado que contiene interfaces para implementar controladores de otros fabricantes, no se admite el paquete siguiente:
javax.sql

Vea también
Referencia
Modificadores de línea de comandos
Otros recursos
Convertir aplicaciones de Java a Visual C#
Conversión de varios tipos de aplicaciones de Java
Referencia del Ayudante para la conversión del lenguaje Java

Convertir proyectos de Visual J++ o en lenguaje Java a Visual


C#
Utilice el Ayudante para la conversión del lenguaje Java para convertir proyectos de Visual J++ 6.0 y archivos creados en
lenguaje Java para su desarrollo posterior en Visual C#. El Ayudante para la conversión de lenguaje Java no modifica el
proyecto existente, sino que crea un proyecto Visual C# nuevo basado en el proyecto original. Cualquier error, advertencia o
problema generado durante el proceso de conversión se muestra en un informe de conversión después de haber generado el
nuevo proyecto. Estos errores, advertencias o problemas también se anotan en comentarios del código convertido para
facilitar la conversión manual de las partes del proyecto que no puedan convertirse de forma automática.
Nota
Si todavía no está familiarizado con Visual C#, dedique un tiempo a conocer este lenguaje antes de intentar este proceso. Par
a obtener más información, vea Introducción al lenguaje C# y .NET Framework.

Nota
Los cuadros de diálogo y comandos de menú que verá en Visual Studio pueden variar con respecto a los descritos en la Ayu
da en función de su edición o configuración activa. Para cambiar la configuración, elija Importar y exportar configuracion
es en el menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Proyectos de Visual J++


Para convertir un proyecto de Visual J++
1. Inicie Visual Studio.
2. En el menú Archivo, elija Abrir y haga clic en Convertir.
3. Seleccione Ayudante para la conversión del lenguaje Java y haga clic en Aceptar.
4. En la página Archivos de código fuente, seleccione Proyecto de Visual J++ 6.0.
5. En la página Seleccionar un proyecto, haga clic en Examinar.
6. Busque el archivo .vjp correcto y selecciónelo.
Nota
Si la directiva CLASSPATH de su archivo .vjp especifica archivos .jar o .class, se omiten.

7. En la página Especificar un directorio para el nuevo proyecto, especifique el nombre y el directorio del nuevo
proyecto que se va a crear.
8. En la página Inicie la conversión, haga clic en Siguiente.
Proyectos en lenguaje Java
Para convertir un proyecto en lenguaje Java
1. Inicie Visual Studio.
2. En el menú Archivo, elija Abrir y haga clic en Convertir.
3. Seleccione Ayudante para la conversión del lenguaje Java y haga clic en Aceptar.
4. En la página Archivos de código fuente, haga clic en Directorio que contiene los archivos de proyecto.
5. En la página Seleccione el directorio de origen, haga clic en Examinar.
6. Busque el proyecto correcto y selecciónelo.
Nota
No verá los archivos en el directorio que seleccione, pero se convertirán todos los archivos .jav y .java que haya en el m
ismo. El Ayudante para la conversión del lenguaje Java omitirá la mayoría de los archivos no pertinentes, pero las carpe
tas de origen deben limpiarse antes de comenzar la conversión.

7. Agregue cualquier otro archivo necesario para su proyecto en el segundo cuadro de texto.
8. En la página Configurar el nuevo proyecto, especifique lo siguiente:
Nombre del proyecto que se va a crear.
Tipo de resultados del proyecto.
9. En la página Especificar un directorio para el nuevo proyecto, especifique el nombre y el directorio del nuevo
proyecto que se va a crear.
10. En la página Inicie la conversión, haga clic en Siguiente.
11. Corrija el código que no se pueda convertir de forma automática. Para obtener más información, vea
Actualizar manualmente código no convertido.
Vea también
Tareas
Actualizar manualmente código no convertido
Asistente para el Ayudante para la conversión del lenguaje Java
Solución de problemas: coincidencia de páginas de códigos
Referencia
Convertir (Cuadro de diálogo)
Modificadores de línea de comandos
Conceptos
Ayudante para la conversión del lenguaje Java
Referencia del Ayudante para la conversión del lenguaje Java

Asistente para el Ayudante para la conversión del lenguaje Java


Utilice el asistente para el Ayudante para la conversión del lenguaje Java con el fin de convertir proyectos de Visual J++ y Java
en Visual C#. Con el asistente, puede crear un proyecto nuevo y copiar archivos del proyecto original para realizar
conversiones de Visual J++ o de Java a Visual C#. Se genera un informe donde se detallan todos los errores, advertencias o
problemas detectados durante el proceso de conversión. Los errores, advertencias y problemas también aparecen como
comentarios en el código del nuevo proyecto y pueden verse en la lista de tareas.
Nota
Los cuadros de diálogo y comandos de menú podrían variar con respecto a los descritos en la Ayuda en función de la edición
o de la configuración activa. Para cambiar la configuración, elija Importar y exportar configuraciones en el menú Herram
ientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para obtener acceso al asistente para el Ayudante para la conversión del lenguaje Java
1. En el menú Archivo, elija Abrir y haga clic en Convertir.
2. Haga clic en Ayudante para la conversión del lenguaje Java y en Aceptar.
Nota de seguridad Por motivos de seguridad, debería revisar el código C# convertido desde Java utilizando la
herramienta Ayudante para la conversión del lenguaje Java. El código Java no seguro se convierte en código C# no
seguro. Además, la herramienta no migra el código de ciertas clases de Java, incluidas algunas relacionadas con la
seguridad como, por ejemplo, la autenticación. En estos casos, el informe de actualización indica el código que no se ha
migrado. Es importante revisar el informe e intentar solucionar los problemas de seguridad.
Vea también
Tareas
Convertir proyectos de Visual J++ o en lenguaje Java a Visual C#
Actualizar manualmente código no convertido
Conceptos
Ayudante para la conversión del lenguaje Java
Referencia del Ayudante para la conversión del lenguaje Java

Ayudante para la conversión del lenguaje Java


El Ayudante para la conversión del lenguaje Java es una herramienta que convierte proyectos en Visual J++ 6.0 y archivos en
lenguaje Java a Visual C#. Al convertir estos archivos a Visual C#, se puede aprovechar su base de código existente y sacar
partido de los beneficios de .NET Framework.
El nuevo proyecto Visual C# contiene todo el nuevo código Visual C# que se puede generar automáticamente desde el código
Visual J++ o Java existente. Para obtener más información, vea
Convertir proyectos de Visual J++ o en lenguaje Java a Visual C#.
Puede utilizar el Ayudante para la conversión de lenguaje Java para convertir las aplicaciones de Visual J++ o Java y proyectos
de subprograma. Se convierten de la forma siguiente:
Antes de la conversión Después de la conversión
Aplicaciones Aplicaciones de formularios Windows Forms

Subprogramas Controles de usuario Web

Páginas JSP o servlets Aplicaciones Web

Puede alojar controles de usuario Web convertidos en un explorador igual que haría con un subprograma. Los controles
alojados se declaran en páginas HTML con la etiqueta OBJECT, en lugar de con la etiqueta APPLET. Utilice el atributo classid
para identificar el control mediante la especificación de la ruta de acceso al control y el nombre completo del mismo separado
por el signo de número (#), tal como se muestra en el siguiente ejemplo:

<OBJECT id="myControl" classid="http:ControlLibrary1.dll#ControlLibrary1.myControl" VIEWAST


EXT></OBJECT>

Para que el control se muestre correctamente, el archivo .dll que contiene el control debe estar ubicado en el mismo directorio
virtual que la página Web que lo muestra, o bien, estar instalado en la memoria caché de ensamblados global.
Clases de soporte
Para convertir la funcionalidad del proyecto original que no está disponible en Visual C#, el Ayudante para la conversión del
lenguaje Java crea clases de soporte (también llamadas administradores) que duplican la funcionalidad original. Las clases de
soporte a veces son sustancialmente diferentes, desde el punto de vista arquitectónico, de las clases que emulan. Aunque se
intente conservar la arquitectura original de su aplicación en el proyecto convertido, el objetivo principal de estas clases de
soporte es duplicar la funcionalidad original.
Informe de conversión
Podría haber algún código en su proyecto que no pudo convertirse automáticamente. Después de ejecutar el asistente para el
Ayudante para la conversión del lenguaje Java, puede ver el informe de conversión que detalla todos los errores, advertencias
y problemas encontrados durante el proceso de conversión. El código no convertido se anota en el código del nuevo proyecto
mediante comentarios etiquetados con UPGRADE_TODO. Los comentarios de conversión pueden verse en la Lista de tareas.
Cada comentario de conversión contiene un enlace al tema de Ayuda que explica cómo convertir el código de forma manual.
Para obtener más información, vea Actualizar manualmente código no convertido.
Nota de seguridad
Debe revisar cualquier código de C# convertido de Java utilizando la herramienta Ayudante para la conversión del lenguaje J
ava para evitar problemas de seguridad. Cualquier código Java no seguro se convierte en código C# no seguro. Además, la h
erramienta no migra el código de ciertas clases Java, incluyendo algunas relacionadas con la seguridad, por ejemplo, la auten
ticación. En estos casos, el informe de la actualización indica el código que no se ha migrado. Es importante revisar el inform
e y solucionar cualquier problema de seguridad.

Vea también
Tareas
Convertir proyectos de Visual J++ o en lenguaje Java a Visual C#
Actualizar manualmente código no convertido
Otros recursos
Convertir aplicaciones de Java a Visual C#
Referencia del Ayudante para la conversión del lenguaje Java

Actualizar manualmente código no convertido


Una vez convertido el proyecto de Visual J++ o los archivos Java con el Ayudante para la conversión del lenguaje Java, el
nuevo proyecto Visual C# contendrá código que no se puede convertir automáticamente. Los comentarios se insertan en el
código del nuevo proyecto para ayudarle a convertir ese código a Visual C# manualmente.
Tipo de comentario Descripción
UPGRADE_TODO Código que no se puede convertir automáticamente.

UPGRADE_WARNING Código que puede dar problemas.

UPGRADE ISSUE Código que puede dar problemas.

UPGRADE_NOTE Código que puede mostrar diferente comportamiento al del código original.

También podría haber errores de compilación que deberán corregirse antes de compilar la aplicación. Cada comentario
contiene una breve descripción del problema y un enlace al tema de la Ayuda que explica cómo convertir el código.
Nota
Los cuadros de diálogo y comandos de menú podrían variar con respecto a los descritos en la Ayuda en función de la edición
o de la configuración activa. Para cambiar su configuración, elija Importar y exportar configuraciones en el menú Herra
mientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para actualizar manualmente código no convertido


Una vez ejecutado el Ayudante para la conversión del lenguaje Java, abra el proyecto en Visual Studio.
Vea también
Tareas
Convertir proyectos de Visual J++ o en lenguaje Java a Visual C#
Conceptos
Ayudante para la conversión del lenguaje Java
Referencia del Ayudante para la conversión del lenguaje Java

Solución de problemas: coincidencia de páginas de códigos


Si observa que el código contiene caracteres extraños tras la conversión, la causa más probable es la ausencia o la falta de
coincidencia de la página de códigos para la codificación de caracteres. El Ayudante para la conversión de lenguaje Java asigna
la codificación de la manera siguiente:
Los archivos codificados en la actual página de códigos ANSI del sistema conservan esta codificación después de la
conversión.
Cualquier otra codificación se convierte a la codificación UTF-8.
Los archivos Unicode que empiezan con una marca de orden de bytes Unicode se identifican automáticamente como Unicode.
Si un archivo no empieza con una marca de orden de bytes y no se especifica el modificador de codificación, se supone que el
archivo está en la actual página de códigos ANSI del sistema.
Para cambiar la página de códigos ANSI que está utilizando actualmente
1. Vaya al Panel de control y haga doble clic en Configuración regional (en Windows 2000) o Configuración regional
y de idioma (en Windows XP).
2. Haga clic en Avanzada y seleccione la página de códigos que desee.
Si la codificación de caracteres de los archivos de origen no es ANSI o si tiene archivos de origen Unicode que no empiezan
por una marca de orden de bytes, deberá utilizar el modificador de codificación.
El modificador de codificación puede especificar las siguientes codificaciones de caracteres:
Codificación Modificador
Alfabeto latino Nº 2 (Centroeuropeo) ISO-8859-2

Alfabeto latino Nº 3 ISO-8859-3

Alfabeto latino Nº 4 (Estados del Báltico) ISO-8859-4

Alfabeto latino/cirílico ISO-8859-5

Alfabeto latino/árabe ISO-8859-6

Alfabeto latino/griego ISO-8859-7

Alfabeto latino/hebreo ISO-8859-8

Alfabeto latino Nº 9 ISO-8859-15

Japonés EUC-JP

Coreano EUC-KR

Chino simplificado EUC-CN

Chino estándar nacional GB18030

UTF-8 sin marca de orden de bytes UTF-8

Para utilizar una codificación concreta, debe tener instalado el soporte correspondiente. Por ejemplo, para utilizar la
codificación GB18030 en un equipo con Windows 2000 Server, deberá descargar e instalar el paquete de soporte GB18030.
Vea la documentación del sistema para ver información detallada. Cuando utilice el modificador de codificación, todos los
archivos del proyecto deberán tener la misma codificación.
Si está utilizando un sistema de codificación incompatible con JLCA, es posible que pierda los caracteres que no se pueda
convertir. En algunos casos, puede perderse algún archivo.
Vea también
Conceptos
Cambiar codificación de respuesta
Referencia del Ayudante para la conversión del lenguaje Java

Modificadores de línea de comandos


La tabla siguiente muestra los modificadores de la línea de comandos disponibles en el Ayudante para la conversión del
lenguaje Java, versión 3.0.
Modificador Función
/? Imprime el mensaje.

/Out Especifica el directorio de destino. El valor predeterminado es \OutDir.

/Verbose Especifica que se generen resultados completos.

/NoLogo Especifica que no se muestre el título de copyright.

/NoLog Especifica que no se genere ningún registro.

/LogFile Especifica el nombre del archivo de registro.

/Encoding Especifica la codificación de los archivos de entrada.

/ProjectName Especifica el nombre del proyecto para la conversión de directorios.

/ProjectType Especifica el tipo de proyecto. Las opciones son EXE, WinExe, Library y ASP.NET. El valor predeterminado es
WinExe.

/VRoot Especifica la raíz virtual de los Servicios de Internet Information Server.

/ContextPath Especifica la ruta de acceso del contexto que se va a reemplazar por la raíz virtual.

/Domain Especifica el dominio que se va a reemplazar para las direcciones URL.

/NoExtensibility Deshabilita las asignaciones de extensibilidad.

/JDK Especifica la biblioteca JDK que se va a utilizar para la conversión. Las opciones son VJ y J2EE.

/ProcessGetSetO Deshabilita la conversión de propiedades.


ff
Modificador de propiedad
Se proporciona un modificador de la línea de comandos (/ProcessGetSetOff) para que pueda elegir si desea dejar los
métodos get/set/is como métodos o convertirlos en propiedades. De manera predeterminada, JLCA convierte estos métodos
en propiedades. Si prefiere, puede utilizar este modificador de la línea de comandos para dejar la mayoría como métodos. Para
que exista compatibilidad con otras conversiones, los modelos siguientes se convierten siempre en propiedades:
Los métodos de ActiveX se convierten en propiedades concretas en .NET Framework.
Los atributos CORBA.
Los métodos descriptores de acceso, mutadores y de comprobación de estado requeridos por .NET Framework.
Las propiedades .NET Framework generadas automáticamente.
Las páginas JSP que utilizan el método setProperty con la propiedad establecida en un carácter comodín (*) no se convierten
correctamente porque el código de SupportClass utilizado para emular el valor de las propiedades de beans espera una
propiedad, en lugar de un método get/set.
Las propiedades de clase de controlador Taglib se convierten en métodos get/set y el código utilizado en la página ASPX
generada para establecer los valores de propiedad se interrumpirá porque los controles personalizados utilizan propiedades
para realizar asignaciones a atributos ASPX en las etiquetas HTML personalizadas.
Si se llama a un método descriptor de acceso de un componente visual en un subproceso diferente del que posee el
componente, se convierte en el método System.Windows.Forms.Control.Invoke, que devuelve un tipo object si el indicador
ProcessGetSetOff está activado. El valor devuelto debe convertirse al mismo tipo que el valor devuelto del método original.
Vea también
Otros recursos
Convertir aplicaciones de Java a Visual C#
Referencia del Ayudante para la conversión del lenguaje Java

Convertir aplicaciones Web


Al convertir aplicaciones Web de JSP a ASP.NET, se necesita información adicional. El Ayudante para la conversión de lenguaje
Java establece el directorio raíz de la aplicación, mueve las clases de servlet a un directorio diferente, sustituye los vínculos y
resuelve los descriptores de biblioteca de etiquetas definidos en el archivo Web.xml. Puede establecer la ruta de acceso del
contexto y el dominio de aplicación de la aplicación Web para mejorar la conversión de direcciones URL.
En esta sección
Selección del tipo de conversión adecuado para una aplicación Web
Describe los tipos de conversión y la forma de elegir el tipo correcto para las aplicaciones Web.
Configuración de dominio de aplicación y ruta de acceso al contexto
Describe la configuración de la ruta de acceso del contexto y del dominio de aplicación para la conversión de una aplicación
Web.
Codificación del parámetro de solicitud
Explica la conversión de la codificación del parámetro de solicitud de Java a ASP.NET.
Diferencias en la estructura de directorios en aplicaciones Web
Describe cómo el Ayudante para la conversión del lenguaje Java modifica la estructura de directorios de las aplicaciones
Web.
Sustitución de vínculos
Describe el modo en que el Ayudante para la conversión de lenguaje Java reemplaza los vínculos de la aplicación Web
convertida.
Resolución de descriptores de biblioteca de etiquetas
Describe la conversión de los descriptores de biblioteca de etiquetas incluidos en el archivo Web.xml.
Cambiar codificación de respuesta
Explica cómo cambiar la codificación de respuesta de las aplicaciones que utilizan codificaciones distintas de UTF-8.
Conversión de bibliotecas de etiquetas personalizadas JSP
Explica cómo el Ayudante para la conversión del lenguaje Java controla las bibliotecas de etiquetas personalizadas JSP.
Compilar clases de servlet convertidas antes de abrirlas
Resuelve los problemas de conversión de las clases de servlet.
Ejemplos de fichas Web
Ilustra los métodos de diversas clases HTML.
Referencia del Ayudante para la conversión del lenguaje Java

Selección del tipo de conversión adecuado para una aplicación


Web
Para convertir una aplicación Web que contenga páginas JSP o clases de servlet, deberá elegir el tipo correcto de conversión y
resultado al configurar la conversión. Seleccione Directorio de archivos de lenguaje Java y establezca el tipo de resultado
para la aplicación Web.
Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Configuración de dominio de aplicación y ruta de acceso al


contexto
A la hora de convertir una aplicación Web, primero ha de seleccionar el tipo de resultado adecuado: aplicación Web.
Una vez introducida la raíz virtual de su aplicación Web, puede especificar un dominio de aplicación para mejorar la conversión
de vínculos en la aplicación. Si no especifica este dominio, todos los vínculos, incluidos los externos, se convertirán en vínculos
ASP.NET.
También puede especificar la ruta de acceso contextual de la aplicación.
Vea también
Conceptos
Selección del tipo de conversión adecuado para una aplicación Web
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Codificación del parámetro de solicitud


En el lenguaje Java, los contenedores de servlets codifican los parámetros de solicitud utilizando la codificación ISO 8859-1. Si
la aplicación Web utiliza una codificación diferente, normalmente contendrá el código de uno de los ejemplos.
Ejemplo
String text = request.getParameter("text");
text = new String( text.getBytes("ISO-8559-1"), charset )

El ejemplo siguiente muestra otra versión:

String text = request.getParameter("text");


BufferedReader reader = new BufferedReader(new InputStreamReader(new StringBufferInputStrea
m(text), charset));
text = reader.readLine();

En ambos casos, el parámetro charset es una cadena que representa la codificación de la solicitud que se desea descodificar.
En .NET Framework, este código es innecesario porque ASP.NET realiza automáticamente la descodificación con los
parámetros establecidos en el archivo Web.xml, como se muestra en el siguiente ejemplo.
Ejemplo
<globalization requestEncoding="euc-jp" responseEncoding="euc-jp"/>

Cuando se convierten las aplicaciones Web, se puede quitar el código de Java convertido que realiza esta función porque ya no
es necesario.
Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Diferencias en la estructura de directorios en aplicaciones Web


Cuando se convierte una aplicación Web, el Ayudante para la conversión del lenguaje Java establece una estructura de
directorios diferente para la nueva aplicación.
Todas las clases de servlet se mueven al directorio raíz de la aplicación Web. La estructura de directorios creada en el proceso
de conversión no corresponde necesariamente al directorio en el que se encontraba el servlet en el proyecto de lenguaje Java
original.
Ejemplo
En el ejemplo siguiente, el directorio raíz de la aplicación Web es \website\AppName. Las clases de servlet se mueven a un
directorio diferente en la estructura de directorios convertida.
Estructura original de directorios
mt\src
mt\src\com\ais\servlets
mt\src\com\ais\servlets\Servlet1.java
mt\src\com\ais\servlets\Servlet2.java
mt\src\com\ais\beans
mt\src\com\ais\beans\CatalogBean.java
mt\src\com\ais\customtags
mt\src\com\ais\customtags\TableTag.java
mt\misc\pack1\myclasses
mt\misc\pack1\myclasses\DbHelper.java
mt\website
mt\website\AppName
mt\website\AppName\jsp\
mt\website\AppName\jsp\Search.jsp
mt\website\AppName\jsp\content\Catalog.jsp
mt\website\AppName\html\Index.html
mt\website\AppName\images\Logo.gif
mt\website\AppName\WEB-INF
mt\website\AppName\WEB-INF\Web.xml
mt\website\AppName\WEB-INF\MyTags.tld

Directorios convertidos equivalentes


outdir\src
outdir\src\com\ais\beans
outdir\src\com\ais\beans\CatalogBean.cs
outdir\src\com\ais\customtags
outdir\src\com\ais\customtags\TableTag.cs
outdir\misc\pack1\myclasses
outdir\misc\pakc1\myclasses\Dbhelper.cs
outdir\website
outdir\website\AppName
outdir\website\AppName\com\ais\servlets\Servlet1.aspx
outdir\website\AppName\com\ais\servlets\Servlet2.aspx
outdir\website\AppName\jsp\
outdir\website\AppName\jsp\Search.aspx
outdir\website\AppName\jsp\content\Catalog.aspx
outdir\website\AppName\html\Index.html
outdir\website\AppName\images\Logo.gif
outdir\website\AppName\WEB-INF
outdir\website\AppName\WEB-INF\Web.xml
outdir\website\AppName\WEB-INF\MyTags.tld

Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Sustitución de vínculos
El Ayudante para la conversión del lenguaje Java sustituye todos los vínculos para que funcionen con la estructura de
directorios convertida. En esta sección se supone que la estructura de directorios está definida en
Diferencias en la estructura de directorios en aplicaciones Web.
Las direcciones URL y cómo cambiarlas
Existen básicamente tres tipos de direcciones URL:
Direcciones URL absolutas con información de dominio

http://www.example.com/servlet/pack1/Servlet1
http://www.example.com/page.jsp

Direcciones URL absolutas sin información de dominio

/servlet/pack1/Servlet1
/directory/page2.jsp

Direcciones URL relativas

pack1.Servlet1
page3.jsp

La dirección URL que utiliza un cliente para el acceso a una aplicación Web tiene el formato siguiente:

http://hoststring/ContextPath/resource

En este ejemplo, los elementos se definen de la manera siguiente:


hoststring
Nombre de host que se asigna a un host virtual o a hostname:portNumber.
ContextPath
Estructura de directorios para obtener acceso a la aplicación.
resource
Referencia a un archivo, una página JSP o un servlet tal como estén definidos en el archivo de configuración Web.xml.
El Ayudante para la conversión de lenguaje Java hace los cambios siguientes:
Cambia la ruta de acceso de contexto (si está presente) al nombre de la raíz virtual correspondiente que se definió en la
conversión, más la raíz de la aplicación Web.
Si no está presente la ruta de acceso de contexto, en el vínculo de inserta la raíz VROOT.
Si la extensión de archivo es .jsp, se cambia a .aspx.
Convierte las referencias del servlet buscándolas, utilizando el archivo de configuración Web.xml.
Ejemplo
Dirección URL original
http://hoststring/ContextPath/dir/JSP1.jsp?param1=1
http://HostNameProvided/dir/JSP1.jsp?param1=1

Dirección URL convertida equivalente


http://hoststring/VRoot/dir/JSP1.aspx?param1=1
http://HostNameProvided/VRoot/dir/JSP1.aspx?param1=1

Si el vínculo contiene el token de servlet y el nombre completo de un servlet, el token de token se elimina y los puntos (.) del
nombre completo se cambian por barras inclinadas (/). Si el vínculo al servlet es relativo, la referencia se modifica de modo
que incluya VROOT y la estructura de directorios del servlet convertida.
Ejemplo
Dirección URL original
http://hoststring/ContextPath/servlet/com.ais.servlets.Servlet1
com.ais.servlets.Servlet1

Dirección URL convertida equivalente


http://hoststring/VRoot/com/ais/servlets/Servlet1.aspx
/VRoot/com/ais/servlets/Servlet1.aspx

Si el token de servlet va seguido por un nombre de servlet que se encuentra en el archivo Web.xml, se inserta en el vínculo el
nombre completo del servlet.
Ejemplo
XML original
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.ais.servlets.Servlet1</servlet-class>
</servlet>

Dirección URL original


http://hoststring/ContextPath/servlets/test

Dirección URL convertida equivalente


http://hoststring/VRoot/com/ais/servlets/Servlet1.aspx

Si el nombre de la aplicación Web va seguido de un patrón definido en la asignación del servlet del archivo Web.xml, se
determina entonces el nombre del servlet y se inserta en el vínculo. El patrón puede contener caracteres comodín (*).
Ejemplo
XML original
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.ais.servlets.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/*.asp</url-pattern>
</servlet-mapping>

Dirección URL original


http://hoststring/ContextPath/abc.asp

Dirección URL convertida equivalente


http://hoststring/VRoot/com/ais/servlets/Servlet1.aspx

El Ayudante para la conversión de lenguaje Java no convierte los vínculos que se calculan en tiempo de ejecución. En su lugar,
debe cambiar el código manualmente para generar los vínculos ASP.NET adecuados. Esto se aplica a los casos siguientes:
Vínculos con las expresiones <%=%>, jsp:forward, jsp:include o jsp:execute y con las etiquetas HTML <a href> y <form
action>, donde el valor del parámetro de dirección URL se calcula en tiempo de ejecución.

Cualquier método javax.servlet cuyos parámetros representen una ruta de acceso a un recurso Web, por ejemplo, el
método Response.redirect donde se calcula el valor del parámetro de dirección URL en tiempo de ejecución.
Ejemplo
Código original en lenguaje Java
<jsp:include page="<%=value%>">

Código de Visual C# equivalente


<%-- //UPGRADE_TODO: Expected format of parameters of action jsp:include are different in t
he equivalent in .NET Framework --%>
<% Server.Execute(value)%>

Vea también
Conceptos
Diferencias en la estructura de directorios en aplicaciones Web
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Resolución de descriptores de biblioteca de etiquetas


Cuando el atributo uri de la directiva taglib hace referencia a un taglib-uri definido en el archivo Web.xml, la ubicación del
descriptor de biblioteca de etiquetas (TLD) se toma de ese archivo.
Ejemplo
XML original
<taglib>
<taglib-uri>/MYTEST</taglib-uri>
<taglib-location>WEB-INF/myTagLib.tld</taglib-location>
</taglib>

JSP original
<%taglib uri="/MYTEST" prefix="myTag"%>

TLD equivalente para analizar


/WEB-INF/myTagLib.tld

Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Cambiar codificación de respuesta


Cuando se convierte una aplicación Web de Java que contiene JSP y/o páginas HTML con una codificación de salida distinta de
UTF-8, puede cambiar la codificación de respuesta predeterminada de la aplicación Web ASP.NET generada modificando el
archivo Web.config. Busque el elemento Globalization y cambie el atributo responseEncoding a la codificación deseada.
Vea también
Tareas
Solución de problemas: coincidencia de páginas de códigos
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de bibliotecas de etiquetas personalizadas JSP


Debido a las diferencias entre las etiquetas personalizadas JSP y los controles de usuario Web .NET Framework, durante la
conversión se crea un conjunto de clases de soporte que emulan el procesamiento de las etiquetas personalizadas JSP. Estas
clases son la base de los controladores de clase de las etiquetas personalizadas JSP convertidas. Las clases de soporte se crean
para las siguientes clases del paquete javax.servlet.jsp.tagext:
Clase del lenguaje Java original Clase de soporte generada
BodyContent WCBodyContent

Tag WCBase

IterationTag WCIterationBase

BodyTag WCBodyBase

BodyTagSupport WCBodyImpl

TagSupport WCIterationImpl
Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Compilar clases de servlet convertidas antes de abrirlas


Cuando convierta clases de servlet, antes de abrir una página de formularios Web Forms para la aplicación deberá solucionar
todos los problemas de conversión y compilar el código. No podrá abrir la página de formularios Web Forms en la vista de
diseñador hasta que se compile el código. Si intenta abrirla antes de la compilación, recibirá un error.
Vea también
Otros recursos
Convertir aplicaciones Web
Referencia del Ayudante para la conversión del lenguaje Java

Ejemplos de fichas Web


El ejemplo de código siguiente ilustra los métodos de la clase System.Web.UI.HtmlTextWriter y muestra cómo crear varios
elementos HTML con un único control:
Ejemplo
using System;
using System.Web;
using System.Web.UI;
using System.Collections.Specialized;
namespace CustomControls
{
public class Rendered2 : Control, IPostBackDataHandler, IPostBackEventHandler
{
private String text1;
private String text2;
private String text = "Press button to see if you won.";
private int number = 100;
private int Sum
{
get
{
return Int32.Parse(text1) + Int32.Parse(text2);
}
}
public int Number
{
get
{
return number;
}
set
{
number = value;
}
}
public String Text {
get
{
return text;
}
set
{
text = value;
}
}
public event CheckEventHandler Check;
protected virtual void OnCheck(CheckEventArgs ce)
{
if (Check != null)
{
Check(this,ce);
}
}
public virtual bool LoadPostData(string postDataKey, NameValueCollection values)
{
text1 = values[UniqueID + "t1"];
text2 = values[UniqueID+ "t2"];
Page.RegisterRequiresRaiseEvent(this);
return false;
}
public virtual void RaisePostDataChangedEvent() {
}
public void RaisePostBackEvent(string eventArgument)
{
OnCheck(new CheckEventArgs(Sum - Number));
}
protected override void Render(HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.H3);
writer.Write("Enter a number:");
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Type,"Text");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID + "t1");
writer.AddAttribute(HtmlTextWriterAttribute.Value,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.H3);
writer.Write("Enter another number:");
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Type,"Text");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID + "t2");
writer.AddAttribute(HtmlTextWriterAttribute.Value,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Br);
writer.RenderEndTag();
writer.AddAttribute(HtmlTextWriterAttribute.Type,"Submit");
writer.AddAttribute( HtmlTextWriterAttribute.Name,this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value,"Submit");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height,"25 px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"100 px");
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Br);
writer.RenderEndTag();
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.Write(this.Text);
writer.RenderEndTag();
}
}
}
//CheckEvent.cs.
//Contains the code for the custom event data class CheckEventArgs.
//Also defines the event handler for the Check event.
using System;
namespace CustomControls
{
public class CheckEventArgs : EventArgs
{
private bool match = false;
public CheckEventArgs (int difference)
{
if (difference == 0)
{
match = true;
}
}
public bool Match
{
get
{
return match;
}
}
}
public delegate void CheckEventHandler(object sender, CheckEventArgs ce);
}

El ejemplo de código siguiente muestra cómo utilizar el constructor de la clase System.Web.UI.WebControls.WebControl para
crear un elemento TextArea de HTML y que aparezca en una página de formularios Web Forms:
<font face="Courier New" size="2" color="#000080">
<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void Button1_Click(Object sender, EventArgs e)
{
WebControl wc = new WebControl(HtmlTextWriterTag.Textarea);
PlaceHolder1.Controls.Add(wc);
}
</script>
</head>
<body>
<form runat="server">
<h3>WebControl Constructor Example</h3>
<p>
<asp:PlaceHolder id="PlaceHolder1" runat="Server" />
<br>
<asp:Button id="Button1" Text="Click to create a new TextArea" OnClick="Button1_Click" runa
t="Server" />
<p>
</form>
</body>
</html>

Utilice el método WriteBeginTag para escribir cualquier espaciado de tabulación y la etiqueta de apertura del elemento HTML
especificado en la secuencia de salida HtmlTextWriter.
Este método no escribe el carácter de cierre (>) de la etiqueta HTML para que se puedan agregar atributos HTML al elemento.
Utilice la constante TagRightChar para cerrar la etiqueta. Utilice WriteBeginTag con la constante SelfClosingTagEnd cuando
escriba elementos HTML de autocierre.
Este método lo utilizan los controles de servidor personalizados que no permiten la asignación de atributos o etiquetas y que
representan los elementos HTML de la misma manera para cada solicitud.

// Create a manually rendered tag.


writer.WriteBeginTag("img");
writer.WriteAttribute("alt", "AtlValue");
writer.WriteAttribute("myattribute", "No "encoding " required", false);
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteEndTag("img");
writer.WriteLine();
writer.Indent--;
writer.RenderEndTag();

Es posible obtener una instancia, como se muestra en el siguiente ejemplo:

HtmlTextWriterTag myTag;
myTag = HtmlTextWriterTag.Area;

Vea también
Referencia
System.Web
HtmlTextWriter
WebControl
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de varios tipos de aplicaciones de Java


En esta sección se abordan los procesos que deben seguirse y los problemas que pueden surgir al convertir distintos tipos de
aplicaciones utilizando el Ayudante para la conversión del lenguaje Java.
En esta sección
Conversión de aplicaciones JavaBeans
Explica la conversión de JavaBeans, incluido el procesamiento manual necesario.
Conversión de aplicaciones de EJB
Aborda los problemas principales relacionados con la conversión de aplicaciones que utilizan la tecnología de Enterprise
JavaBeans.
Conversión de aplicaciones CORBA
Explica el proceso de conversión para aplicaciones CORBA, incluidas las diferencias en arquitectura entre CORBA y .NET
Framework Remoting.
Conversión de aplicaciones RMI
Describe la conversión de aplicaciones RMI (Invocación de métodos remotos).
Conversión de aplicaciones JMS
Aborda los problemas que surgen al convertir aplicaciones JMS (Servicio de mensajes de Java).
Conversión de aplicaciones serializadas
Explica el proceso de conversión de aplicaciones que emplean la serialización.
Conversión de aplicaciones que utilizan JNDI
Describe los problemas de conversión de las aplicaciones que utilizan JNDI (Java Naming and Directory Interface).
Conversión de paquetes de datos
Aborda la conversión de aplicaciones de bases de datos.
Conversión de aplicaciones JAAS
Describe los problemas de conversión relacionados con las aplicaciones JAAS (Servicio de autenticación y autorización de
Java).
Conversión de aplicaciones JCE
Describe los problemas de conversión de las aplicaciones criptográficas.
Conversión de aplicaciones Java Swing
Describe los problemas de conversión relacionados con las aplicaciones Java Swing.
Conversión de controles ActiveX
Describe los problemas de conversión relacionados con los controles Microsoft ActiveX y los objetos ActiveX Automation.
Ejemplos de javax.swing
Proporciona ejemplos de código para la conversión de aplicaciones Java Swing, incluido el uso de la interfaz
IExtenderProvider, eventos definidos por el usuario y la propiedad DataSource de los controles de formularios Windows
Forms.
Cómo: Establecer el nivel de seguridad para servicios remotos
Describe cómo ajustar el nivel de seguridad predeterminado para permitir la serialización de objetos.
Secciones relacionadas
Convertir (Cuadro de diálogo)
Describe el cuadro de diálogo Convertir, donde puede seleccionar la herramienta de conversión para el proyecto.
Ejemplos de fichas Web
Proporciona ejemplos de código para la conversión de aplicaciones Web, mediante el uso de las clases
System.Web.UI.HtmlTextWriter y System.Web.UI.WebControl.
Modificadores de línea de comandos
Describe los modificadores de línea de comandos disponibles en el Ayudante para la conversión del lenguaje Java,
especialmente el modificador de propiedad.
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones JavaBeans


Antes de convertir una aplicación JavaBeans, asegúrese de que tiene un archivo de manifiesto. De lo contrario, se tratará como
cualquier otro archivo. El archivo de manifiesto debe tener el nombre MANIFEST.MF y estar en una carpeta denominada META-
INF. Puede cambiar el nombre del archivo existente si es necesario.
Sólo los JavaBeans identificados en el archivo de manifiesto siguiendo la convención estándar se convierten como tales. Por
ejemplo:

Name: x\y class


Java-Bean: True | False

En este ejemplo, x representa el paquete e y, el componente de la clase del Java Bean.


La identificación correcta de los Java Bean afecta tanto a la clase a la que se convierten como a la aplicación de la información
contenida en una clase BeanInfo asociada en el proceso de conversión. Por ejemplo, un objeto JPanel se convierte
normalmente en un objeto System.Windows.Forms.Panel. Sin embargo, si se identifica en el archivo de manifiesto como un
JavaBeans, se convierte en un objeto System.Windows.Forms.UserControl.
Los JavaBeans visuales que heredan de las clases java.awt.Panel o javax.swing.JPanel se convierten de manera que
hereden de la clase System.Windows.Forms.UserControl.
La información de las clases BeanInfo asociadas se aplica durante el proceso de conversión, pero no hay ningún equivalente
directo de estas clases en .NET Framework.
Vea también
Referencia
UserControl
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones de EJB


Al convertir una aplicación de Enterprise JavaBeans (EJB), en el proyecto convertido sólo se incluyen los archivos de interfaz y
de clase relacionados con EJB. Si su aplicación depende de otras clases de utilidad, debe agregarlas manualmente al proyecto.
De manera predeterminada, todas las clases de utilidad vienen incluidas en el proyecto de cliente y se pueden excluir
manualmente en caso necesario.
La búsqueda de nomenclatura se controla de manera diferente en .NET Framework, lo que produce errores de compilación
relacionados con el contexto de nomenclatura. El código relacionado puede marcarse como comentario en los archivos Visual
C#.
El componente de seguridad hay que establecerlo manualmente después de la conversión.
Puesto que los beans controlados por mensaje se convierten en componentes, se debe comprobar cualquier código que
escriba resultados en la consola.
Al implementar un componente, es necesario firmar el archivo DLL con un nombre seguro. Debe generar un archivo de clave e
integrarlo manualmente en el ensamblado.
Después de la implementación, revise los valores de transacción del componente convertido.
Si el componente se va a publicar en Windows 2000 Server, debe quitar la etiqueta PrivateComponent de todos los
componentes con servicio.
Después de instalar el proyecto de cliente, tendrá que agregar manualmente una referencia al componente con servicio.
Configuración de la transacción
Un componente con servicio se puede asociar a un atributo de transacción. En el lenguaje Java, los atributos de transacción se
pueden aplicar en el nivel de método. La tabla siguiente muestra los equivalentes de los atributos de transacción:
EJB .NET Framework
NotSupported NotSupported

Supports Supported

Required Required

RequiresNew RequiresNew

Obligatoria No hay equivalentes en .NET Framework

Nunca No hay equivalentes en .NET Framework

Durante la conversión, el Ayudante para la conversión del lenguaje Java intenta determinar el atributo de transacción de .NET
Framework que es más representativo para un componente, basándose en los atributos de transacción especificados en el
descriptor de implementación de EJB y en el número de veces que se asocia cada uno con un método de EJB. Si el atributo de
transacción de EJB que se especifica para un método no es equivalente al atributo de transacción de .NET Framework
seleccionado para el componente, se genera una advertencia en el código Visual C#. Busque estos mensajes de advertencia.
Configuración de seguridad
Mediante programación o a través del explorador de Servicios de componentes, se debe establecer la configuración de
seguridad de .NET Framework siguiente:
Autorización
Nivel de seguridad
Nivel de autenticación
Nivel de representación
Es necesario habilitar Authorization para realizar comprobaciones de seguridad. Establezca las propiedades de clase
System.EnterpriseServices.ApplicationAccessControlAttribute para habilitar la comprobación de seguridad. Estas propiedades
se utilizan para configurar el resto de los valores (seguridad, autenticación y niveles de representación).
Se puede forzar Security en el nivel de proceso, o en el nivel de proceso y de componente. La enumeración
System.EnterpriseServices.AccessChecksLevelOption define las opciones siguientes:
Application
ApplicationComponent
Cuando las comprobaciones de seguridad sólo se realizan en el nivel de proceso, los valores de seguridad basada en funciones
se omiten y se deshabilitan en los niveles de interfaz, componente y método. Establezca las aplicaciones convertidas en el nivel
de seguridad ApplicationComponent.
El nivel de Authentication controla la manera en que se autentican las identidades de usuario respecto de una aplicación de
.NET Framework. Utilice uno de los siguientes valores de la enumeración System.EnterpriseServices.AuthenticationOption:
System.EnterpriseServices.AuthenticationOption.None
Connect
Call
Packet
Integrity
Privacy
El nivel de autenticación predeterminado es Packet. En este nivel se autentica cada paquete que viene de un usuario.
Establezca las aplicaciones convertidas en el nivel de autenticación Packet.
Impersonation hace referencia a cómo se difunde la identidad de seguridad de un cliente cuando obtiene acceso a otra
aplicación o a los recursos protegidos de la aplicación original. Así, un servidor puede suplantar a un cliente hasta cierto punto.
La enumeración System.EnterpriseServices.ImpersonationLevelOption proporciona las opciones siguientes:
Anonymous
Default
Delegate
Identify
Impersonate
El nivel de representación predeterminado para las aplicaciones de .NET Framework es Impersonate. Este nivel permite que
un servidor actúe como el cliente. Sin embargo, el servidor no podrá obtener acceso en nombre del cliente a los objetos o
recursos ubicados en otros equipos. Establezca las aplicaciones convertidas en el nivel Impersonate.
Problemas
JLCA convierte proyectos de EJB en aplicaciones COM. Si la carpeta del archivo de origen de EJB contiene un archivo JAR y un
archivo Ejb-jar.xml de descriptor de implementación, en el proyecto convertido se generan dos aplicaciones porque también se
analiza el descriptor de implementación que incluye el archivo JAR.
Al convertir un EJB, se realiza un intento para asignar un atributo de transacción de .NET a su componente con servicio. Si
globalmente se asignan atributos de transacción diferentes a las interfaces locales y remotas de un EJB, no se asignará ningún
atributo de transacción de .NET. Tampoco se asignará ningún atributo de transacción de .NET cuando se haya asignado
globalmente un atributo de transacción a una interfaz y la otra interfaz tenga asignados únicamente métodos específicos. Las
asignaciones de atributos de transacción de métodos específicos sólo se utilizarán para determinar el atributo de transacción
de .NET en el caso de que no existan asignaciones globales de atributos de transacción. Dado que los componentes con
servicio de .NET controlan los atributos de transacción de manera diferente a como lo hace el lenguaje Java, revise los valores y
realice cualquier ajuste necesario.
Durante la conversión se agrega la comprobación de seguridad predeterminada, lo que quizás no sea necesario en su
proyecto. Si su código fuente de Java establece o excluye unos métodos específicos para las funciones de seguridad, revise los
valores después de la conversión.
Vea también
Referencia
System.EnterpriseServices
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones CORBA


Antes de que convierta una aplicación CORBA, asegúrese de que contiene un archivo OMG IDL. De lo contrario, los archivos
Java se tratarán como cualquier otra clase.
Conversion
Asegúrese de que ningún código innecesario está incluido en el código para esqueletos o en los códigos auxiliares de sus
archivos de código fuente. Este código se perderá con la conversión.
El directorio que especifique como destino deberá estar incluido en CLASSPATH.
Las aplicaciones CORBA se convierten de manera predeterminada al entorno remoto de .NET Framework a través de HTTP.
Esto significa que la aplicación convertida ya no utiliza clientes y servidores de CORBA .
El entorno remoto de .NET Framework utiliza conexiones de cliente-servidor directas, sin que intervenga el servicio de
denominación ni el nivel medio. Por tanto, no hay ningún intermediario de solicitudes de objetos (ORB).
Gran parte del código necesario para crear el servicio de nombres de CORBA resulta innecesario en .NET Framework
Remoting. Esto incluye las clases y colecciones empaquetadas normalmente en una tabla hash o matriz de propiedades.
Marque como comentario todas las referencias a las clases de los paquetes siguientes:
org.omg.CosNaming
org.omg.CosNamingContextPackage
Las aplicaciones CORBA primero deben obtener el contexto de nomenclatura. El Ayudante para la conversión del lenguaje Java
trata esto como una búsqueda remota, lo que no es necesario en .NET Framework Remoting. La siguiente línea de código
puede marcarse como comentario:

NamingContext ncRef = (org.omg.CosNaming.NamingContext) Activator.GetObject(typeof(org.omg.


CosNaming.NamingContext), "http://<Host>:<Port>/<Name>");

Cuestiones de seguridad
En .NET Framework, el nivel de seguridad predeterminado para la comunicación distribuida (interacción remota) es low. Esto
afecta al paso del tipo de objeto definido por el usuario a los métodos remotos. Para obtener más información, vea
Cómo: Establecer el nivel de seguridad para servicios remotos.
Vea también
Referencia
System.Runtime.Remoting
Conceptos
Conversión de aplicaciones que utilizan JNDI
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones RMI


En el lenguaje Java, RMI (Invocación de métodos remotos) implica tres partes: un servidor, un cliente y un Registro de objeto.
Cuando se compila la aplicación de servidor, se generan dos archivos: un archivo "esqueleto" en el servidor y un archivo de
"código auxiliar" en el cliente. Los dos se utilizan para administrar la invocación a método y la transferencia de datos
internamente, el archivo esqueleto en el servidor y el archivo de código auxiliar en el cliente.
La conversión de clientes y servidores RMI a .NET Framework no produce clientes RMI en Visual C# . En su lugar, se utiliza .NET
Framework Remoting de manera predeterminada en HTTP. No se genera ningún archivo adicional (comparable a archivo
esqueleto ni al de código auxiliar) porque la invocación de método y la transferencia de datos se controlan internamente.
El cliente RMI solicita un objeto remoto enviando una dirección URL de cadena. Esta cadena tiene la forma siguiente:
rmi:/host:port/name, donde port es el puerto utilizado por el servidor para registrar el objeto remoto. (El valor predeterminado
es 1099).
En .NET Framework, la cadena de dirección URL identifica el protocolo de canal que se va a utilizar y tiene la forma siguiente:
protocol://host:port/name. port es el puerto registrado por el servidor para realizar escuchas de las solicitudes de cliente.
En el lenguaje Java, un objeto se identifica como remoto por el hecho de que extiende la clase
java.rmi.server.UnicastRemoteObject y todos sus métodos producen errores RemoteException. Casi todas las
excepciones que heredan de RemoteException se convierten en los errores System.Runtime.Remoting.RemotingException. Si
su aplicación controla subclases RemotingException concretas de manera diferente, debe ajustarlas manualmente.
En .NET Framework, los objetos remotos se pueden identificar por el hecho de que derivan de la clase
System.MarshalByRefObject.
Cada interfaz RMI se coloca en un proyecto de Visual Studio independiente durante la conversión. Debe actualizar las
referencias de proyecto para incluir los ensamblados de interfaz remotos. Si los puntos de entrada del cliente y el servidor
están incluidos en el árbol de origen convertido, el código de salida debe separarse en proyectos independientes de Visual
Studio. Los proyectos de cliente y servidor necesitan una referencia al ensamblado DLL compartido.
Cuestiones de seguridad
En .NET Framework, el nivel de seguridad predeterminado para la comunicación distribuida (remota) es low. Esto influye en el
paso del tipo de objeto definido por el usuario a los métodos remotos. Para obtener más información, vea
Cómo: Establecer el nivel de seguridad para servicios remotos.
Vea también
Referencia
RemotingException
MarshalByRefObject
Conceptos
Conversión de aplicaciones que utilizan JNDI
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones JMS


Las aplicaciones Java Message Services (JMS) se convierten para utilizar la cola de mensajes de Windows. Por tanto, el código
para crear las conexiones, los generadores de conexiones y las sesiones se marca como comentario durante la conversión.
Debe quitar las variables relacionadas en otros lugares del código. Omita el código relacionado con propiedades y la JNDI en el
código de Visual C#.
El modo de editor/suscriptor se convierte exactamente de la misma manera que el modo de punto a punto.
No se admiten los siguientes elementos de JMS:
Temas
Suscriptores duraderos
Selectores de mensajes
Agentes de escucha de excepciones
Debe elegir uno de los mecanismos siguientes para utilizar la mensajería con destino múltiple en .NET Framework:
Listas de distribución
Nombres de formato de varios elementos
Direcciones de multidifusión
Cada uno de estos mecanismos utiliza un valor de cadena para hacer referencia a la cola de destino y se establece en la
propiedad System.Messaging.MessageQueue.Path.
Debe cambiar manualmente cadenas que hacen referencia a una cola o tema para utilizar la cola de mensajes de Windows. El
objeto TemporaryQueue se convierte en una cola física que debe eliminarse explícitamente.
Las colas de transacción se controlan de manera diferente en .NET Framework. Debe configurar las colas transaccionales y
volver a escribir la administración de transacciones, utilizando los objetos System.Messaging.MessageQueueTransaction.
La confirmación del mensaje se administra automáticamente en .NET Framework. Si tiene la confirmación manual de mensajes
en el código, debe quitarla.
Si una conexión no está disponible, la cola de mensajes de Windows no intenta conectar de nuevo.
No se convierten los objetos XA. Las transacciones distribuidas deben volver a escribirse en .NET Framework.
Las aplicaciones convertidas no pueden interactuar con los MOM compatibles con JMS.
Vea también
Referencia
System.Messaging
MessageQueueTransaction
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones serializadas


En el lenguaje Java, los objetos serializables se identifican por el hecho de que implementan la interfaz java.io.Serializable,
directamente o a través de herencia. .NET Framework utiliza la interfaz System.Runtime.Serialization.ISerializable de una
manera similar, pero también se puede utilizar el atributo SerializableAttribute. Por consiguiente, no es posible determinar si
puede serializarse mediante programación un objeto en tiempo de ejecución. Ponga cuidado en cualquier método que recibe o
devuelve la interfaz Serializable en código de Java. No es intercambiable con el equivalente en .NET Framework y los
métodos no pueden leer o escribir entre sí.
En el lenguaje Java, las clases serializables normalmente implementan los métodos readObject y writeObject. El método
writeObject se convierte en un constructor sobrecargado y readObject en el método GetObjectData. En la mayoría de los
casos, el código convertido se compila y se ejecuta sin ninguna modificación más. Sin embargo, representa un cambio
principal en la definición de clases con código de cálculo y de resolución de referencias personalizado.
Vea también
Referencia
ISerializable
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones que utilizan JNDI


Para que la aplicación convertida retenga la funcionalidad, en ambos entornos deben estar disponibles los mismos
proveedores de servicios. Sólo LDAP/ActiveDirectory es compatible tanto en lenguaje Java como en .NET Framework.
Los métodos JNDI que normalmente son compatibles con los servicios de nomenclatura y de directorio se convierten en
métodos del espacio de nombres System.DirectoryServices. Los métodos que normalmente son compatibles con RMI y
CORBA se convierten al espacio de nombres System.Runtime.Remoting. Puesto que algunos pueden servir para un doble
propósito, en el código convertido quizás sea necesario cambiar algunos métodos System.Runtime.Remoting a métodos
System.DirectoryServices.
En el lenguaje Java, se pueden crear instancias para el contexto mediante un constructor que acepte una tabla hash de
definición de entorno. La clase System.DirectoryServices.DirectoryEntry no tiene ningún constructor de ese tipo.
La ruta de acceso de entrada de directorio que identifica el proveedor distingue entre mayúsculas y minúsculas y debe
cambiarse, por ejemplo, de ldap a LDAP.
En el lenguaje Java, los parámetros de búsqueda se definen independientemente del contexto y, a continuación, pasan al
método de búsqueda de contexto. En .NET Framework, los parámetros de búsqueda se definen junto con la entrada de
directorio que se va a buscar mediante la creación de un objeto System.DirectoryServices.DirectorySearcher. Será necesario
que realice modificaciones en su código para alojar esta diferencia.
En lugar de los métodos DirContext.bind y DirContext.rebind, utilice la clase System.DirectoryServices.DirectoryEntry y
sus clases asociadas para agregar los objetos al directorio o reemplazarlos.
En lugar de Context.createSubcontext, utilice el método
System.DirectoryServices.DirectoryEntries.Add(System.String,System.String) y establezca las propiedades de la nueva entrada.
Todos los métodos Context que tienen un equivalente en el paquete javax.rmi.naming se convierten en métodos
System.Runtime.Remoting.RemotingServices. Entre éstos se incluyen Context.bind, Context.lookup, Context.rebind y
Context.unbind.
El paquete javax.naming.ldap no es compatible.
Vea también
Conceptos
Conversión de aplicaciones CORBA
Conversión de aplicaciones RMI
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de paquetes de datos


Las aplicaciones que utilizan los paquetes java.sql y javax.sql se convierten en el espacio de nombres System.Data.OleDb. Si
utiliza un sistema de base de datos diferente, puede convertir estas referencias al cliente de su sistema, por ejemplo,
System.Data.SQLClient o System.Data.ODBC.
Los proveedores de datos de .NET Framework agrupan las conexiones automáticamente. La agrupación de conexiones puede
configurarse para cada proveedor de datos, es decir, ODBC, OLEDB y SQL Server.
Debe convertir todas las cadenas de conexión al formato .NET Framework. Los siguientes ejemplos muestran cómo convertir
los distintos tipos de conexiones a la base de datos.
Ejemplo
El siguiente ejemplo muestra cómo utilizar el puente JDBC-ODBC:
Código de Visual J++ original
String dbUrl = "jdbc:odbc:BiblioODBC";
Connection c = DriverManager.getConnection(dbUrl);

Equivalente en Código Visual C#


String dbUrl = "Provider = MSDASQL; DSN = BiblioODBC";
ODBCConnection c = "DriverManager.getConnection(dbUrl);

El ejemplo siguiente muestra cómo utilizar una dirección URL de Microsoft SQL Server:
Código de Visual J++ original
String dbUrl = "jdbc:microsoft:sqlserver://MySQLServer:1433; DatabaseName=pubs";
Connection c = "DriverManager.getConnection(dbUrl, username, pwd);

Equivalente en Código Visual C#


String dbUrl = "Provider = SQLOLEDB; DataSource = MySQLServer; Initial Catalog = pubs";
SQLConnection c = DriverManager.getConnection (dbUrl + "; User ID = " + username + "; PWD +
" + pwd);

Cadena de conexión original de Oracle


El ejemplo siguiente muestra cómo cambiar una cadena de conexión a bases de datos de Oracle:

String jdbcUrl = "jdbc:oracle:thin:@localhost:1521:ORCL";


conn = DriverManager.getConnection(jdbcUrl, user, password);

Equivalente en Código Visual C#


String jdbcUrl = "Provider = MSDAORA; Data Source = localhost:1521;";
OracleConnection conn = DriverManager.getConnection(jdbcUrl + "User ID = " user + "; Passwo
rd = " + password);

Los conjuntos de resultados actualizables y desplazables no se convierten de forma fiable. Aunque se proporciona una clase de
soporte, será necesario algún ajuste manual. Si su aplicación depende en gran medida de dichos conjuntos de resultados,
utilice la clase System.Data.DataView o System.Data.DataTable, en lugar de la clase System.Data.OleDb.OleDbDataReader, a la
que se convierten automáticamente.
Los tipos de datos Clob y Blob se convierten en matrices de caracteres y bytes, respectivamente, que tienen un
comportamiento diferente y pueden utilizar más memoria. El código convertido obtiene los datos secuencialmente y crea la
matriz. Es recomendable escribir la secuencia de datos en un archivo de disco. También se puede utilizar la clase
System.Data.OracleClient.OracleLob, utilizada para representar el tipo de datos Large Object Binary en un servidor de Oracle.
Algunos tipos de datos nuevos como STRUCT, ARRAY o los tipos definidos por el usuario no se admiten en .NET Framework.
La clase System.Data.OracleClient.OracleBFile administrada funciona con el tipo de datos BFile de Oracle.
Los tipos de datos de acceso son específicos del tipo de base de datos. Todo el código JDBC se convierte en tipos OLEDB
porque los controladores OLEDB están disponibles para la mayoría de las bases de datos. En algunos casos, es recomendable
cambiar esto después de la conversión para obtener mejor rendimiento o compatibilidad. Otros adaptadores de datos
disponibles en .NET Framework son ODBC, SQL y Oracle.
No se asignan DataSources; sin embargo, en algunos casos OleDbConnection o cualquier otra clase de conexión de cliente
bajo el espacio de nombres System.Data puede utilizarse para representar parte de la funcionalidad. Las funciones de registro
de la interfaz javax.sql.DataSource pueden implementarse mediante la clase System.Diagnostics.EventLog.
El paquete javax.sql no se convierte de forma fiable. Las interfaces en ese paquete deben ser implementadas por
controladores de otros fabricantes.
La interfaz Driver y la clase DriverManager han quedado en desuso, por lo que ya no son necesarias. Algunos de sus
métodos pueden convertirse, pero son innecesarios.
Vea también
Referencia
System.Data.OleDb
System.Data.SqlClient
System.Data.Odbc
DataAdapter
DataTable
OleDbDataReader
Conceptos
Descripción de agrupación de conexiones
Uso de agrupación de conexiones
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones JAAS


.NET Framework utiliza la seguridad basada en funciones con las clases principales, de identidad y de permiso para controlar la
seguridad. Puede elegir uno de los módulos de seguridad integrados dentro de .NET Framework, en lugar de generar uno.
Cuando convierta las aplicaciones Java Authentication and Authorization Service (JAAS) a .NET Framework, debe tener en
cuenta las diferencias entre las dos opciones de seguridad.
Se debe cambiar el nombre a todos los archivos de configuración JAAS por el de JAAS.config para que el Ayudante para la
conversión del lenguaje Java los pueda procesar. Se convierten en archivos App.config que se pueden utilizar mediante
métodos de clase de soporte para obtener módulos de autenticación y registrarlos con el administrador de autenticación.
La clase LoginContext se convierte en la clase estática System.Security.AuthenticationModule que tiene un
comportamiento diferente.
La clase LoginModule se convierte en la interfaz IAuthenticationModule. En el lenguaje Java, el objeto LoginContext registra
un objeto LoginModule que utiliza los controladores de devolución de llamada para solicitar una entrada del usuario y un
módulo de inicio de sesión para autenticar a los usuarios. En .NET Framework, los módulos de autenticación se registran con el
administrador de autenticación que recorre los módulos de autenticación registrados para devolver la información de
autorización.
Se utiliza una System.Security.SecurityException genérica en lugar de las distintas excepciones JAAS.
La clase Subject se convierte en la clase estática System.Security.Principal.GenericPrincipal que tiene un comportamiento
diferente. Hay también una clase System.Security.Principal.WindowsPrincipal que se puede utilizar con la autenticación de
Windows.
Vea también
Referencia
System.Security
System.Security.Principal
GenericPrincipal
WindowsPrincipal
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones JCE


En el lenguaje Java, se utilizan interfaces o clases genéricas como clases base para todas las clases de cifrado. En .NET
Framework, la clase System.Security.Cryptography.AsymmetricAlgorithm es la clase base para todos los algoritmos de clave
pública. Durante la conversión, la clase de soporte CryptoSupport se genera como clase contenedora de la clase
System.Security.Cryptography.SymmetricAlgorithm. Debe volver a implementar manualmente los algoritmos asimétricos.
En el lenguaje Java, el método Cipher.getInstance genera todos los tipos de algoritmo de cifrado con un literal de cadena que
indica el tipo de cifrado. Cada tipo de cifrado utiliza una clase separada en .NET Framework. Se proporciona un conjunto
relativamente limitado de clases de cifrado.
Vea también
Referencia
System.Security.Cryptography
SymmetricAlgorithm
AsymmetricAlgorithm
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de aplicaciones Java Swing


Las aplicaciones Swing se convierten al espacio de nombres System.Windows.Forms. Por tanto, los elementos Swing
siguientes no tienen ningún equivalente directo en Visual C# y no se pueden convertir.
No se admite el paquete javax.swing.plaf. No hay ningún equivalente en .NET Framework a las clases que encapsulan
la apariencia y el funcionamiento adaptables de Swing ni métodos que hagan referencia a ellos.
No se admiten representadores y editores.
No se admiten diseños de Java AWT. Aunque éstos no son específicos de Swing, afectan a la mayoría de las aplicaciones
Swing.
Los elementos siguientes tienen compatibilidad limitada o requieren una cantidad importante de adaptación manual después
de la conversión con el Ayudante para la conversión del lenguaje Java:
Los modelos sólo se admiten parcialmente.
Las clases como JTree y JTable no se pueden convertir directamente en sus equivalentes en .NET Framework a causa de
su dependencia de los modelos. Las clases de soporte se implementan para ayudar a establecer la correspondencia con
estas clases, pero no todos los elementos pueden asignarse.
La clase ContentPane y otros contenedores de nivel del intermedio no se pueden convertir directamente. Por ejemplo,
el objeto JFrame contiene controles en el panel de contenido, pero la clase .NET Framework
System.Windows.Forms.Form contiene controles en sí misma, sin ningún objeto intermedio. Esto produce problemas de
herencia y la conversión requiere una cantidad importante de datos proporcionados por el usuario.
Las clases cuyo comportamiento viene definido por valores constantes no se pueden convertir por completo de manera
automática. Por ejemplo, la clase FileDialog tiene una constante que especifica si abre o guarda un archivo. En Visual C#,
este control se realiza por medio de dos clases independientes.
El control de eventos está integrado en un modelo diferente en .NET Framework, por lo que todos los eventos Swing
requieren adaptación manual después de la conversión. Se incluye un ejemplo de conversión del control de eventos en el
tema Ejemplos de javax.swing.
Vea también
Referencia
Mensajes de error de javax.swing
System.Windows.Forms
Conceptos
Ejemplos de javax.swing
Referencia del Ayudante para la conversión del lenguaje Java

Conversión de controles ActiveX


El paquete com.ms.wfc.ax contiene clases e interfaces para los controles Microsoft ActiveX y los objetos ActiveX Automation.
En .NET Framework, los formularios Windows Forms sólo puede alojar controles de formularios Windows Forms. Los
controles ActiveX deben ajustarse para que aparezcan como controles de formularios Windows Forms en una clase de
contenedor que se derive de la clase System.Windows.Forms.AxHost.
Los componentes ActiveX se pueden convertir de cualquiera de las siguientes maneras:
Visual Studio convierte automáticamente los tipos COM de una biblioteca de tipos en metadatos de un ensamblado.
La importación de bibliotecas de tipos proporciona modificadores de la línea de comandos para ajustar los metadatos y
generar un ensamblado de interoperación y un espacio de nombres.
Los contenedores personalizados son la opción más laboriosa, pero se pueden individualizar para que satisfagan las
necesidades de la aplicación.
Vea también
Referencia
AxHost
Referencia del Ayudante para la conversión del lenguaje Java

Ejemplos de javax.swing
El siguiente ejemplo muestra cómo utilizar los extensores para proporcionar propiedades a los controles mediante la interfaz
System.ComponentModel.IExtenderProvider:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Globalization;
namespace Extenders
{
[ProvideProperty("MyString", typeof(Control))]
public class UserControl1 : System.Windows.Forms.UserControl, IExtenderProvider
{
private System.ComponentModel.Container components = null;
public UserControl1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Component Designer generated code
private void InitializeComponent()
{
this.Name = "UserControl1";
this.Size = new System.Drawing.Size(170, 160);
}
#endregion
[Browsable(true)]
public String GetMyString(Control control)
{
return "This is my string.";
}
public void SetMyString(Control container, String value)
{
}
public bool CanExtend(Object control)
{
return true;
}
}
}

El siguiente ejemplo muestra cómo implementar el control y generación de eventos definidos por el usuario:

namespace EventSample
{
using System;
using System.ComponentModel;
//Class that contains the data for
//the alarm event. Derives from System.EventArgs.
public class AlarmEventArgs : EventArgs
{
private readonly bool snoozePressed;
private readonly int nrings;
public AlarmEventArgs(bool snoozePressed, int nrings)
{
this.snoozePressed = snoozePressed;
this.nrings = nrings;
}
//The NumRings property returns the number of rings
//that the alarm clock has sounded when the alarm event
//is generated.
public int NumRings
{
get { return nrings;
}
}
//The SnoozePressed property indicates whether the snooze
//button is pressed on the alarm when the alarm event is generated.
public bool SnoozePressed
{
get {return snoozePressed;}
}
//The AlarmText property that contains the wake-up message.
public string AlarmText
{
get
{
if (snoozePressed)
{
return ("Wake up! Snooze time is over.");
}
else
{
return ("Wake Up!");
}
}
}
}
//Delegate declaration.
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
//The Alarm class that raises the alarm event.
public class AlarmClock
{
private bool snoozePressed = false;
private int nrings = 0;
private bool stop = false;
//The Stop property indicates whether the
//alarm should be turned off.
public bool Stop
{
get {return stop;}
set {stop = value;}
}
//The SnoozePressed property indicates whether the snooze
//button is pressed on the alarm when the alarm event is
//generated.
public bool SnoozePressed
{
get {return snoozePressed;}
set {snoozePressed = value;}
}
//The event member that is of type AlarmEventHandler.
public event AlarmEventHandler Alarm;
//The protected OnAlarm method raises the event by invoking
//the delegates. The sender is always this, the current instance
//of the class.
protected virtual void OnAlarm(AlarmEventArgs e)
{
if (Alarm != null)
{
//Invokes the delegates.
Alarm(this, e);
}
}
//This alarm clock does not have
//a user interface.
//To simulate the alarm mechanism, it has a loop
//that raises the alarm event at every iteration
//with a time delay of 300 milliseconds,
//if snooze is not pressed. If snooze is pressed,
//the time delay is 1000 milliseconds.
public void Start()
{
for (;;)
{
nrings++;
if (stop)
{
break;
}
else if (snoozePressed)
{
System.Threading.Thread.Sleep(1000);
{
AlarmEventArgs e = new AlarmEventArgs(snoozePressed,
nrings);
OnAlarm(e);
}
}
else
{
System.Threading.Thread.Sleep(300);
AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings);
OnAlarm(e);
}
}
}
}
//The WakeMeUp class that has a method AlarmRang that handles the
//alarm event.
public class WakeMeUp
{
public void AlarmRang(object sender, AlarmEventArgs e)
{
Console.WriteLine(e.AlarmText +"\n");
if (!(e.SnoozePressed))
{
if (e.NumRings % 10 == 0)
{
Console.WriteLine("Let alarm ring? Enter Y");
Console.WriteLine(" Press Snooze? Enter N");
Console.WriteLine(" Stop Alarm? Enter Q");
String input = Console.ReadLine();
if (input.Equals("Y") ||input.Equals("y")) return;
else if (input.Equals("N") || input.Equals("n"))
{
((AlarmClock)sender).SnoozePressed = true;
return;
}
else
{
((AlarmClock)sender).Stop = true;
return;
}
}
}
else
{
Console.WriteLine(" Let alarm ring? Enter Y");
Console.WriteLine(" Stop alarm? Enter Q");
String input = Console.ReadLine();
if (input.Equals("Y") || input.Equals("y")) return;
else
{
((AlarmClock)sender).Stop = true;
return;
}
}
}
}
//The driver class that hooks up the event handling method of
//WakeMeUp to the alarm event of an Alarm object using a delegate.
//In a forms-based application, the driver class is the
//form.
public class AlarmDriver
{
public static void Main (string[] args)
{
//Instantiates the event receiver.
WakeMeUp w= new WakeMeUp();
//Instantiates the event source.
AlarmClock clock = new AlarmClock();
//Connects the AlarmRang method to the Alarm event.
clock.Alarm += new AlarmEventHandler(w.AlarmRang);
clock.Start();
}
}
}

El siguiente ejemplo muestra cómo utilizar la propiedad DataSource de un control para emular características del modelo.

public class DataBinding : System.Collections.ArrayList


{
public DataBinding()
{
}
public void AddNew(int index, object obj)
{
this.Add(obj);
}
}
DataBinding s_model = new DataBinding();
DataBinding i_model = new DataBinding();
System.Windows.Forms.ListBox listBox1 = new System.Windows.Forms.ListBox();
public void SetModel(int whichModel)
{
if (whichModel==0)
{
i_model.Add("i_model Value1");
i_model.Add("i_model Value2");
listBox1.DataSource = i_model;
}
else
{
s_model.Add("s_model Value1");
s_model.Add("s_model Value2");
listBox1.DataSource = s_model;
}
}

Vea también
Conceptos
Conversión de aplicaciones Java Swing
Mensajes de error del Ayudante para la conversión del lenguaje Java

Ejemplo de com.ms.wfc.data.Connection
com.ms.wfc.data.Connection example
En el siguiente ejemplo se utilizan los métodos de com.ms.wfc.data.Connection:
1. Se agrega una referencia a la biblioteca Microsoft ActiveX Data Objects (ADO) 2.7 (Adodb.dll).
2. Se crea una conexión a la base de datos con el objeto Connection (clase ConnectionClass).
Se llama al método ConnectionClass.Open.
El parámetro Provider indica el proveedor OLE DB de Jet 4, mientras que el parámetro Data Source señala la ubicación
física de la base de datos.
Vea también
Otros recursos
ADO API Reference
Referencia del Ayudante para la conversión del lenguaje Java

Cómo: Establecer el nivel de seguridad para servicios remotos


En .NET Framework, el nivel de seguridad predeterminado para la comunicación distribuida (remota) es low. Esto influye en el
paso del tipo de objeto definido por el usuario a los métodos remotos. Podría ser necesario ajustar el nivel de seguridad
predeterminado a full en algunos casos para permitir la serialización de objetos.
Para ajustar el nivel de seguridad
Modifique los archivos de configuración generados en la conversión.
O bien
Edite el código convertido.
La necesidad de hacer este ajuste no será evidente hasta que se ejecute la aplicación y se inicie una excepción
System.Runtime.Serialization.SerializationException con la descripción siguiente:
Debido a las restricciones de seguridad, no se puede tener acceso al tipo System.Runtime.Remoting.ObjRef.
Vea también
Conceptos
Conversión de aplicaciones CORBA
Conversión de aplicaciones RMI
Referencia del Ayudante para la conversión del lenguaje Java

Mensajes de diagnóstico de JLCA clasificados por paquete


Esta sección contiene enlaces a todos los mensajes de diagnóstico del asistente de ayuda para la conversión de lenguaje Java.
Estas páginas contienen los enlaces organizados por paquetes.
Errores, advertencias y problemas del lenguaje Java
Mensajes de error de com.ms.activex
Mensajes de error de com.ms.awt
Mensajes de error de com.ms.com
Mensajes de error de com.ms.directx
Mensajes de error de com.ms.dll
Mensajes de error de com.ms.dxmedia
Mensajes de error de com.ms.fx
Mensajes de error de com.ms.io
Mensajes de error de com.ms.jdbc.odbc
Mensajes de error de com.ms.lang
Mensajes de error de com.ms.mtx
Mensajes de error de com.ms.object
Mensajes de error de Com.ms.ui
Mensajes de error de com.ms.util
Mensajes de error de com.ms.wfc
Mensajes de error de com.ms.wfc.app
Mensajes de error de com.ms.wfc.ax
Mensajes de error de Com.ms.wfc.core
Mensajes de error de com.ms.wfc.data
Mensajes de error de com.ms.wfc.data.adodb
Mensajes de error de com.ms.wfc.data.ui
Mensajes de error de com.ms.wfc.io
Mensajes de error de com.ms.wfc.ole32
Mensajes de error de com.ms.wfc.ui
Mensajes de error de com.ms.wfc.util
Mensajes de error de com.ms.wfc.win32
Mensajes de error de com.ms.win32
Mensajes de error de com.sun.image.codec
Mensajes de error de java.applet
Mensajes de error de java.awt
Mensajes de error de java.awt.color
Mensajes de error de Java.awt.datatransfer
Mensajes de error de java.awt.dnd
Mensajes de error de Java.awt.event
Mensajes de error de java.awt.font
Mensajes de error de java.awt.geom
Mensajes de error de java.awt.im
Mensajes de error de java.awt.image
Mensajes de error de java.awt.peer
Mensajes de error de java.awt.print
Mensajes de error de java.beans
Mensajes de error de java.io
Mensajes de error de Java.lang
Mensajes de error de java.math
Mensajes de error de java.net
Mensajes de error de java.rmi
Mensajes de error de java.security
Mensajes de error de Java.sql
Mensajes de error de java.text
Mensajes de error de java.text.resources
Mensajes de error de java.util
Mensajes de error de java.util.cab
Mensajes de error de java.util.jar
Mensajes de error de java.util.zip
Mensajes de error de javax.accessibility
Mensajes de error de Javax.crypto
Mensajes de error de javax.ejb
Mensajes de error de Javax.jms
Mensajes de error de javax.mail
Mensajes de error de javax.naming
Mensajes de error de javax.rmi
Mensajes de error de javax.security
Mensajes de error de javax.servlet
Mensajes de error de javax.servlet.http
Mensajes de error de javax.servlet.jsp
Mensajes de error de javax.sound
Mensajes de error de javax.sql
Mensajes de error de javax.swing
Mensajes de error de javax.swing.beaninfo
Mensajes de error de javax.swing.border
Mensajes de error de Javax.swing.colorchooser
Mensajes de error de javax.swing.event
Mensajes de error de javax.swing.filechooser
Mensajes de error de javax.swing.table
Mensajes de error de javax.swing.text
Mensajes de error de javax.swing.tree
Mensajes de error de javax.swing.undo
Mensajes de error de javax.transaction
Mensajes de error de javax.xml
Mensajes de error de org.omg
Mensajes de error de org.w3c
Mensajes de error de org.xml
Mensajes de error del Ayudante para la conversión del lenguaje Java

Errores, advertencias y problemas del lenguaje Java


(1002) Error de compilación: instrucción no válida
(1003) Nota: la declaración ha cambiado de final a variable
(1005) Nota: la expresión Initialize se movió a un método o constructor
(1011) Nota: se generó un nuevo elemento de código
(1012) Nota: no se admite una instrucción Break con etiqueta
(1014) Nota: el Ayudante para la conversión del lenguaje Java movió una instrucción con etiqueta
(1015) Nota: no se admite una instrucción Continue con etiqueta
(1019) Nota: las clases internas no se proporcionan con una instancia envolvente
(1021) Nota: no se admite el campo this$0 de un miembro de una clase interna
(1022) Nota: no se admite una declaración de clase local
(1023) Nota: la variable final se copió a la clase interna como un campo de miembro
(1024) Nota global: no se admite una declaración de clase anónima
(1025) Nota: en C# no se permiten interfaces anidadas dentro de interfaces
(1027) Nota: en .NET Framework no se admiten métodos sincronizados
(1042) Advertencia global: los tipos de datos de Visual C# podrían ser diferentes
(1043) Tareas pendientes: un método o una propiedad devuelve un valor diferente en .NET Framework
(1045) Nota: las interfaces no pueden contener campos en .NET Framework
(1062) Tareas pendientes: el valor NULL de las columnas de base de datos se puede comprobar mediante OleDbDataReader.isDBNull
(1063) Tareas pendientes: modifique las cadenas de conexión para que coincidan con el formato de .NET Framework
(1064) Tareas pendientes: modifique la conexión de cadena para que coincida con el formato de .NET Framework y agréguele la información java.util.Properties
(1066) Tareas pendientes: setLoginTimeout debe ser un parámetro de la cadena de conexión para el constructor OleDbConnection
(1075) Nota: el constructor de fuentes puede generar instancias no equivalentes
(1077) Tareas pendientes: no se admite la herencia de clases
(1078) Tareas pendientes: asegúrese de que los recursos utilizados en esta clase son archivos de recursos válidos
(1079) Error de compilación: todos los métodos heredados de una clase abstracta deben implementarse
(1083) Nota: las matrices de bits deben tener el mismo tamaño para permitir realizar la operación
(1086) Error de compilación: un equivalente de campo no se puede asignar a una variable de tipo entero
(1088) Tareas pendientes: no hay ningún valor NULL definido para una estructura .NET
(1089) Tareas pendientes: el acceso y el formato de archivo de los valores de configuración son diferentes
(1091) Advertencia en tiempo de ejecución: el constructor equivalente tiene un número de parámetros diferente
(1092) Tareas pendientes: el valor o el tipo que se esperaba de un parámetro es diferente
(1093) Tareas pendientes: cambie el código para obtener acceso a un valor de un miembro de una clase .NET
(1095) Tareas pendientes: elemento de código no asignado en la versión actual
(1096) Nota: campos asignados a enumeraciones inicializadas con valores enteros
(1099) Nota: las excepciones producidas por el método pueden ser diferentes
(1100) Nota: hay cláusulas catch en una instrucción try con la misma excepción
(1101) Advertencia en tiempo de ejecución: los parámetros asignados podrían producir una excepción
(1102) Error de compilación: la clase debe modificarse para que llame a la superclase
(1103) Error de compilación: el campo tiene un tipo diferente
(1104) Tareas pendientes: utilice la propiedad ConnectionString para establecer el inicio de sesión y la contraseña
(1105) Tareas pendientes: no es necesario invocar al método
(1107) Nota global: conversión de setAllowAddNew, setAllowDelete y setAllowUpdate de la clase DataGrid
(1108) Tareas pendientes: la propiedad o el método debe establecerse o llamarse antes de una invocación
(1109) Error de compilación: el parámetro convertido no es compatible con el tipo de parámetro del método
(1113) Error de compilación: el miembro está reservado para el uso interno de su paquete
(1114) Tareas pendientes: el parámetro de setFilter en las clases OpenFileDialog y SaveFileDialog se debe cambiar
(1115) Advertencia global: el código no seguro requiere un modificador de compilador para la compilación
(1116) Tareas pendientes: el contador de referencias personalizado de COM podría dejar de ser válido
(1118) Tareas pendientes: las casillas de verificación no proporcionan exclusión mutua cuando están agrupadas
(1119) Nota: el atributo del evento de control de usuario no es válido
(1123) Nota: la clase está asignada a una interfaz
(1124) Nota: se quitó código del cuerpo del método
(1128) Error de compilación: la instrucción Break en el nivel de cláusula finally no es válida
(1130) Tareas pendientes: el equivalente de java.sql.DatabaseMetaData administra los resultados de la consulta en System.Data.DataTable
(1132) Tareas pendientes: la clase equivalente no produce una excepción para una dirección URL incorrecta
(1133) Advertencia global: el método Equals puede devolver un valor diferente
(1135) Error global: se debe llamar al método System.Windows.Forms.Application.Run para la ventana principal
(1137) Tareas pendientes: existen conflictos de nombres en un método get o set de usuario convertido en propiedad
(1139) Advertencia global: no se convirtió el directorio
(1140) Advertencia global: el nombre del subproceso sólo se puede establecer una vez
(1141) Nota: el Ayudante para la conversión del lenguaje Java comentó código de la clase de contenedor que permite llamadas de Java (JWC) para una coclase COM
(1142) Tareas pendientes: el método de evento necesita sobrecargarse
(1143) Tareas pendientes: el método no es un método de reemplazo
(1144) Advertencia en tiempo de ejecución: agregue lógica adicional a componentHidden
(1145) Advertencia en tiempo de ejecución: agregue lógica adicional a componentShown
(1146) Tareas pendientes: no se puede convertir la declaración y construcción de una instancia de clase en líneas diferentes
(1147) Tareas pendientes: la clase <nombre_clase> está marcada como Sealed
(1148) Nota: se ha quitado la palabra clave synchronized
(1151) Tareas pendientes: constructor inaccesible
(1152) Tareas pendientes: debe convertir manualmente el acceso al Registro
(1153) Tareas pendientes: instrucción sin traducir
(1154) Nota: parámetro para el constructor del equivalente de la clase com.ms.wfc.data.ui.DataNavigator
(1155) Tareas pendientes: clase que deriva de Delegate o MulticastDelegate
(1156) Error de compilación: instrucciones incorrectas
(1157) Error de compilación: método con los mismos tipos de parámetros
(1158) Tareas pendientes: se modificó la forma de obtener acceso al archivo
(1159) Advertencia global: ruta de acceso de archivos que dependen del directorio de trabajo
(1160) Tareas pendientes: una interfaz incluye la funcionalidad de otra
(1167) Nota: llamadas a getParameter sin literal de cadena
(1168) Tareas pendientes: getParameter que requiere que se cambie el nombre de los parámetros
(1169) Nota: se cambió el valor predeterminado de la propiedad
(1170) Advertencia global: clase asignada a una estructura; no puede contener ni devolver un valor null
(1171) Nota: el método getSource debe estar en una rutina de control de eventos
(1172) Error global: el archivo de proyecto de entrada está dañado
(1173) Tareas pendientes: el literal hexadecimal devuelve un valor distinto
(1174) Nota: la manera de cargar un archivo binario en .NET Framework es diferente
(1175) Advertencia global: se detectó un valor unsigned long
(1177) Advertencia en tiempo de ejecución: la implementación de la interfaz se ha convertido en una sola clase
(1178) Tareas pendientes: es necesario modificar el método
(1179) Advertencia global: solicitar la cadena de conexión de OleDbManager
(1180) Nota: se admite un solo atributo transaccional
(1181) Advertencia en tiempo de ejecución: se han utilizado expresiones en el código de C# más de una vez
(1182) Tareas pendientes: los parámetros de Session se almacenan en orden diferente
(1183) Advertencia en tiempo de ejecución: la funcionalidad de Init se ha convertido
(1184) Tareas pendientes: <NombreDestino> requiere cambiar el tipo de la instancia de recepción
(1185) Tareas pendientes: el acceso a la cola se obtiene de forma diferente
(1186) Error de compilación: las diferencias en la jerarquía de clases podrían provocar errores de compilación
(1187) Advertencia en tiempo de ejecución: <Tipo miembro> se podría ejecutar cada vez que se cargase la página de ASP.NET
(1188) Nota: puede elegir un protocolo para métodos RMI convertidos
(1189) Tareas pendientes: la mensajería con destino múltiple requiere un formato de destino especial
(1190) Tareas pendientes: activación de los objetos remotos
(1191) Nota: el campo de instancia se convirtió a estático
(1192) Tareas pendientes: es posible que el código de serialización no se convierta correctamente
(1193) Error del compilador: no se ha utilizado el código de serialización en la conversión del método
(1194) Advertencia en tiempo de ejecución: Se debe usar una clave para un valor serializado sólo una vez y debe coincidir con la clave correspondiente
(1195) Tareas pendientes: cambiar el modificador override para el método no virtual
(1196) Nota: conversión de archivos de interfaz remota
(1197) Tareas pendientes: instancia creada del delegado con valor String para el nombre de la función
(1198) Nota: La herencia de clases de servlet puede provocar la manipulación incorrecta de las variables
(1199) Nota: se han combinado los comentarios javadoc respectivos
(1200) Nota: los campos compartidos de la clase base se han vuelto a declarar con el nuevo modificador
(1201) Tareas pendientes: registro de varios canales
(1202) Tareas pendientes: la conversión de referencias requiere la modificación del usuario
(1203) Nota: utilizar la interfaz de clase para exponer miembros públicos
(1204) Nota: los modificadores de acceso se cambiaron
(1205) Tareas pendientes: los métodos con parámetros de tipo primitivo sobrecargados con parámetros de tipo de clase de contenedor
(1206) Nota global: el proyecto convertido se debe compilar antes de abrirlo en la vista del diseñador de Visual Studio
(1207) Tareas pendientes: los tipos que se extienden desde objetos COM deben reemplazar todos los métodos
(1208) Nota global: el espacio de nombres System.Data.OleDb puede reemplazarse por otro espacio de nombres
(1209) Nota: el método no se convirtió en propiedad
(1210) Advertencia global: es posible que tenga que cambiar el nivel de deserialización
(1211) Advertencia en tiempo de ejecución: el registro de canal puede fallar sin previo aviso
(1212) Nota: no se han validado los límites de la matriz
(1213) Nota global: el archivo de configuración se ha agregado durante la conversión
(1214) Error de compilación: el usuario debe especificar la dirección de servidor
(1215) Error de compilación: la conexión de servidor debe realizarla el usuario
(1216) Error de compilación: el nombre de objeto remoto debe imponerlo el usuario
(1217) Advertencia global: no se admiten lenguajes que no sean Java
(1218) Advertencia global: las definiciones que no son nativas de Java se han convertido en construcciones nativas de Visual C#
(1219) Nota global: se reemplazó System.MarshalByRefObject.InitializeLifetimeService para lograr objetos duraderos
(1220) Tareas pendientes: se debe implementar el método Reset
(1221) Tareas pendientes: invocaciones primarias en los métodos desde subprogramas
(1222) Advertencia en tiempo de ejecución: el constructor equivalente tiene más parámetros
(1223) Advertencia global: el resultado de idiomas bidireccionales
(1224) Tareas pendientes: el método devuelve un tipo diferente
(1225) Advertencia global: las conversiones de tipos primitivos tienen un comportamiento diferente
(1227) Nota: código copiado para el diseño visual
(1228) Nota: se movió código comentado al método InitializeComponent
(1230) Advertencia en tiempo de ejecución: debe agregarse un objeto ContainerControl antes de agregar otros formularios
(1231) Tareas pendientes: uno o más de un miembro de clase de Java ha sido convertido al mismo miembro en Visual C#
(1232) Tareas pendientes: debe implementarse el método o la propiedad con el fin de mantener la lógica de la clase
(1233) Nota: En una clase de servlet convertida, puede que la palabra clave "this" se comporte de forma distinta
(1234) Nota: ahora la clase interna es serializable
(1235) Error de compilación: en .NET Framework no existe un método de clase base equivalente
(1236) TODO: Verificar la lista de filtros de servlet registrados
(1237) Nota: se ha convertido EJB a componente al que se proporciona servicio
(1238) Tareas pendientes: método de devolución de llamada de EJB no admitido
(1239) Advertencia global: clase o interfaz utilizada por más de un EJB
(1240) Tareas pendientes: reimplementar el enlace de datos en beans de EJB con persistencia administrada por el contenedor
(1241) Tareas pendientes: mueva y adapte métodos de interfaz de EJBHome
(1242) Tareas pendientes: vuelva a implementar el método buscador de CMP de EJB 2,0
(1243) Tareas pendientes: vuelva a implementar el método buscador de CMP de EJB 1.1
(1244) Tareas pendientes: vuelva a implementar la relación de CMP de EJB 2.0
(1245) Tareas pendientes: atributo de transacción de EJB no admitido en el nivel de método
(1246) Tareas pendientes: atributo de transacción de EJB no admitido
(1247) Advertencia global: las excepciones que se producen en contextos de transacción siempre deshacen la transacción actual
(1248) Advertencia: no se puede excluir el método de EJB
(1249) Advertencia: no se pueden deshabilitar las comprobaciones de seguridad de acceso en el caso de métodos no activados
(1250) Advertencia global: es necesario cambiar el nivel de seguridad
(1251) Nota: se omite la implementación personalizada del cálculo y la resolución de referencias
(1252) Advertencia global: las inclusiones del sistema se omiten
(1253) Tareas pendientes: reemplace referencias de recursos de EJB
(1254) Tareas pendientes: reemplace las referencias de EJB por equivalentes .NET
(1255) Nota global: las entradas del entorno de EJB deben estar disponibles para el componente actual
(1256) Nota global: reentrada de EJB no compatible
(1257) Advertencia global: seguridad JNDI
(1258) Tareas pendientes: ajustar inicialización de contexto remoto manualmente
(1259) Tareas pendientes: el registro del objeto remoto sólo utiliza el constructor predeterminado
(1260) Tareas pendientes: los generadores predeterminados de tipos de valor IDL no son necesarios en Visual C#
(1261) Nota: el motor en tiempo de ejecución no llamará a los métodos de destrucción de servlet
(1262) Tareas pendientes: importar declaraciones de tipos o paquetes no disponibles puede provocar errores de compilación
(1263) Tareas pendientes: el comportamiento de los filtros de la aplicación Web es diferente.
(1264) Advertencia global: los eventos se comportan de forma diferente en .NET Framework
(1265) Advertencia en tiempo de ejecución: el método equivalente tiene menos parámetros
(1266) Advertencia en tiempo de ejecución: los objetos derivados de System.MarshalByRefObject sólo se pueden serializar en su propio dominio
(1267) Nota: se han movido las partes de código para el diseño visual a InitializeComponent
(1268) Nota: se ha agregado un constructor sin parámetros a una clase serializable
(1269) Tareas pendientes: los miembros de clases que tengan más de un equivalente en Visual C# pueden no funcionar
(1270) Tareas pendientes: es necesario reemplazar el constructor
(1271) Nota: este método puede eliminarse
(1272) Tareas pendientes: no se convirtieron las directivas de preprocesador IDL no compatibles
(1273) Nota: no se convirtió el contexto
(1274) Advertencia global: la secuencia de ejecución del miembro puede variar
(1275) Nota: las aplicaciones de servidor RMI esperan las solicitudes de los clientes antes de finalizar
(1277) Tareas pendientes: no se puede serializar la clase equivalente
(1278) Nota: los parámetros out se deben asignar para que el método devuelva un resultado
(1279) Advertencia en tiempo de ejecución: el nombre de método pasado puede que no sea válido para la creación de delegados
(1280) Tareas pendientes: se ha encontrado un paquete de otro fabricante pero no se ha convertido necesariamente
(1281) Advertencia global: podrían producirse excepciones de interacción remota debido a caracteres XML no validos
(1282) Advertencia global: Puede que Visual C# no resuelva espacios de nombres ambiguos correctamente.
(1283) Advertencia global: mueva los subprogramas JSP o los proyectos ASP convertidos
(1284) Nota: puede que la simulación del método getModifiers no funcione para algunos controles
(1285) Advertencia global: la implementación convertida de un editor de propiedades podría tener un comportamiento diferente
(1286) Nota: la implementación del tipo de valor se movió al ensamblado compartido
(1287) Tareas pendientes: es posible que no se admitan cadenas de transformación
(1288) Nota: Las clases criptográficas que controlan las claves se comportan de forma distinta
(1290) Advertencia global: se debe instalar DirectX para poder admitir sonido
(1291) Tareas pendientes: las estructuras no tienen un equivalente a NULL en Visual C#
(1292) Nota: algunos campos de desplazamiento de la interfaz de usuario no se mantienen tras la conversión de la barra de desplazamiento
(1293) Advertencia global: todas las excepciones JNDI se asignan a System.Exception
(1294) Error de compilación: el paquete com.ms.wfc.html no es compatible
(1295) Tareas pendientes: Visual C# no tiene ningún constructor con un objeto como parámetro
(1296) Nota: se ha producido un cambio en los modificadores de acceso
(1297) Advertencia global: los enumeradores deben iniciarse antes de obtener acceso a sus datos
(1298) Nota: la funcionalidad de BeanInfo se ha transferido al componente correspondiente de Visual C#
(1299) Tareas pendientes: la expresión devuelta debe convertirse manualmente
(1300) Tareas pendientes: TypeConverter necesita un System.ComponentModel.Design.Serialization.InstanceDescriptor adecuado
(1301) Advertencia global: los archivos de código fuente de JavaBeans deben estar en el directorio del proyecto
(1302) Error global: la conversión de ValueBase puede producir un error de falta de coincidencia de tipos
(1303) Nota: se ha agregado la palabra clave de referencia a los parámetros de estructura
(1304) Nota: la conversión de JavaBeans podría generar problemas de implementación
(1305) Advertencia global: pueden perderse los vínculos a los componentes AwtUI del controlador de eventos
(1306) Nota: se ha agregado la implementación de una propiedad o un método
(1307) Tareas pendientes: no se puede mover la instrucción a InitializeComponent
(1308) Nota: se convierten los métodos que se encuentran en agentes de escucha, pero no se utilizan
(1309) Nota: el valor devuelto por el delegado podría ser diferente
(1310) Tareas pendientes: la clase de EJB tiene problemas de herencia múltiple
(1311) Tareas pendientes: es posible que falte un descriptor de implementación en un componente de EJB
(1312) Advertencia en tiempo de ejecución: no existe un equivalente para el atributo de transacción Mandatory
(1313) Nota: instrucción innecesaria si no hay ninguna referencia a ella
(1314) Advertencia global: EJB convertido tiene características de seguridad predefinidas
(1315) Tareas pendientes: el parámetro no se puede pasar por referencia
(1316) Advertencia global: no se ha aplicado el atributo de transacción de EJB
(1317) Error de compilación: las matrices ValueType no se pueden asignar, comparar o pasar como parámetros
(1318) Advertencia global: es necesario cambiar el nombre del archivo de configuración JAAS
(2001) Advertencia en tiempo de ejecución: algunas etiquetas de servidor que deben ser únicas podrían repetirse al incluir los archivos
(2002) Advertencia en tiempo de ejecución: en Aspx no se permite la inclusión dinámica de archivos
(2003) Nota: el atributo "buffer" sólo puede tener dos valores válidos en ASP.NET
(2004) Nota: Se ha cambiado el ámbito Request a Session
(2005) Error global: la propiedad Web.Config customErrors Mode se debe establecer como "On"
(2006) Tareas pendientes: el archivo no se convertirá
(2007) Nota: las referencias de las variables de secuencias de comandos pueden estar fuera de ámbito al mover los bloques dentro de las etiquetas personalizadas a los métodos
(2008) Nota: las estructuras de control no funcionarán correctamente si se trasladan bloques de código a las etiquetas personalizadas
(4010) Advertencia global: la referencia ActiveX es diferente
(4011) Error global: carácter no válido encontrado en el archivo
(4012) Advertencia global: página de códigos no disponible en el sistema
(4013) Nota: no se pudo especificar o analizar el archivo TLD
(4014) Advertencia global: la biblioteca de tipos no es la misma que está registrada
(4015) Nota: Se ha cambiado el id. de control de usuario.
(4020) Error global: no se pudo descomprimir el archivo de almacenamiento
(4021) Error global: no se pudo leer el archivo de almacenamiento
(5000) Tareas pendientes: el método no está marcado como virtual
Vea también
Otros recursos
Mensajes de diagnóstico de JLCA clasificados por paquete
Convertir aplicaciones de Java a Visual C#
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.activex


No se pudo convertir com.ms.activexX
No se pudo convertir com.ms.activex.ActiveXControl
No se pudo convertir com.ms.activex.ActiveXControlListener
No se pudo convertir com.ms.activex.ActiveXControlServices
No se pudo convertir com.ms.activex.ActiveXInputStream
No se pudo convertir com.ms.activex.ActiveXOutputStream
No se pudo convertir com.ms.activex.ActiveXToolkit
No se pudo convertir com.ms.activex.PropertyDialogThread
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.awt


No se pudo convertir com.ms.awt.AccessibleWrapper
No se pudo convertir com.ms.awt.AWTFinalizeable
No se pudo convertir com.ms.awt.AWTFinalizer
No se pudo convertir com.ms.awt.AWTPermission.check
No se pudo convertir com.ms.awt.AWTPermission.pid
No se pudo convertir com.ms.awt.CaretX
No se pudo convertir com.ms.awt.CharsetString
No se pudo convertir com.ms.awt.CharToByteSymbol
No se pudo convertir com.ms.awt.ColorX.ColorX(float, float, float)
No se pudo convertir com.ms.awt.ColorX.ColorX(int)
No se pudo convertir com.ms.awt.ColorX.ColorX(int, int, int)
No se pudo convertir com.ms.awt.ColorX.getHilight
No se pudo convertir com.ms.awt.ColorX.getShadow
No se pudo convertir com.ms.awt.Device.Device
No se pudo convertir com.ms.awt.Device.getBasics
No se pudo convertir com.ms.awt.Device.getDisplayContext
No se pudo convertir com.ms.awt.DrawingSurface
No se pudo convertir com.ms.awt.DrawingSurfaceInfo
No se pudo convertir com.ms.awt.EventFilterListener
No se pudo convertir com.ms.awt.FocusEvent.getOtherComponent
No se pudo convertir com.ms.awt.FocusingTextField
No se pudo convertir com.ms.awt.FontDescriptor
No se pudo convertir com.ms.awt.FontMetricsX.bytesWidth
No se pudo convertir com.ms.awt.FontMetricsX.CHAR_KERNING
No se pudo convertir com.ms.awt.FontMetricsX.charsWidth
No se pudo convertir com.ms.awt.FontMetricsX.FontMetricsX
No se pudo convertir com.ms.awt.FontMetricsX.getAveCharWidth
No se pudo convertir com.ms.awt.FontMetricsX.getFace
No se pudo convertir com.ms.awt.FontMetricsX.getFontMetrics
No se pudo convertir com.ms.awt.FontMetricsX.getLeading
No se pudo convertir com.ms.awt.FontMetricsX.getMaxAdvance
No se pudo convertir com.ms.awt.FontMetricsX.getWidths
No se pudo convertir com.ms.awt.FontMetricsX.stringWidth
No se pudo convertir com.ms.awt.FontX.chooseFont
No se pudo convertir com.ms.awt.FontX.EMBEDDED
No se pudo convertir com.ms.awt.FontX.getAttributeList
No se pudo convertir com.ms.awt.FontX.getFlags
No se pudo convertir com.ms.awt.FontX.getFlagsVal
No se pudo convertir com.ms.awt.FontX.getFont
No se pudo convertir com.ms.awt.FontX.getFontList
No se pudo convertir com.ms.awt.FontX.getFontNativeData
No se pudo convertir com.ms.awt.FontX.getNativeData
No se pudo convertir com.ms.awt.FontX.getStyleVal
No se pudo convertir com.ms.awt.FontX.isTypeable
No se pudo convertir com.ms.awt.FontX.matchFace
No se pudo convertir com.ms.awt.FontX.OUTLINE
No se pudo convertir com.ms.awt.FontX.USEDFONT
No se pudo convertir com.ms.awt.GenericEvent
No se pudo convertir com.ms.awt.GraphicsX.bitBlt
No se pudo convertir com.ms.awt.GraphicsX.cng
No se pudo convertir com.ms.awt.GraphicsX.comp
No se pudo convertir com.ms.awt.GraphicsX.copyArea
No se pudo convertir com.ms.awt.GraphicsX.drawBezier
No se pudo convertir com.ms.awt.GraphicsX.drawChars
No se pudo convertir com.ms.awt.GraphicsX.drawCharsWithoutFxFont
No se pudo convertir com.ms.awt.GraphicsX.drawOutlineChar
No se pudo convertir com.ms.awt.GraphicsX.drawOutlinePolygon
No se pudo convertir com.ms.awt.GraphicsX.drawPixels
No se pudo convertir com.ms.awt.GraphicsX.drawRoundRect
No se pudo convertir com.ms.awt.GraphicsX.drawScanLines
No se pudo convertir com.ms.awt.GraphicsX.drawT2Curve
No se pudo convertir com.ms.awt.GraphicsX.fill3DRect
No se pudo convertir com.ms.awt.GraphicsX.fillRoundRect
No se pudo convertir com.ms.awt.GraphicsX.gdc
No se pudo convertir com.ms.awt.GraphicsX.getColorType
No se pudo convertir com.ms.awt.GraphicsX.getGlyphOutline
No se pudo convertir com.ms.awt.GraphicsX.go
No se pudo convertir com.ms.awt.GraphicsX.GraphicsX
No se pudo convertir com.ms.awt.GraphicsX.image
No se pudo convertir com.ms.awt.GraphicsX.originX
No se pudo convertir com.ms.awt.GraphicsX.originY
No se pudo convertir com.ms.awt.GraphicsX.resetSurfaceParams
No se pudo convertir com.ms.awt.GraphicsX.setClip
No se pudo convertir com.ms.awt.GraphicsX.setPaintMode
No se pudo convertir com.ms.awt.GraphicsX.setSurfaceOffset
No se pudo convertir com.ms.awt.GraphicsX.setSurfaceOwner
No se pudo convertir com.ms.awt.GraphicsX.setSurfaceVisRgn
No se pudo convertir com.ms.awt.GraphicsX.setXORMode
No se pudo convertir com.ms.awt.GraphicsXConstants.BDR_VALID
No se pudo convertir com.ms.awt.HeavyComponent
No se pudo convertir com.ms.awt.HorizBagLayout
No se pudo convertir com.ms.awt.ImageX
No se pudo convertir com.ms.awt.ListLayout
No se pudo convertir com.ms.awt.MenuBarX.getItemID
No se pudo convertir com.ms.awt.MenuBarX.MenuBarX(int)
No se pudo convertir com.ms.awt.MenuBarX.MenuBarX(int, Applet, String)
No se pudo convertir com.ms.awt.MenuBarX.MenuBarX(int, String)
No se pudo convertir com.ms.awt.MenuItemX.addNotify
No se pudo convertir com.ms.awt.MenuItemX.getID
No se pudo convertir com.ms.awt.MenuX.CheckMenuItem
No se pudo convertir com.ms.awt.MenuX.getItemID
No se pudo convertir com.ms.awt.MenuXConstants
No se pudo convertir com.ms.awt.OrientableFlowLayout
No se pudo convertir com.ms.awt.PhysicalDrawingSurface
No se pudo convertir com.ms.awt.PlatformFont
No se pudo convertir com.ms.awt.VariableGridLayout
No se pudo convertir com.ms.awt.VerticalBagLayout
No se pudo convertir com.ms.awt.WClipboard.lostClipboard
No se pudo convertir com.ms.awt.WClipboard.lostSelectionOwnership
No se pudo convertir com.ms.awt.WClipboard.setToolkit
No se pudo convertir com.ms.awt.WClipboard.WClipboard
No se pudo convertir com.ms.awt.WComponentPeer
No se pudo convertir com.ms.awt.WDragSession
No se pudo convertir com.ms.awt.WEventQueue
No se pudo convertir com.ms.awt.WFileDialogPeer
No se pudo convertir com.ms.awt.WGuiCallback
No se pudo convertir com.ms.awt.WHeavyPeer
No se pudo convertir com.ms.awt.Win32SystemResourceDecoder
No se pudo convertir com.ms.awt.WinEvent.notify
No se pudo convertir com.ms.awt.WPrintGraphics
No se pudo convertir com.ms.awt.WPrintJob
No se pudo convertir com.ms.awt.WToolkit
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.com


No se pudo convertir com.ms.com.AnsiStringMarshaller
No se pudo convertir com.ms.com.AnsiStringRef
No se pudo convertir com.ms.com.COAUTHIDENTITY.cbByValSize
No se pudo convertir com.ms.com.COAUTHIDENTITY.domain
No se pudo convertir com.ms.com.COAUTHIDENTITY.flags
No se pudo convertir com.ms.com.COAUTHIDENTITY.fromPtr
No se pudo convertir com.ms.com.COAUTHIDENTITY.password
No se pudo convertir com.ms.com.COAUTHIDENTITY.toExternal
No se pudo convertir com.ms.com.COAUTHIDENTITY.toJava
No se pudo convertir com.ms.com.COAUTHIDENTITY.toPtr
No se pudo convertir com.ms.com.COAUTHIDENTITY.user
No se pudo convertir com.ms.com.COAUTHINFO.pAuthIdentityData
No se pudo convertir com.ms.com.COAUTHINFO.pwszServerPrincName
No se pudo convertir com.ms.com.ComContext
No se pudo convertir com.ms.com.ComException.ComException
No se pudo convertir com.ms.com.ComException.getHelpContext
No se pudo convertir com.ms.com.ComException.getHResult
No se pudo convertir com.ms.com.ComException.hr
No se pudo convertir com.ms.com.ComException.m_helpContext
No se pudo convertir com.ms.com.ComException.m_helpFile
No se pudo convertir com.ms.com.ComException.m_source
No se pudo convertir com.ms.com.ComFailException.ComFailException
No se pudo convertir com.ms.com.ComLib.ComLib
No se pudo convertir com.ms.com.ComLib.declareMessagePumpThread
No se pudo convertir com.ms.com.ComLib.executeOnContext
No se pudo convertir com.ms.com.ComLib.freeUnusedLibraries
No se pudo convertir com.ms.com.ComLib.IENVNextMarshalerC2J
No se pudo convertir com.ms.com.ComLib.IENVNextMarshalerJ2C
No se pudo convertir com.ms.com.ComLib.IID_IDispatch
No se pudo convertir com.ms.com.ComLib.IID_IUnknown
No se pudo convertir com.ms.com.ComLib.isEqualUnknown
No se pudo convertir com.ms.com.ComLib.jcdwClassOffsetOf
No se pudo convertir com.ms.com.ComLib.jcdwOffsetOf
No se pudo convertir com.ms.com.ComLib.makeProxyRef
No se pudo convertir com.ms.com.ComLib.ownsCleanup
No se pudo convertir com.ms.com.ComLib.ptrToUnknown
No se pudo convertir com.ms.com.ComLib.setDataWrapperSize
No se pudo convertir com.ms.com.ComLib.startMTAThread
No se pudo convertir com.ms.com.ComLib.supportsInterface
No se pudo convertir com.ms.com.ComLib.threadStartMTA
No se pudo convertir com.ms.com.ComLib.unknownToPtr
No se pudo convertir com.ms.com.ComSuccessException.ComSuccessException
No se pudo convertir com.ms.com.CONNECTDATA.pUnk
No se pudo convertir com.ms.com.COSERVERINFO.pAuthInfo
No se pudo convertir com.ms.com.COSERVERINFO.pwszName
No se pudo convertir com.ms.com.CUnknown
No se pudo convertir com.ms.com.CustomLib
No se pudo convertir com.ms.com.Dispatch
No se pudo convertir com.ms.com.DispatchProxy
No se pudo convertir com.ms.com.Generic
No se pudo convertir com.ms.com.Guid.Guid
No se pudo convertir com.ms.com.Guid.setByStr
No se pudo convertir com.ms.com.IAccessible.iid
No se pudo convertir com.ms.com.IAccessibleDefault.iid
No se pudo convertir com.ms.com.IBindCtx.iid
No se pudo convertir com.ms.com.IBindCtx.RegisterObjectBound
No se pudo convertir com.ms.com.IBindCtx.RevokeObjectBound
No se pudo convertir com.ms.com.IBindCtx.RevokeObjectParam
No se pudo convertir com.ms.com.IClassFactory
No se pudo convertir com.ms.com.IClassFactory2
No se pudo convertir com.ms.com.IConnectionPoint.Advise
No se pudo convertir com.ms.com.IConnectionPoint.iid
No se pudo convertir com.ms.com.IConnectionPointContainer.iid
No se pudo convertir com.ms.com.IEnumConnectionPoints.iid
No se pudo convertir com.ms.com.IEnumConnectionPoints.Next
No se pudo convertir com.ms.com.IEnumConnections.iid
No se pudo convertir com.ms.com.IEnumConnections.Next
No se pudo convertir com.ms.com.IEnumConnections.Skip
No se pudo convertir com.ms.com.IEnumMoniker.iid
No se pudo convertir com.ms.com.IEnumMoniker.Next
No se pudo convertir com.ms.com.IEnumSTATSTG
No se pudo convertir com.ms.com.IEnumString.iid
No se pudo convertir com.ms.com.IEnumString.Next
No se pudo convertir com.ms.com.IEnumUnknown
No se pudo convertir com.ms.com.IEnumVariant.Clone
No se pudo convertir com.ms.com.IExternalConnectionSink
No se pudo convertir com.ms.com.IIDIsMarshaler
No se pudo convertir com.ms.com.ILicenseMgr
No se pudo convertir com.ms.com.ILockBytes
No se pudo convertir com.ms.com.IMarshal.GetMarshalSizeMax
No se pudo convertir com.ms.com.IMarshal.GetUnmarshalClass
No se pudo convertir com.ms.com.IMarshal.iid
No se pudo convertir com.ms.com.IMoniker.BindToObject
No se pudo convertir com.ms.com.IMoniker.iid
No se pudo convertir com.ms.com.IMoniker.IsDirty
No se pudo convertir com.ms.com.IMoniker.IsEqual
No se pudo convertir com.ms.com.IMoniker.IsRunning
No se pudo convertir com.ms.com.IParseDisplayName
No se pudo convertir com.ms.com.IPersist.iid
No se pudo convertir com.ms.com.IPersistFile.iid
No se pudo convertir com.ms.com.IPersistFile.IsDirty
No se pudo convertir com.ms.com.IPersistFile.Save
No se pudo convertir com.ms.com.IPersistStorage
No se pudo convertir com.ms.com.IPersistStream.GetClassID
No se pudo convertir com.ms.com.IPersistStream.iid
No se pudo convertir com.ms.com.IPersistStreamInit
No se pudo convertir com.ms.com.IPropertyNotifySink
No se pudo convertir com.ms.com.IROTData
No se pudo convertir com.ms.com.IRunningObjectTable.GetObject
No se pudo convertir com.ms.com.IRunningObjectTable.GetTimeOfLastChange
No se pudo convertir com.ms.com.IRunningObjectTable.iid
No se pudo convertir com.ms.com.IRunningObjectTable.IsRunning
No se pudo convertir com.ms.com.IRunningObjectTable.NoteChangeTime
No se pudo convertir com.ms.com.IRunningObjectTable.Register
No se pudo convertir com.ms.com.ISequentialStream
No se pudo convertir com.ms.com.ISequentialStream.iid
No se pudo convertir com.ms.com.IServiceProvider
No se pudo convertir com.ms.com.IStorage
No se pudo convertir com.ms.com.IStream.CopyTo
No se pudo convertir com.ms.com.IStream.iid
No se pudo convertir com.ms.com.IStream.LOCK_EXCLUSIVE
No se pudo convertir com.ms.com.IStream.LOCK_ONLYONCE
No se pudo convertir com.ms.com.IStream.LOCK_WRITE
No se pudo convertir com.ms.com.IStream.Read
No se pudo convertir com.ms.com.IStream.Seek
No se pudo convertir com.ms.com.IStream.STATFLAG_DEFAULT
No se pudo convertir com.ms.com.IStream.STATFLAG_NONAME
No se pudo convertir com.ms.com.IStream.STATFLAG_NOOPEN
No se pudo convertir com.ms.com.IStream.STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE
No se pudo convertir com.ms.com.IStream.STGC_DEFAULT
No se pudo convertir com.ms.com.IStream.STGC_ONLYIFCURRENT
No se pudo convertir com.ms.com.IStream.STGC_OVERWRITE
No se pudo convertir com.ms.com.IStream.STREAM_SEEK_CUR
No se pudo convertir com.ms.com.IStream.STREAM_SEEK_END
No se pudo convertir com.ms.com.IStream.STREAM_SEEK_SET
No se pudo convertir com.ms.com.IStream.Write
No se pudo convertir com.ms.com.LicenseMgr
No se pudo convertir com.ms.com.LICINFO
No se pudo convertir com.ms.com.MULTI_QI
No se pudo convertir com.ms.com.NoAutoMarshaling
No se pudo convertir com.ms.com.NoAutoScripting
No se pudo convertir com.ms.com.SafeArray.destroy
No se pudo convertir com.ms.com.SafeArray.getFeatures
No se pudo convertir com.ms.com.SafeArray.getNumLocks
No se pudo convertir com.ms.com.SafeArray.getPhysicalSafeArray
No se pudo convertir com.ms.com.SafeArray.getvt
No se pudo convertir com.ms.com.SafeArray.reinit
No se pudo convertir com.ms.com.SafeArray.reinterpretType
No se pudo convertir com.ms.com.SizeIsMarshaler
No se pudo convertir com.ms.com.STATSTG.clsid_data1
No se pudo convertir com.ms.com.STATSTG.clsid_data2
No se pudo convertir com.ms.com.STATSTG.clsid_data3
No se pudo convertir com.ms.com.STATSTG.STGTY_LOCKBYTES
No se pudo convertir com.ms.com.STATSTG.STGTY_PROPERTY
No se pudo convertir com.ms.com.STATSTG.STGTY_STORAGE
No se pudo convertir com.ms.com.STATSTG.STGTY_STREAM
No se pudo convertir com.ms.com.StdCOMClassObject
No se pudo convertir com.ms.com.UniStringMarshaller
No se pudo convertir com.ms.com.UniStringRef
No se pudo convertir com.ms.com.Variant.changeType
No se pudo convertir com.ms.com.Variant.clone
No se pudo convertir com.ms.com.Variant.cloneIndirect
No se pudo convertir com.ms.com.Variant.getDate
No se pudo convertir com.ms.com.Variant.getEmpty
No se pudo convertir com.ms.com.Variant.getErrorRef
No se pudo convertir com.ms.com.Variant.getNull
No se pudo convertir com.ms.com.Variant.getVariantArray
No se pudo convertir com.ms.com.Variant.getVariantArrayRef
No se pudo convertir com.ms.com.Variant.getvt
No se pudo convertir com.ms.com.Variant.noParam
No se pudo convertir com.ms.com.Variant.putError
No se pudo convertir com.ms.com.Variant.putSafeArrayRefHelper
No se pudo convertir com.ms.com.Variant.toError
No se pudo convertir com.ms.com.Variant.toScriptObject
No se pudo convertir com.ms.com.Variant.toVariantArray
No se pudo convertir com.ms.com.Variant.Variant
No se pudo convertir com.ms.com.Variant.VariantByref
No se pudo convertir com.ms.com.Variant.VariantClear
No se pudo convertir com.ms.com.Variant.VariantCurrency
No se pudo convertir com.ms.com.Variant.VariantEmpty
No se pudo convertir com.ms.com.Variant.VariantError
No se pudo convertir com.ms.com.Variant.VariantNull
No se pudo convertir com.ms.com.Variant.VariantTypeMask
No se pudo convertir com.ms.com.Variant.VariantVariant
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.directx


No se pudo convertir com.ms.directX.D3dFindDeviceResult.GetGuid
No se pudo convertir com.ms.directX.D3dFindDeviceSearch.getGuid
No se pudo convertir com.ms.directX.D3dFindDeviceSearch.setGuid
No se pudo convertir com.ms.directX.Direct3dRMFace.getVertices
No se pudo convertir com.ms.directX.Direct3dRMMesh.getVertices
No se pudo convertir com.ms.directX.Direct3dRMMesh.setVertices
com.ms.directX.Direct3dRMMeshBuilder.addFaces
com.ms.directX.Direct3dRMMeshBuilder.getVertices
No se pudo convertir com.ms.directX.DirectDraw.createPalette
No se pudo convertir com.ms.directX.DirectDraw.setCooperativeLevel
No se pudo convertir com.ms.directX.DirectDrawClipper.resetSurfaceParams
No se pudo convertir com.ms.directX.DirectDrawClipper.setComponent
No se pudo convertir com.ms.directX.DirectDrawClipper.setSurfaceOffset
No se pudo convertir com.ms.directX.DirectDrawClipper.setSurfaceOwner
No se pudo convertir com.ms.directX.DirectDrawClipper.setSurfaceVisRgn
No se pudo convertir com.ms.directX.DirectDrawPalette.getColorEntries
No se pudo convertir com.ms.directX.DirectDrawPalette.getPaletteEntries
No se pudo convertir com.ms.directX.DirectDrawPalette.setEntries
No se pudo convertir com.ms.directX.DirectSound.createSoundBuffer
No se pudo convertir com.ms.directX.DirectSound.setCooperativeLevel
No se pudo convertir com.ms.directX.DirectSoundBuffer.getFormat
No se pudo convertir com.ms.directX.DirectSoundBuffer.initialize
No se pudo convertir com.ms.directX.DirectSoundBuffer.setFormat
No se pudo convertir com.ms.directX.DirectSoundResource.loadWaveFile
No se pudo convertir com.ms.directX.DirectSoundResource.loadWaveResource
No se pudo convertir com.ms.directX.DirectXConstants
No se pudo convertir com.ms.directX.PaletteEntry
No se pudo convertir com.ms.directX.WaveFormatEx
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.dll


No se pudo convertir com.ms.dll.Callback
No se pudo convertir com.ms.dll.DllLib.addrOf
No se pudo convertir com.ms.dll.DllLib.addrOfPinnedObject
No se pudo convertir com.ms.dll.DllLib.copy
No se pudo convertir com.ms.dll.DllLib.DllLib
No se pudo convertir com.ms.dll.DllLib.freePinnedHandle
No se pudo convertir com.ms.dll.DllLib.getPinnedHandle
No se pudo convertir com.ms.dll.DllLib.getPinnedObject
No se pudo convertir com.ms.dll.DllLib.isStruct
No se pudo convertir com.ms.dll.DllLib.propagateStructFields
No se pudo convertir com.ms.dll.DllLib.resize
No se pudo convertir com.ms.dll.ParameterCountMismatchError
No se pudo convertir com.ms.dll.StringMarshaler
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.dxmedia


No se pudo convertir com.ms.dxmedia.AppTriggeredEvent
No se pudo convertir com.ms.dxmedia.ArrayBvr.ArrayBvr
No se pudo convertir com.ms.dxmedia.ArrayBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.ArrayBvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.ArrayBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.Bbox2Bvr
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.getMax
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.getMin
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.Bbox2Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.Bbox3Bvr
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.getMax
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.getMin
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.Bbox3Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Behavior.Behavior
No se pudo convertir com.ms.dxmedia.Behavior.debug
No se pudo convertir com.ms.dxmedia.Behavior.extract
No se pudo convertir com.ms.dxmedia.Behavior.getCOMBvr
No se pudo convertir com.ms.dxmedia.Behavior.newUninitBehavior
No se pudo convertir com.ms.dxmedia.BooleanBvr.BooleanBvr
No se pudo convertir com.ms.dxmedia.BooleanBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.BooleanBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.BooleanBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.CallbackNotifier
No se pudo convertir com.ms.dxmedia.CameraBvr.CameraBvr
No se pudo convertir com.ms.dxmedia.CameraBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.CameraBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.CameraBvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.CameraBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.ColorBvr.ColorBvr
No se pudo convertir com.ms.dxmedia.ColorBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.ColorBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.ColorBvr.NewUninitBvr
No se pudo convertir com.ms.dxmedia.ColorBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Cycler
No se pudo convertir com.ms.dxmedia.DashStyleBvr.DashStyleBvr
No se pudo convertir com.ms.dxmedia.DashStyleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.DashStyleBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.DashStyleBvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.DashStyleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.DefaultErrReceiver
No se pudo convertir com.ms.dxmedia.DXMApplet
No se pudo convertir com.ms.dxmedia.DXMCanvas
No se pudo convertir com.ms.dxmedia.DXMCanvasBase
No se pudo convertir com.ms.dxmedia.DXMDebugCallback
No se pudo convertir com.ms.dxmedia.DXMEvent.DXMEvent
No se pudo convertir com.ms.dxmedia.DXMEvent.getCOMPtr
No se pudo convertir com.ms.dxmedia.DXMEvent.newUninitBehavior
No se pudo convertir com.ms.dxmedia.DXMEvent.registerCallback
No se pudo convertir com.ms.dxmedia.DXMEvent.setCOMBvr
No se pudo convertir com.ms.dxmedia.DXMException.DXMException
No se pudo convertir com.ms.dxmedia.EndStyleBvr.EndStyleBvr
No se pudo convertir com.ms.dxmedia.EndStyleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.EndStyleBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.EndStyleBvr.newUninitBvr
No se pudo convertir com.ms.dxmedia.EndStyleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.ErrorAndWarningReceiver
No se pudo convertir com.ms.dxmedia.EventCallbackObject
No se pudo convertir com.ms.dxmedia.FontStyleBvr.FontStyleBvr
No se pudo convertir com.ms.dxmedia.FontStyleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.FontStyleBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.FontStyleBvr.NewUninitBvr
No se pudo convertir com.ms.dxmedia.FontStyleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.GeometryBvr.GeometryBvr
No se pudo convertir com.ms.dxmedia.GeometryBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.GeometryBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.GeometryBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.ImageBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.ImageBvr.ImageBvr
No se pudo convertir com.ms.dxmedia.ImageBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.ImageBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.JoinStyleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.JoinStyleBvr.JoinStyleBvr
No se pudo convertir com.ms.dxmedia.JoinStyleBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.JoinStyleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.LineStyleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.LineStyleBvr.LineStyleBvr
No se pudo convertir com.ms.dxmedia.LineStyleBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.LineStyleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.MatteBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.MatteBvr.MatteBvr
No se pudo convertir com.ms.dxmedia.MatteBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.MatteBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.MicrophoneBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.MicrophoneBvr.MicrophoneBvr
No se pudo convertir com.ms.dxmedia.MicrophoneBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.MicrophoneBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Model.cleanup
No se pudo convertir com.ms.dxmedia.Model.createModel
No se pudo convertir com.ms.dxmedia.Model.getImportBase
No se pudo convertir com.ms.dxmedia.Model.modifyPreferences
No se pudo convertir com.ms.dxmedia.Model.receiveInputImages
No se pudo convertir com.ms.dxmedia.Model.setImportBase
No se pudo convertir com.ms.dxmedia.ModelMakerApplet
No se pudo convertir com.ms.dxmedia.ModifiableBehavior
No se pudo convertir com.ms.dxmedia.MontageBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.MontageBvr.MontageBvr
No se pudo convertir com.ms.dxmedia.MontageBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.MontageBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.NumberBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.NumberBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.NumberBvr.NumberBvr
No se pudo convertir com.ms.dxmedia.NumberBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.PairObject.PairObject
No se pudo convertir com.ms.dxmedia.Path2Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Path2Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Path2Bvr.Path2Bvr
No se pudo convertir com.ms.dxmedia.Path2Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.PickableGeometry.PickableGeometry
No se pudo convertir com.ms.dxmedia.PickableImage.PickableImage
No se pudo convertir com.ms.dxmedia.Point2Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Point2Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Point2Bvr.Point2Bvr
No se pudo convertir com.ms.dxmedia.Point2Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Point3Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Point3Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Point3Bvr.Point3Bvr
No se pudo convertir com.ms.dxmedia.Point3Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Preferences.COLOR_KEY_BLUE
No se pudo convertir com.ms.dxmedia.Preferences.COLOR_KEY_GREEN
No se pudo convertir com.ms.dxmedia.Preferences.COLOR_KEY_RED
No se pudo convertir com.ms.dxmedia.Preferences.DITHERING
No se pudo convertir com.ms.dxmedia.Preferences.ENGINE_OPTIMIZATIONS
No se pudo convertir com.ms.dxmedia.Preferences.FILL_MODE
No se pudo convertir com.ms.dxmedia.Preferences.FILL_MODE_POINT
No se pudo convertir com.ms.dxmedia.Preferences.FILL_MODE_SOLID
No se pudo convertir com.ms.dxmedia.Preferences.FILL_MODE_WIREFRAME
No se pudo convertir com.ms.dxmedia.Preferences.MAX_FRAMES_PER_SEC
No se pudo convertir com.ms.dxmedia.Preferences.OVERRIDE_APPLICATION_PREFERENCES
No se pudo convertir com.ms.dxmedia.Preferences.PERSPECTIVE_CORRECT
No se pudo convertir com.ms.dxmedia.Preferences.RGB_LIGHTING_MODE
No se pudo convertir com.ms.dxmedia.Preferences.SHADE_MODE
No se pudo convertir com.ms.dxmedia.Preferences.SHADE_MODE_FLAT
No se pudo convertir com.ms.dxmedia.Preferences.SHADE_MODE_GOURAUD
No se pudo convertir com.ms.dxmedia.Preferences.SHADE_MODE_PHONG
No se pudo convertir com.ms.dxmedia.Preferences.TEXTURE_QUALITY
No se pudo convertir com.ms.dxmedia.Preferences.TEXTURE_QUALITY_LINEAR
No se pudo convertir com.ms.dxmedia.Preferences.TEXTURE_QUALITY_NEAREST
No se pudo convertir com.ms.dxmedia.Preferences.USE_3D_HW
No se pudo convertir com.ms.dxmedia.Preferences.USE_VIDEOMEM
No se pudo convertir com.ms.dxmedia.PropertyDispatcher
No se pudo convertir com.ms.dxmedia.SoundBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.SoundBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.SoundBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.SoundBvr.SoundBvr
No se pudo convertir com.ms.dxmedia.Statics.makeBvrFromInterface
No se pudo convertir com.ms.dxmedia.StaticsBase._site
No se pudo convertir com.ms.dxmedia.StaticsBase.BvrHook
No se pudo convertir com.ms.dxmedia.StaticsBase.checkRead
No se pudo convertir com.ms.dxmedia.StaticsBase.cm
No se pudo convertir com.ms.dxmedia.StaticsBase.foot
No se pudo convertir com.ms.dxmedia.StaticsBase.getCOMPtr
No se pudo convertir com.ms.dxmedia.StaticsBase.handleError
No se pudo convertir com.ms.dxmedia.StaticsBase.importGeometry
No se pudo convertir com.ms.dxmedia.StaticsBase.importImage
No se pudo convertir com.ms.dxmedia.StaticsBase.importMovie (asincrónico)
No se pudo convertir com.ms.dxmedia.StaticsBase.importMovie (sincrónico)
No se pudo convertir com.ms.dxmedia.StaticsBase.importSound (asincrónico)
No se pudo convertir com.ms.dxmedia.StaticsBase.importSound (sincrónico)
No se pudo convertir com.ms.dxmedia.StaticsBase.inch
No se pudo convertir com.ms.dxmedia.StaticsBase.meter
No se pudo convertir com.ms.dxmedia.StaticsBase.mm
No se pudo convertir com.ms.dxmedia.StaticsBase.registerErrorAndWarningReceiver
No se pudo convertir com.ms.dxmedia.StaticsBase.unregisterCallback
No se pudo convertir com.ms.dxmedia.StringBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.StringBvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.StringBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.StringBvr.StringBvr
No se pudo convertir com.ms.dxmedia.Transform2Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Transform2Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Transform2Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Transform2Bvr.Transform2Bvr
No se pudo convertir com.ms.dxmedia.Transform3Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Transform3Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Transform3Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Transform3Bvr.Transform3Bvr
No se pudo convertir com.ms.dxmedia.TupleBvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.TupleBvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.TupleBvr.TupleBvr
No se pudo convertir com.ms.dxmedia.UntilNotifierCB
No se pudo convertir com.ms.dxmedia.Vector2Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Vector2Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Vector2Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Vector2Bvr.Vector2Bvr
No se pudo convertir com.ms.dxmedia.Vector3Bvr.getCOMPtr
No se pudo convertir com.ms.dxmedia.Vector3Bvr.newUninitBehavior
No se pudo convertir com.ms.dxmedia.Vector3Bvr.setCOMBvr
No se pudo convertir com.ms.dxmedia.Vector3Bvr.Vector3Bvr
No se pudo convertir com.ms.dxmedia.Viewer.getCurrentTickTime
No se pudo convertir com.ms.dxmedia.Viewer.registerErrorAndWarningReceiver
No se pudo convertir com.ms.dxmedia.Viewer.startModel
No se pudo convertir com.ms.dxmedia.Viewer.tick
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.fx


No se pudo convertir com.ms.fx.BaseColor.BaseColor
No se pudo convertir com.ms.fx.fullTxtRun
No se pudo convertir com.ms.fx.FxBrushPen.drawBytesCallback
No se pudo convertir com.ms.fx.FxBrushPen.drawCharsCallback
No se pudo convertir com.ms.fx.FxBrushPen.drawRoundRectCallback
No se pudo convertir com.ms.fx.FxBrushPen.drawScanLinesCallback
No se pudo convertir com.ms.fx.FxBrushPen.drawStringCallback
No se pudo convertir com.ms.fx.FxBrushPen.fill3DRectCallback
No se pudo convertir com.ms.fx.FxBrushPen.fillRoundRectCallback
No se pudo convertir com.ms.fx.FxCaret
No se pudo convertir com.ms.fx.FxColor.brightenColor
No se pudo convertir com.ms.fx.FxColor.darkenColor
No se pudo convertir com.ms.fx.FxColor.FxColor
No se pudo convertir com.ms.fx.FxColor.getHilight
No se pudo convertir com.ms.fx.FxColor.getShadow
No se pudo convertir com.ms.fx.FxComponentImage
No se pudo convertir com.ms.fx.FxComponentTexture.FxComponentTexture
No se pudo convertir com.ms.fx.FxCurve
No se pudo convertir com.ms.fx.FxEllipse
No se pudo convertir com.ms.fx.FxFont.ANTIALIAS
No se pudo convertir com.ms.fx.FxFont.drawEffects
No se pudo convertir com.ms.fx.FxFont.FONTXFONT
No se pudo convertir com.ms.fx.FxFont.FxFont
No se pudo convertir com.ms.fx.FxFont.getAttributeList
No se pudo convertir com.ms.fx.FxFont.getEmboldenedFont
No se pudo convertir com.ms.fx.FxFont.getFlags
No se pudo convertir com.ms.fx.FxFont.getFlagsVal
No se pudo convertir com.ms.fx.FxFont.getFont
No se pudo convertir com.ms.fx.FxFont.getFontList
No se pudo convertir com.ms.fx.FxFont.getStyleVal
No se pudo convertir com.ms.fx.FxFont.matchFace
No se pudo convertir com.ms.fx.FxFont.STRIKEOUT
No se pudo convertir com.ms.fx.FxFont.UNDERLINE
No se pudo convertir com.ms.fx.FxFont.USEDFONT
No se pudo convertir com.ms.fx.FxFontMetrics
No se pudo convertir com.ms.fx.FxFontMetricsOther
No se pudo convertir com.ms.fx.FxFormattedText
No se pudo convertir com.ms.fx.FxGraphicMetaFile.addObjectToTable
No se pudo convertir com.ms.fx.FxGraphicMetaFile.debugging
No se pudo convertir com.ms.fx.FxGraphicMetaFile.enumerate
No se pudo convertir com.ms.fx.FxGraphicMetaFile.FxGraphicMetaFile
No se pudo convertir com.ms.fx.FxGraphicMetaFile.hdc
No se pudo convertir com.ms.fx.FxGraphicMetaFile.hdcStates
No se pudo convertir com.ms.fx.FxGraphicMetaFile.play
No se pudo convertir com.ms.fx.FxGraphicMetaFile.records
No se pudo convertir com.ms.fx.FxGraphicMetaFile.removeObjectFromTable
No se pudo convertir com.ms.fx.FxGraphics.drawBezier
No se pudo convertir com.ms.fx.FxGraphics.drawBorder
No se pudo convertir com.ms.fx.FxGraphics.drawChars
No se pudo convertir com.ms.fx.FxGraphics.drawCharsWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphics.drawOutlineChar
No se pudo convertir com.ms.fx.FxGraphics.drawOutlinePolygon
No se pudo convertir com.ms.fx.FxGraphics.drawPixels
No se pudo convertir com.ms.fx.FxGraphics.drawScanLines
No se pudo convertir com.ms.fx.FxGraphics.drawString
No se pudo convertir com.ms.fx.FxGraphics.drawString(int, int)
No se pudo convertir com.ms.fx.FxGraphics.drawStringFormatted
No se pudo convertir com.ms.fx.FxGraphics.drawStringWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphics.drawT2Curve
No se pudo convertir com.ms.fx.FxGraphics.fill3DRect
No se pudo convertir com.ms.fx.FxGraphics.getClip
No se pudo convertir com.ms.fx.FxGraphics.getExtendedGraphics
No se pudo convertir com.ms.fx.FxGraphics.getGlyphOutline
No se pudo convertir com.ms.fx.FxGraphics.intelliFont
No se pudo convertir com.ms.fx.FxGraphics.setClip
No se pudo convertir com.ms.fx.FxGraphicsOVM.baseGraphics
No se pudo convertir com.ms.fx.FxGraphicsOVM.clearRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.clipRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.copyArea
No se pudo convertir com.ms.fx.FxGraphicsOVM.create
No se pudo convertir com.ms.fx.FxGraphicsOVM.dispose
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawArc
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawBezier
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawBorder
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawBytes
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawChars
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawChars (char[], int, int, int, int)
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawChars (char[], int, int, int, int, Rectangle, int, int[], int[])
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawCharsWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawLine
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawOutlinePolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawOval
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawPixels
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawPolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawPolyline
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawRoundRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawScanLines
No se pudo convertir com.ms.fx.FxGraphicsOVM.drawString
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawCharsWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphicsOVM.excludeClip
No se pudo convertir com.ms.fx.FxGraphicsOVM.fillArc
No se pudo convertir com.ms.fx.FxGraphicsOVM.fillOval
No se pudo convertir com.ms.fx.FxGraphicsOVM.fillPolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM.fillRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.fillRoundRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.FxGraphicsOVM
No se pudo convertir com.ms.fx.FxGraphicsOVM.getBaseGraphics
No se pudo convertir com.ms.fx.FxGraphicsOVM.getClipBounds
No se pudo convertir com.ms.fx.FxGraphicsOVM.getClipRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.getClipRegion
No se pudo convertir com.ms.fx.FxGraphicsOVM.getColor
No se pudo convertir com.ms.fx.FxGraphicsOVM.getFont
No se pudo convertir com.ms.fx.FxGraphicsOVM.getFontMetrics
No se pudo convertir com.ms.fx.FxGraphicsOVM.getGlyphOutline
No se pudo convertir com.ms.fx.FxGraphicsOVM.getTranslation
No se pudo convertir com.ms.fx.FxGraphicsOVM.hardClipRect
No se pudo convertir com.ms.fx.FxGraphicsOVM.intersectClip
No se pudo convertir com.ms.fx.FxGraphicsOVM.nativeSetFont
No se pudo convertir com.ms.fx.FxGraphicsOVM.originX
No se pudo convertir com.ms.fx.FxGraphicsOVM.originY
No se pudo convertir com.ms.fx.FxGraphicsOVM.runningAFC
No se pudo convertir com.ms.fx.FxGraphicsOVM.setClip
No se puede convertir com.ms.fx.FxGraphicsOVM.setClip(int, int, int)
No se pudo convertir com.ms.fx.FxGraphicsOVM.setClip(Region)
No se puede convertir com.ms.fx.FxGraphicsOVM.setClip(Shape)
No se pudo convertir com.ms.fx.FxGraphicsOVM.setColor
No se pudo convertir com.ms.fx.FxGraphicsOVM.setFont
No se pudo convertir com.ms.fx.FxGraphicsOVM.setPaintMode
No se pudo convertir com.ms.fx.FxGraphicsOVM.setXORMode
No se pudo convertir com.ms.fx.FxGraphicsOVM.systemInterface
No se pudo convertir com.ms.fx.FxGraphicsOVM11
No se pudo convertir com.ms.fx.FxGraphicsOVM11.clearRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.clipRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.copyArea
No se pudo convertir com.ms.fx.FxGraphicsOVM11.dispose
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawArc
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawBezier
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawBorder
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawBytes
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawChars
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawCharsWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawLine
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawOutlinePolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawOval
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawPixels
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawPolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawPolyline
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawRoundRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawScanLines
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawString
No se pudo convertir com.ms.fx.FxGraphicsOVM11.drawStringWithoutFxFont
No se pudo convertir com.ms.fx.FxGraphicsOVM11.excludeClip
No se pudo convertir com.ms.fx.FxGraphicsOVM11.fillArc
No se pudo convertir com.ms.fx.FxGraphicsOVM11.fillOval
No se pudo convertir com.ms.fx.FxGraphicsOVM11.fillPolygon
No se pudo convertir com.ms.fx.FxGraphicsOVM11.fillRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.fillRoundRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getBaseGraphics
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getClipBounds
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getClipRect
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getClipRegion
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getColor
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getFont
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getFontMetrics
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getGlyphOutline
No se pudo convertir com.ms.fx.FxGraphicsOVM11.getTranslation
No se pudo convertir com.ms.fx.FxGraphicsOVM11.intersectClip
No se pudo convertir com.ms.fx.FxGraphicsOVM11.nativeSetFont
No se pudo convertir com.ms.fx.FxGraphicsOVM11.originX
No se pudo convertir com.ms.fx.FxGraphicsOVM11.originY
No se pudo convertir com.ms.fx.FxGraphicsOVM11.runningAFC
No se pudo convertir com.ms.fx.FxGraphicsOVM11.setClip
No se pudo convertir com.ms.fx.FxGraphicsOVM11.setColor
No se pudo convertir com.ms.fx.FxGraphicsOVM11.setFont
No se pudo convertir com.ms.fx.FxGraphicsOVM11.setPaintMode
No se pudo convertir com.ms.fx.FxGraphicsOVM11.setXORMode
No se pudo convertir com.ms.fx.FxGraphicsOVM11.systemInterface
No se pudo convertir com.ms.fx.FxOutlineFont
No se pudo convertir com.ms.fx.FxPen.calcLineValues
No se pudo convertir com.ms.fx.FxPen.drawRoundRectCallback
No se pudo convertir com.ms.fx.FxPen.drawScanLinesCallback
No se pudo convertir com.ms.fx.FxPen.fillRectCallback
No se pudo convertir com.ms.fx.FxPen.FxPen
No se pudo convertir com.ms.fx.FxPen.myDrawOval
No se pudo convertir com.ms.fx.FxRubberPen
No se pudo convertir com.ms.fx.FxStateConfigurableImage
No se pudo convertir com.ms.fx.FxStateConfigurableUIImage.FxStateConfigurableUIImage
No se pudo convertir com.ms.fx.FxStateConfigurableUIImage.getImageState
No se pudo convertir com.ms.fx.FxStyledPen
No se pudo convertir com.ms.fx.FxStyledPen.FxStyledPen
No se pudo convertir com.ms.fx.FxSystemFont
No se pudo convertir com.ms.fx.FxSystemIcon
No se pudo convertir com.ms.fx.FxText.buffer
No se pudo convertir com.ms.fx.FxText.getChar
No se pudo convertir com.ms.fx.FxText.getWordBreak
No se pudo convertir com.ms.fx.FxText.isDelimiter
No se pudo convertir com.ms.fx.FxText.isWhite
No se pudo convertir com.ms.fx.FxText.nChars
No se pudo convertir com.ms.fx.FxText.setText
No se pudo convertir com.ms.fx.FxTexture.DRAW_BL
No se pudo convertir com.ms.fx.FxTexture.DRAW_BOTTOM
No se pudo convertir com.ms.fx.FxTexture.DRAW_BR
No se pudo convertir com.ms.fx.FxTexture.DRAW_CENTER
No se pudo convertir com.ms.fx.FxTexture.DRAW_LEFT
No se pudo convertir com.ms.fx.FxTexture.DRAW_RIGHT
No se pudo convertir com.ms.fx.FxTexture.DRAW_TL
No se pudo convertir com.ms.fx.FxTexture.DRAW_TOP
No se pudo convertir com.ms.fx.FxTexture.DRAW_TR
No se pudo convertir com.ms.fx.FxTexture.drawScanLinesCallback
No se pudo convertir com.ms.fx.FxTexture.FxTexture
No se pudo convertir com.ms.fx.FxTexture.getBottomAxis
No se pudo convertir com.ms.fx.FxTexture.getInner
No se pudo convertir com.ms.fx.FxTexture.getLeftAxis
No se pudo convertir com.ms.fx.FxTexture.getPinOrigin
No se pudo convertir com.ms.fx.FxTexture.getRightAxis
No se pudo convertir com.ms.fx.FxTexture.getSnapDraw
No se pudo convertir com.ms.fx.FxTexture.getStretch
No se pudo convertir com.ms.fx.FxTexture.getTopAxis
No se pudo convertir com.ms.fx.FxTexture.getUpdatedAreasMask
No se pudo convertir com.ms.fx.FxTexture.imageUpdate
No se pudo convertir com.ms.fx.FxTexture.REPEAT_PIN
No se pudo convertir com.ms.fx.FxTexture.setAxis
No se pudo convertir com.ms.fx.FxTexture.setPinOrigin
No se pudo convertir com.ms.fx.FxTexture.setSnapDraw
No se pudo convertir com.ms.fx.FxTexture.setStretch
No se pudo convertir com.ms.fx.FxTexture.setUpdateCallback
No se pudo convertir com.ms.fx.FxTexture.setUpdatedAreasMask
No se pudo convertir com.ms.fx.FxTexture.size
No se pudo convertir com.ms.fx.FxTexture.SNAP_EDGES
No se pudo convertir com.ms.fx.FxTexture.STRETCH_MIDDLE
No se pudo convertir com.ms.fx.FxTexture.STRETCH_OUTER
No se pudo convertir com.ms.fx.FxToolkit
No se pudo convertir com.ms.fx.GlyphMetrics
No se pudo convertir com.ms.fx.GlyphOutline
No se pudo convertir com.ms.fx.IFxShape
No se pudo convertir com.ms.fx.IFxSystemInterface
No se pudo convertir com.ms.fx.IFxTextCallback
No se pudo convertir com.ms.fx.IFxTextConstants
No se pudo convertir com.ms.fx.IFxTextConstants.DIRLAYOUT
No se pudo convertir com.ms.fx.IFxTextConstants.htaCenter
No se pudo convertir com.ms.fx.IFxTextConstants.htaJustified
No se pudo convertir com.ms.fx.IFxTextConstants.htaLeft
No se pudo convertir com.ms.fx.IFxTextConstants.htaRight
No se pudo convertir com.ms.fx.IFxTextConstants.htaScriptDefault
No se pudo convertir com.ms.fx.IFxTextConstants.htaStretch
No se pudo convertir com.ms.fx.IFxTextConstants.MOVE_DOWN
No se pudo convertir com.ms.fx.IFxTextConstants.MOVE_LEFT
No se pudo convertir com.ms.fx.IFxTextConstants.MOVE_RIGHT
No se pudo convertir com.ms.fx.IFxTextConstants.MOVE_UP
No se pudo convertir com.ms.fx.IFxTextConstants.NEXT_DOWN
No se pudo convertir com.ms.fx.IFxTextConstants.NEXT_LEFT
No se pudo convertir com.ms.fx.IFxTextConstants.NEXT_RIGHT
No se pudo convertir com.ms.fx.IFxTextConstants.NEXT_UP
No se pudo convertir com.ms.fx.IFxTextConstants.OPAQUE_BODY
No se pudo convertir com.ms.fx.IFxTextConstants.OPAQUE_POST
No se pudo convertir com.ms.fx.IFxTextConstants.OPAQUE_PRIOR
No se pudo convertir com.ms.fx.IFxTextConstants.SCRIPT_DEF
No se pudo convertir com.ms.fx.IFxTextConstants.tdBT_LR
No se pudo convertir com.ms.fx.IFxTextConstants.tdBT_RL
No se pudo convertir com.ms.fx.IFxTextConstants.tdHebrewNormal
No se pudo convertir com.ms.fx.IFxTextConstants.tdJapanTradNormal
No se pudo convertir com.ms.fx.IFxTextConstants.tdLatinNormal
No se pudo convertir com.ms.fx.IFxTextConstants.tdLeftToRightReading
No se pudo convertir com.ms.fx.IFxTextConstants.tdLR_BT
No se pudo convertir com.ms.fx.IFxTextConstants.tdLR_TB
No se pudo convertir com.ms.fx.IFxTextConstants.tdMongolianNormal
No se pudo convertir com.ms.fx.IFxTextConstants.tdRightToLeftReading
No se pudo convertir com.ms.fx.IFxTextConstants.tdRL_BT
No se pudo convertir com.ms.fx.IFxTextConstants.tdRL_TB
No se pudo convertir com.ms.fx.IFxTextConstants.tdScriptDefault
No se pudo convertir com.ms.fx.IFxTextConstants.tdTB_LR
No se pudo convertir com.ms.fx.IFxTextConstants.tdTB_RL
No se pudo convertir com.ms.fx.IFxTextConstants.tdVisualLayout
No se pudo convertir com.ms.fx.IFxTextConstants.VISUAL_DEF
No se pudo convertir com.ms.fx.IFxTextConstants.vtaBaseline
No se pudo convertir com.ms.fx.IFxTextConstants.vtaBottom
No se pudo convertir com.ms.fx.IFxTextConstants.vtaCenter
No se pudo convertir com.ms.fx.IFxTextConstants.vtaScriptDefault
No se pudo convertir com.ms.fx.IFxTextConstants.vtaStretch
No se pudo convertir com.ms.fx.IFxTextConstants.vtaTop
No se pudo convertir com.ms.fx.IFxTextConstants.wwCleanEdges
No se pudo convertir com.ms.fx.IFxTextConstants.wwKeepWordIntact
No se pudo convertir com.ms.fx.IFxTextConstants.wwMask
No se pudo convertir com.ms.fx.IFxTextConstants.wwNone
No se pudo convertir com.ms.fx.IFxTextConstants.wwTypeMask
No se pudo convertir com.ms.fx.IFxTextConstants.wwVirtualRectEnd
No se pudo convertir com.ms.fx.IFxTextConstants.wwVirtualRectSide
No se pudo convertir com.ms.fx.IFxTextConstants.wwWrap
No se pudo convertir com.ms.fx.IFxTextureUpdate
No se pudo convertir com.ms.fx.OutlineCurve
No se pudo convertir com.ms.fx.OutlinePolygon
No se pudo convertir com.ms.fx.PeerConstants
No se pudo convertir com.ms.fx.Region.clone
No se pudo convertir com.ms.fx.Region.COMPLEX
No se pudo convertir com.ms.fx.Region.complexity
No se pudo convertir com.ms.fx.Region.copy
No se pudo convertir com.ms.fx.Region.EMPTY~
No se pudo convertir com.ms.fx.Region.equals
No se pudo convertir com.ms.fx.Region.fillBounds
No se pudo convertir com.ms.fx.Region.getBounds
No se pudo convertir com.ms.fx.Region.getGeometry
No se pudo convertir com.ms.fx.Region.invert
No se pudo convertir com.ms.fx.Region.isEmpty
No se pudo convertir com.ms.fx.Region.Region
No se pudo convertir com.ms.fx.Region.set
No se pudo convertir com.ms.fx.Region.SIMPLE
No se pudo convertir com.ms.fx.RegionConverter
No se pudo convertir com.ms.fx.txtRun
No se pudo convertir com.ms.fx.Version
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.io


No se pudo convertir com.ms.io.console.Console
No se pudo convertir com.ms.io.console.DefaultConsole
No se pudo convertir com.ms.io.ObjectInputStreamWithLoader
No se pudo convertir com.ms.io.OffsetInputStreamFilter.mark
No se pudo convertir com.ms.io.OffsetInputStreamFilter.reset
No se pudo convertir com.ms.io.Path.hasExecExtensionType
No se pudo convertir com.ms.io.Path.isRoot
No se pudo convertir com.ms.io.Path.validateFilename
No se pudo convertir com.ms.io.SystemInputStream
No se pudo convertir com.ms.io.SystemOutputStream
No se pudo convertir com.ms.io.UserFileDialog
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.jdbc.odbc


No se pudo convertir com.ms.jdbc.odbc.JdbcOdbcConnection.getAutoCommit
No se pudo convertir com.ms.jdbc.odbc.JdbcOdbcConnection.getMetaData
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.lang


No se pudo convertir com.ms.lang.MulticastDelegate.invokeHelperMulticast
No se pudo convertir com.ms.lang.RegKey.enumKey
No se pudo convertir com.ms.lang.RegKey.finalize
No se pudo convertir com.ms.lang.RegKey.getBinaryValue
No se pudo convertir com.ms.lang.RegKey.KEYOPEN_ALL
No se pudo convertir com.ms.lang.RegKey.KEYOPEN_CREATE
No se pudo convertir com.ms.lang.RegKey.KEYOPEN_READ
No se pudo convertir com.ms.lang.RegKey.KEYOPEN_WRITE
No se pudo convertir com.ms.lang.RegKey.loadKey
No se pudo convertir com.ms.lang.RegKey.queryInfo
No se pudo convertir com.ms.lang.RegKey.replace
No se pudo convertir com.ms.lang.RegKey.restore
No se pudo convertir com.ms.lang.RegKey.unload
No se pudo convertir com.ms.lang.RegQueryInfo
No se pudo convertir com.ms.lang.SystemThread
No se pudo convertir com.ms.lang.SystemX.arrayCompare
No se pudo convertir com.ms.lang.SystemX.blockcopy
No se pudo convertir com.ms.lang.SystemX.exitProcessAfterMainThreadReturns
No se pudo convertir com.ms.lang.SystemX.getDeclaredMethodFromSignature
No se pudo convertir com.ms.lang.SystemX.getDefaultInputManager
No se pudo convertir com.ms.lang.SystemX.getInputManager
No se pudo convertir com.ms.lang.SystemX.getKeyboardLanguageName
No se pudo convertir com.ms.lang.SystemX.getKeyboardLanguages
No se pudo convertir com.ms.lang.SystemX.getMethodFromSignature
No se pudo convertir com.ms.lang.SystemX.getNativeServices
No se pudo convertir com.ms.lang.SystemX.isLocalCharDBCSLeadByte
No se pudo convertir com.ms.lang.SystemX.JavaStringToLocalString
No se pudo convertir com.ms.lang.SystemX.LocalStringToJavaString
No se pudo convertir com.ms.lang.SystemX.setInputManager
No se pudo convertir com.ms.lang.SystemX.setKeyboardLanguage
No se pudo convertir com.ms.lang.VerifyErrorEx
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.mtx


No se pudo convertir com.ms.mtx.AppServer
No se pudo convertir com.ms.mtx.Context.createObject
No se pudo convertir com.ms.mtx.Context.disableCommit
No se pudo convertir com.ms.mtx.Context.enableCommit
No se pudo convertir com.ms.mtx.Context.getContextId
No se pudo convertir com.ms.mtx.Context.getDeactivateOnReturn
No se pudo convertir com.ms.mtx.Context.getDirectCallerName
No se pudo convertir com.ms.mtx.Context.getDirectCreatorName
No se pudo convertir com.ms.mtx.Context.getMyTransactionVote
No se pudo convertir com.ms.mtx.Context.getObjectContext
No se pudo convertir com.ms.mtx.Context.getOriginalCallerName
No se pudo convertir com.ms.mtx.Context.getOriginalCreatorName
No se pudo convertir com.ms.mtx.Context.getProperty
No se pudo convertir com.ms.mtx.Context.getPropertyNames
No se pudo convertir com.ms.mtx.Context.getSafeRef
No se pudo convertir com.ms.mtx.Context.getTransaction
No se pudo convertir com.ms.mtx.Context.getTransactionId
No se pudo convertir com.ms.mtx.Context.isCallerInRole
No se pudo convertir com.ms.mtx.Context.isInTransaction
No se pudo convertir com.ms.mtx.Context.isSecurityEnabled
No se pudo convertir com.ms.mtx.Context.setAbort
No se pudo convertir com.ms.mtx.Context.setComplete
No se pudo convertir com.ms.mtx.Context.setDeactivateOnReturn
No se pudo convertir com.ms.mtx.Context.setMyTransactionVote
No se pudo convertir com.ms.mtx.Context.TxAbort
No se pudo convertir com.ms.mtx.Context.TxCommit
No se pudo convertir com.ms.mtx.IContextState.GetDeactivateOnReturn
No se pudo convertir com.ms.mtx.IContextState.GetMyTransactionVote
No se pudo convertir com.ms.mtx.IContextState.iid
No se pudo convertir com.ms.mtx.IContextState.SetDeactivateOnReturn
No se pudo convertir com.ms.mtx.IContextState.SetMyTransactionVote
No se pudo convertir com.ms.mtx.IEnumNames
No se pudo convertir com.ms.mtx.IGetContextProperties
No se pudo convertir com.ms.mtx.IMTxAS
No se pudo convertir com.ms.mtx.IMTxAS.GetObjectContext
No se pudo convertir com.ms.mtx.IMTxAS.iid
No se pudo convertir com.ms.mtx.IObjectContext.CreateInstance
No se pudo convertir com.ms.mtx.IObjectContext.iid
No se pudo convertir com.ms.mtx.IObjectContextInfo.iid
No se pudo convertir com.ms.mtx.IObjectControl.iid
No se pudo convertir com.ms.mtx.IObjectControl
No se pudo convertir com.ms.mtx.ISecurityCallContext.getItem
No se pudo convertir com.ms.mtx.ISecurityCallContext.iid
No se pudo convertir com.ms.mtx.ISecurityCallersColl.iid
No se pudo convertir com.ms.mtx.ISecurityIdentityColl.getItem
No se pudo convertir com.ms.mtx.ISecurityIdentityColl.iid
No se pudo convertir com.ms.mtx.SecurityProperty.GetDirectCallerName
No se pudo convertir com.ms.mtx.SecurityProperty.GetOriginalCallerName
No se pudo convertir com.ms.mtx.ISharedProperty.iid
No se pudo convertir com.ms.mtx.ISharedPropertyGroup.iid
No se pudo convertir com.ms.mtx.ISharedPropertyGroupManager.iid
No se pudo convertir com.ms.mtx.ITransactionContextEx
No se pudo convertir com.ms.mtx.MTx
No se pudo convertir com.ms.mtx.ObjectContext.CreateInstance
No se pudo convertir com.ms.mtx.ObjectContext.DisableCommit
No se pudo convertir com.ms.mtx.ObjectContext.EnableCommit
No se pudo convertir com.ms.mtx.ObjectContext.get_NewEnum
No se pudo convertir com.ms.mtx.ObjectContext.getCount
No se pudo convertir com.ms.mtx.ObjectContext.getItem
No se pudo convertir com.ms.mtx.ObjectContext.getSecurity
No se pudo convertir com.ms.mtx.ObjectContext.iid
No se pudo convertir com.ms.mtx.ObjectContext.IsCallerInRole
No se pudo convertir com.ms.mtx.ObjectContext.IsInTransaction
No se pudo convertir com.ms.mtx.ObjectContext.IsSecurityEnabled
No se pudo convertir com.ms.mtx.ObjectContext.SetAbort
No se pudo convertir com.ms.mtx.ObjectContext.SetComplete
No se pudo convertir com.ms.mtx.SecurityCallContext.getCallers
No se pudo convertir com.ms.mtx.SecurityCallContext.getDirectCaller
No se pudo convertir com.ms.mtx.SecurityCallContext.getNumCallers
No se pudo convertir com.ms.mtx.SecurityCallContext.getProperty
No se pudo convertir com.ms.mtx.SecurityCallContext.getPropertyNames
No se pudo convertir com.ms.mtx.SecurityCallContext.isUserInRole
No se pudo convertir com.ms.mtx.SecurityCaller
No se pudo convertir com.ms.mtx.SecurityProperty.GetDirectCreatorName
No se pudo convertir com.ms.mtx.SecurityProperty.GetOriginalCreatorName
No se pudo convertir com.ms.mtx.SecurityProperty.iid
No se pudo convertir com.ms.mtx.SharedPropertyGroupManager.clsid
No se pudo convertir com.ms.mtx.SharedPropertyGroupManager.get_NewEnum
No se pudo convertir com.ms.mtx.TransactionContextEx
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.object


No se pudo convertir com.ms.object.Category
No se pudo convertir com.ms.object.dragdrop.DragHandler
No se pudo convertir com.ms.object.dragdrop.DragHelper
No se pudo convertir com.ms.object.dragdrop.DragProxy
No se pudo convertir com.ms.object.dragdrop.DragSession.getDragModifiers
No se pudo convertir com.ms.object.dragdrop.DragSource.DEFAULT_ACTION
No se pudo convertir com.ms.object.dragdrop.DragSource.queryDragCursor
No se pudo convertir com.ms.object.dragdrop.DragSource.queryDragStatus
No se pudo convertir com.ms.object.IServiceObjectProvider
No se pudo convertir com.ms.object.ISite
No se pudo convertir com.ms.object.ISiteable
No se pudo convertir com.ms.object.MetaObject
No se pudo convertir com.ms.object.ObjectBag
No se pudo convertir com.ms.object.SimpleTransferSession
No se pudo convertir com.ms.object.TransferSession
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Com.ms.ui


No se pudo convertir com.ms.ui.<NombreClase>.add*Listener
No se pudo convertir com.ms.ui.<NombreClase>.addNotify
No se pudo convertir com.ms.ui.<NombreClase>.getPeer
No se pudo convertir com.ms.ui.<NombreClase>.handleEvent
No se pudo convertir com.ms.ui.<NombreClase>.isNotified
No se pudo convertir com.ms.ui.<NombreClase>.process*Event
No se pudo convertir com.ms.ui.<NombreClase>.remove*Listener
No se pudo convertir com.ms.ui.<NombreClase>.removeNotify
No se pudo convertir com.ms.ui.<NombreClase>.setListenerTracker
No se pudo convertir com.ms.ui.<NombreClase>BeanInfo
No se pudo convertir com.ms.ui.AwtUIApplet.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIApplet.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIApplet.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIApplet.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.AwtUIApplet.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIApplet.AwtUIApplet(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIApplet.AwtUIApplet(UIApplet)
No se pudo convertir com.ms.ui.AwtUIApplet.destroy
No se pudo convertir com.ms.ui.AwtUIApplet.getComponent
No se pudo convertir com.ms.ui.AwtUIApplet.getHeader
No se pudo convertir com.ms.ui.AwtUIApplet.getRoot
No se pudo convertir com.ms.ui.AwtUIApplet.getTaskManager
No se pudo convertir com.ms.ui.AwtUIApplet.getUIComponentCount
No se pudo convertir com.ms.ui.AwtUIApplet.setHeader
No se pudo convertir com.ms.ui.AwtUIApplet.setLayout
No se pudo convertir com.ms.ui.AwtUIBand
No se pudo convertir com.ms.ui.AwtUIBandBeanInfo.AwtUIBandBeanInfo
No se pudo convertir com.ms.ui.AwtUIBandBeanInfo.getIcon
No se pudo convertir com.ms.ui.AwtUIBandBox
No se pudo convertir com.ms.ui.AwtUIBandBoxBeanInfo.AwtUIBandBoxBeanInfo
No se pudo convertir com.ms.ui.AwtUIBandBoxBeanInfo.getIcon
No se pudo convertir com.ms.ui.AwtUIButton._btn
No se pudo convertir com.ms.ui.AwtUIButton.getStyle
No se pudo convertir com.ms.ui.AwtUIButton.keyDown
No se pudo convertir com.ms.ui.AwtUIButton.keyUp
No se pudo convertir com.ms.ui.AwtUIButton.mouseUp
No se pudo convertir com.ms.ui.AwtUIButton.setStyle
No se pudo convertir com.ms.ui.AwtUICheckButton.getBase
No se pudo convertir com.ms.ui.AwtUICheckButton.getSelectedObjects
No se pudo convertir com.ms.ui.AwtUIChoice.add
No se pudo convertir com.ms.ui.AwtUIChoice.addSelectedIndex
No se pudo convertir com.ms.ui.AwtUIChoice.addSelectedIndices
No se pudo convertir com.ms.ui.AwtUIChoice.addSelectedItem
No se pudo convertir com.ms.ui.AwtUIChoice.addSelectedItems
No se pudo convertir com.ms.ui.AwtUIChoice.getAnchorItem
No se pudo convertir com.ms.ui.AwtUIChoice.getBase
No se pudo convertir com.ms.ui.AwtUIChoice.getExtensionItem
No se pudo convertir com.ms.ui.AwtUIChoice.getSelectedItem
No se pudo convertir com.ms.ui.AwtUIChoice.getSelectedItems
No se pudo convertir com.ms.ui.AwtUIChoice.getSelectedObjects
No se pudo convertir com.ms.ui.AwtUIChoice.getSelectionMode
No se pudo convertir com.ms.ui.AwtUIChoice.getStyle
No se pudo convertir com.ms.ui.AwtUIChoice.removeSelectedIndex
No se pudo convertir com.ms.ui.AwtUIChoice.removeSelectedIndices
No se pudo convertir com.ms.ui.AwtUIChoice.removeSelectedItem
No se pudo convertir com.ms.ui.AwtUIChoice.removeSelectedItems
No se pudo convertir com.ms.ui.AwtUIChoice.setAnchorItem
No se pudo convertir com.ms.ui.AwtUIChoice.setExtensionItem
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectedIndices
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectedItem
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectedItems
No se pudo convertir com.ms.ui.AwtUIChoice.setSelectionMode
No se pudo convertir com.ms.ui.AwtUIChoice.setStyle
No se pudo convertir com.ms.ui.AwtUIColumnViewer
No se pudo convertir com.ms.ui.AwtUIControl.add(Component, Object)
No se pudo convertir com.ms.ui.AwtUIControl.add(Component, Object, int)
No se pudo convertir com.ms.ui.AwtUIControl.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIControl.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIControl.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIControl.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.AwtUIControl.add(String, Component)
No se pudo convertir com.ms.ui.AwtUIControl.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIControl.AwtUIControl
No se pudo convertir com.ms.ui.AwtUIControl.getID
No se pudo convertir com.ms.ui.AwtUIControl.isSelected
No se pudo convertir com.ms.ui.AwtUIControl.postEvent
No se pudo convertir com.ms.ui.AwtUIControl.setChecked
No se pudo convertir com.ms.ui.AwtUIControl.setHot
No se pudo convertir com.ms.ui.AwtUIControl.setID
No se pudo convertir com.ms.ui.AwtUIControl.setIndeterminate
No se pudo convertir com.ms.ui.AwtUIControl.setLayout
No se pudo convertir com.ms.ui.AwtUIControl.setPressed
No se pudo convertir com.ms.ui.AwtUIControl.setReparent
No se pudo convertir com.ms.ui.AwtUIControl.setSelected
No se pudo convertir com.ms.ui.AwtUIDialog.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIDialog.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIDialog.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIDialog.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.AwtUIDialog.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIDialog.getComponent
No se pudo convertir com.ms.ui.AwtUIDialog.position
No se pudo convertir com.ms.ui.AwtUIDialog.setLayout
No se pudo convertir com.ms.ui.AwtUIDrawText.getCharFromScreen
No se pudo convertir com.ms.ui.AwtUIDrawText.getCharLocation
No se pudo convertir com.ms.ui.AwtUIDrawText.getOutline
No se pudo convertir com.ms.ui.AwtUIDrawText.isAutoResizable
No se pudo convertir com.ms.ui.AwtUIDrawText.setAutoResizable
No se pudo convertir com.ms.ui.AwtUIDrawText.setHorizAlign
No se pudo convertir com.ms.ui.AwtUIDrawText.setOutline
No se pudo convertir com.ms.ui.AwtUIDrawText.setRefresh
No se pudo convertir com.ms.ui.AwtUIDrawText.setVertAlign
No se pudo convertir com.ms.ui.AwtUIDrawText.setWordWrap
No se pudo convertir com.ms.ui.AwtUIEdit.getCharFromScreen
No se pudo convertir com.ms.ui.AwtUIEdit.getCharLocation
No se pudo convertir com.ms.ui.AwtUIEdit.getOutline
No se pudo convertir com.ms.ui.AwtUIEdit.getWordWrap
No se pudo convertir com.ms.ui.AwtUIEdit.isAutoResizable
No se pudo convertir com.ms.ui.AwtUIEdit.setAutoResizable
No se pudo convertir com.ms.ui.AwtUIEdit.setHorizAlign
No se pudo convertir com.ms.ui.AwtUIEdit.setOutline
No se pudo convertir com.ms.ui.AwtUIEdit.setRefresh
No se pudo convertir com.ms.ui.AwtUIEdit.setVertAlign
No se pudo convertir com.ms.ui.AwtUIEdit.setWordWrap
No se pudo convertir com.ms.ui.AwtUIEdit.showCaret
No se pudo convertir com.ms.ui.AwtUIFrame.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIFrame.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIFrame.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIFrame.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.AwtUIFrame.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIFrame.requestFocus
No se pudo convertir com.ms.ui.AwtUIFrame.setLayout
No se pudo convertir com.ms.ui.AwtUIGraphic.AwtUIGraphic
No se pudo convertir com.ms.ui.AwtUIGraphic.getContentBounds
No se pudo convertir com.ms.ui.AwtUIGraphic.imageUpdate
No se pudo convertir com.ms.ui.AwtUIHost
No se pudo convertir com.ms.ui.AwtUIHost.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIHost.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIHost.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIHost.add(IUIComonent, Object, int)
No se pudo convertir com.ms.ui.AwtUIHost.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIHost.disableHostEvents
No se pudo convertir com.ms.ui.AwtUIHost.enableHostEvents
No se pudo convertir com.ms.ui.AwtUIHost.getComponent
No se pudo convertir com.ms.ui.AwtUIHost.getHeader
No se pudo convertir com.ms.ui.AwtUIHost.getPreferredSize
No se pudo convertir com.ms.ui.AwtUIHost.getRoot
No se pudo convertir com.ms.ui.AwtUIHost.getUIComponent
No se pudo convertir com.ms.ui.AwtUIHost.invalidate
No se pudo convertir com.ms.ui.AwtUIHost.layout
No se pudo convertir com.ms.ui.AwtUIHost.listenerTracker
No se pudo convertir com.ms.ui.AwtUIHost.obtainListenerTracker
No se pudo convertir com.ms.ui.AwtUIHost.paint
No se pudo convertir com.ms.ui.AwtUIHost.paintAll
No se pudo convertir com.ms.ui.AwtUIHost.preferredSize
No se pudo convertir com.ms.ui.AwtUIHost.preProcessHostEvent
No se pudo convertir com.ms.ui.AwtUIHost.root
No se pudo convertir com.ms.ui.AwtUIHost.setHeader
No se pudo convertir com.ms.ui.AwtUIHost.setLayout
No se pudo convertir com.ms.ui.AwtUIHost.setListenerHost
No se pudo convertir com.ms.ui.AwtUIHost.show
No se pudo convertir com.ms.ui.AwtUIHost.usingNewEvents
No se pudo convertir com.ms.ui.AwtUIHost.validate
No se pudo convertir com.ms.ui.AwtUIHost.validateTree
No se pudo convertir com.ms.ui.AwtUIList.addSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUIList.addSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUIList.addSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUIList.addSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUIList.addSelectedItem
No se pudo convertir com.ms.ui.AwtUIList.addSelectedItems
No se pudo convertir com.ms.ui.AwtUIList.AwtUIList(int)
No se pudo convertir com.ms.ui.AwtUIList.AwtUIList(int, int)
No se pudo convertir com.ms.ui.AwtUIList.find
No se pudo convertir com.ms.ui.AwtUIList.getSelectedIndex
No se pudo convertir com.ms.ui.AwtUIList.getSelectedItem
No se pudo convertir com.ms.ui.AwtUIList.remove
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedItem
No se pudo convertir com.ms.ui.AwtUIList.removeSelectedItems
No se pudo convertir com.ms.ui.AwtUIList.setSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUIList.setSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUIList.setSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUIList.setSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUIList.setSelectedItem
No se pudo convertir com.ms.ui.AwtUIList.setSelectedItems
No se pudo convertir com.ms.ui.AwtUIList.setSelectionMode
No se pudo convertir com.ms.ui.AwtUIMarquee
No se pudo convertir com.ms.ui.AwtUIMenuList.AwtUIMenuList
No se pudo convertir com.ms.ui.AwtUIMenuList.getSelectedObjects
No se pudo convertir com.ms.ui.AwtUIMessageBox
No se pudo convertir com.ms.ui.AwtUIMessageBox.action
No se pudo convertir com.ms.ui.AwtUIMessageBox.AwtUIMessageBox
No se pudo convertir com.ms.ui.AwtUIMessageBox.doModal
No se pudo convertir com.ms.ui.AwtUIMessageBox.doModalIndex
No se pudo convertir com.ms.ui.AwtUIMessageBox.getButtonAlignment
No se pudo convertir com.ms.ui.AwtUIMessageBox.getButtons
No se pudo convertir com.ms.ui.AwtUIMessageBox.getDefaultButton
No se pudo convertir com.ms.ui.AwtUIMessageBox.getFrame
No se pudo convertir com.ms.ui.AwtUIMessageBox.getImage
No se pudo convertir com.ms.ui.AwtUIMessageBox.getText
No se pudo convertir com.ms.ui.AwtUIMessageBox.getTimeout
No se pudo convertir com.ms.ui.AwtUIMessageBox.insets
No se pudo convertir com.ms.ui.AwtUIMessageBox.keyDown
No se pudo convertir com.ms.ui.AwtUIMessageBox.keyUp
No se pudo convertir com.ms.ui.AwtUIMessageBox.preferredSize
No se pudo convertir com.ms.ui.AwtUIMessageBox.setButtonAlignment
No se pudo convertir com.ms.ui.AwtUIMessageBox.setButtons
No se pudo convertir com.ms.ui.AwtUIMessageBox.setDefaultButton
No se pudo convertir com.ms.ui.AwtUIMessageBox.setImage
No se pudo convertir com.ms.ui.AwtUIMessageBox.setText
No se pudo convertir com.ms.ui.AwtUIMessageBox.setTimeout
No se pudo convertir com.ms.ui.AwtUIMessageBox.timeTriggered
No se pudo convertir com.ms.ui.AwtUIPanel.setLayout
No se pudo convertir com.ms.ui.AwtUIProgress.AwtUIProgress
No se pudo convertir com.ms.ui.AwtUIProgress.getBase
No se pudo convertir com.ms.ui.AwtUIPushButton.getBase
No se pudo convertir com.ms.ui.AwtUIRadioButton.AwtUIRadioButton(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIRadioButton.AwtUIRadioButton(String, int)
No se pudo convertir com.ms.ui.AwtUIRadioButton.getBase
No se pudo convertir com.ms.ui.AwtUIRadioButton.getSelectedObjects
No se pudo convertir com.ms.ui.AwtUIRepeatButton.AwtUIRepeatButton
No se pudo convertir com.ms.ui.AwtUIScrollBar
No se pudo convertir com.ms.ui.AwtUIScrollBar.AwtUIScrollBar
No se pudo convertir com.ms.ui.AwtUIScrollBar.getBase
No se pudo convertir com.ms.ui.AwtUIScrollBar.getStyle
No se pudo convertir com.ms.ui.AwtUIScrollBar.scrollLineDown
No se pudo convertir com.ms.ui.AwtUIScrollBar.scrollLineUp
No se pudo convertir com.ms.ui.AwtUIScrollBar.scrollPageDown
No se pudo convertir com.ms.ui.AwtUIScrollBar.scrollPageUp
No se pudo convertir com.ms.ui.AwtUIScrollBar.setScrollInfo
No se pudo convertir com.ms.ui.AwtUIScrollBar.setScrollLine
No se pudo convertir com.ms.ui.AwtUIScrollBar.setStyle
No se pudo convertir com.ms.ui.AwtUIScrollBar.setUnitIncrement
No se pudo convertir com.ms.ui.AwtUIScrollViewer
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(Component)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(int, int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(int, int, int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent, int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent, int, int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.AwtUIScrollViewer(IUIComponent, int, int, int, int, int)
No se pudo convertir com.ms.ui.AwtUIScrollViewer.getContent
No se pudo convertir com.ms.ui.AwtUIScrollViewer.getHLine
No se pudo convertir com.ms.ui.AwtUIScrollViewer.getLine
No se pudo convertir com.ms.ui.AwtUIScrollViewer.getVLine
No se pudo convertir com.ms.ui.AwtUIScrollViewer.setContent
No se pudo convertir com.ms.ui.AwtUIScrollViewer.setHLine
No se pudo convertir com.ms.ui.AwtUIScrollViewer.setLine
No se pudo convertir com.ms.ui.AwtUIScrollViewer.setVLine
No se pudo convertir com.ms.ui.AwtUISplitViewer
No se pudo convertir com.ms.ui.AwtUISplitViewer.add
No se pudo convertir com.ms.ui.AwtUISplitViewer.AwtUISplitViewer
No se pudo convertir com.ms.ui.AwtUISplitViewer.getComponent
No se pudo convertir com.ms.ui.AwtUISplitViewer.getPos
No se pudo convertir com.ms.ui.AwtUISplitViewer.getStyle
No se pudo convertir com.ms.ui.AwtUISplitViewer.remove
No se pudo convertir com.ms.ui.AwtUISplitViewer.setPos
No se pudo convertir com.ms.ui.AwtUIStatus.getBase
No se pudo convertir com.ms.ui.AwtUITabList
No se pudo convertir com.ms.ui.AwtUITabList.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUITabList.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUITabList.add(String)
No se pudo convertir com.ms.ui.AwtUITabViewer.add(String, Component)
No se pudo convertir com.ms.ui.AwtUITabViewer.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUITabViewer.addTab
No se pudo convertir com.ms.ui.AwtUITree
No se pudo convertir com.ms.ui.AwtUITree.add(Component)
No se pudo convertir com.ms.ui.AwtUITree.add(Component, int)
No se pudo convertir com.ms.ui.AwtUITree.add(Image, String, int)
No se pudo convertir com.ms.ui.AwtUITree.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUITree.add(IUIComponent, int)
No se pudo convertir com.ms.ui.AwtUITree.add(String, int)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUITree.addSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedItem(IUIComponent)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedItem(IUIComponent, boolean)
No se pudo convertir com.ms.ui.AwtUITree.addSelectedItems(IUIComponent[])
No se pudo convertir com.ms.ui.AwtUITree.addSelectedItems(IUIComponent[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.getExpander
No se pudo convertir com.ms.ui.AwtUITree.getSelectedIndex
No se pudo convertir com.ms.ui.AwtUITree.getSelectedIndices
No se pudo convertir com.ms.ui.AwtUITree.getSelectedItems
No se pudo convertir com.ms.ui.AwtUITree.getSelectedObjects
No se pudo convertir com.ms.ui.AwtUITree.getSelectionMode
No se pudo convertir com.ms.ui.AwtUITree.remove
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedItem(IUIComponent)
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedItem(IUIComponent, boolean)
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedItems(IUIComponent[])
No se pudo convertir com.ms.ui.AwtUITree.removeSelectedItems(IUIComponent[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.setSelectedIndex(int)
No se pudo convertir com.ms.ui.AwtUITree.setSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.AwtUITree.setSelectedIndices(int[])
No se pudo convertir com.ms.ui.AwtUITree.setSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.setSelectedItem
No se pudo convertir com.ms.ui.AwtUITree.setSelectedItems(IUIComponent[])
No se pudo convertir com.ms.ui.AwtUITree.setSelectedItems(IUIComponent[], boolean)
No se pudo convertir com.ms.ui.AwtUITree.setSelectionMode
No se pudo convertir com.ms.ui.AwtUIWindow.add(IUIComponent)
No se pudo convertir com.ms.ui.AwtUIWindow.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.AwtUIWindow.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.AwtUIWindow.add(String, IUIComponent)
No se pudo convertir com.ms.ui.AwtUIWindow.AwtUIWindow
No se pudo convertir com.ms.ui.AwtUIWindow.requestFocus
No se pudo convertir com.ms.ui.AwtUIWindow.setLayout
No se pudo convertir com.ms.ui.ButtonFlowLayout
No se pudo convertir com.ms.ui.ButtonFlowLayout.ButtonFlowLayout
No se pudo convertir com.ms.ui.ButtonFlowLayout.computeUnitDimension
No se pudo convertir com.ms.ui.ButtonFlowLayout.getHeightPad
No se pudo convertir com.ms.ui.ButtonFlowLayout.getMinHeight
No se pudo convertir com.ms.ui.ButtonFlowLayout.getMinWidth
No se pudo convertir com.ms.ui.ButtonFlowLayout.getWidthPad
No se pudo convertir com.ms.ui.ButtonFlowLayout.setHeightPad
No se pudo convertir com.ms.ui.ButtonFlowLayout.setMinHeight
No se pudo convertir com.ms.ui.ButtonFlowLayout.setMinWidth
No se pudo convertir com.ms.ui.ButtonFlowLayout.setWidthPad
No se pudo convertir com.ms.ui.ButtonPanel.ButtonPanel
No se pudo convertir com.ms.ui.ButtonPanel.getDefaultButton
No se pudo convertir com.ms.ui.event.UIActionEvent.<TipoEvento>
No se pudo convertir com.ms.ui.event.UIActionEvent.getActionCommand
No se pudo convertir com.ms.ui.event.UIAdjustmentEvent.<TipoEvento>
No se pudo convertir com.ms.ui.event.UIBaseEvent.getID
No se pudo convertir com.ms.ui.event.UIContainerEvent.<TipoEvento>
No se pudo convertir com.ms.ui.event.UIEvent
No se pudo convertir com.ms.ui.event.UIFocusEvent.<TipoEvento>
No se pudo convertir com.ms.ui.event.UIFocusEvent.getArg
No se pudo convertir com.ms.ui.event.UIFocusEvent.isTemporary
No se pudo convertir com.ms.ui.event.UIInputEvent
No se pudo convertir com.ms.ui.event.UIItemEvent.<EventType>
No se pudo convertir com.ms.ui.event.UIItemEvent.getItem
No se pudo convertir com.ms.ui.event.UIItemEvent.getStateChange
No se pudo convertir com.ms.ui.event.UIKeyEvent.CHAR_UNDEFINED
No se pudo convertir com.ms.ui.event.UIKeyEvent.getKeyChar
No se pudo convertir com.ms.ui.event.UIKeyEvent.getKeyCode
No se pudo convertir com.ms.ui.event.UIKeyEvent.getOldEventKey
No se pudo convertir com.ms.ui.event.UIKeyEvent.KEY_EVENT_BASE
No se pudo convertir com.ms.ui.event.UIKeyEvent.KEY_PRESSED
No se pudo convertir com.ms.ui.event.UIKeyEvent.KEY_RELEASED
No se pudo convertir com.ms.ui.event.UIKeyEvent.KEY_TYPED
No se pudo convertir com.ms.ui.event.UIKeyEvent.VK_BACK_QUOTE
No se pudo convertir com.ms.ui.event.UIKeyEvent.VK_EQUALS
No se pudo convertir com.ms.ui.event.UIKeyEvent.VK_META
No se pudo convertir com.ms.ui.event.UIKeyEvent.VK_UNDEFINED
No se pudo convertir com.ms.ui.event.UIMouseEvent.<TipoEvento>
No se pudo convertir com.ms.ui.event.UIMouseEvent.getClickCount
No se pudo convertir com.ms.ui.event.UIMouseEvent.getPoint
No se pudo convertir com.ms.ui.event.UIMouseEvent.getX
No se pudo convertir com.ms.ui.event.UIMouseEvent.getY
No se pudo convertir com.ms.ui.event.UIMouseEvent.isPopupTrigger
No se pudo convertir com.ms.ui.event.UINotifyEvent
No se pudo convertir com.ms.ui.event.UITextEvent.<EventType>
No se pudo convertir com.ms.ui.event.UIWindowEvent.<TipoEvento>
No se pudo convertir com.ms.ui.IAwtUIAdjustable
No se pudo convertir com.ms.ui.IAwtUIItemSelectable
No se pudo convertir com.ms.ui.IUIAccessible
No se pudo convertir com.ms.ui.IUIAccessible.<CódigoError>
No se pudo convertir com.ms.ui.IUIAccessible.getBounds
No se pudo convertir com.ms.ui.IUIAccessible.navigate
No se pudo convertir com.ms.ui.IUIBand
No se pudo convertir com.ms.ui.IUIComponent.action
No se pudo convertir com.ms.ui.IUIComponent.adjustLayoutSize
No se pudo convertir com.ms.ui.IUIComponent.deliverEvent
No se pudo convertir com.ms.ui.IUIComponent.ensureVisible
No se pudo convertir com.ms.ui.IUIComponent.getBounds
No se pudo convertir com.ms.ui.IUIComponent.getCachedPreferredSize
No se pudo convertir com.ms.ui.IUIComponent.getID
No se pudo convertir com.ms.ui.IUIComponent.getLocation
No se pudo convertir com.ms.ui.IUIComponent.getMaximumSize
No se pudo convertir com.ms.ui.IUIComponent.getMinimumSize
No se pudo convertir com.ms.ui.IUIComponent.getPreferredSize
No se pudo convertir com.ms.ui.IUIComponent.getToolkit
No se pudo convertir com.ms.ui.IUIComponent.isChecked
No se pudo convertir com.ms.ui.IUIComponent.isHeightRelative
No se pudo convertir com.ms.ui.IUIComponent.isHot
No se pudo convertir com.ms.ui.IUIComponent.isIndeterminate
No se pudo convertir com.ms.ui.IUIComponent.isInvalidating
No se pudo convertir com.ms.ui.IUIComponent.isKeyable
No se pudo convertir com.ms.ui.IUIComponent.isKeyable(boolean)
No se pudo convertir com.ms.ui.IUIComponent.isPressed
No se pudo convertir com.ms.ui.IUIComponent.isRedrawing
No se pudo convertir com.ms.ui.IUIComponent.isSelected
No se pudo convertir com.ms.ui.IUIComponent.isValid
No se pudo convertir com.ms.ui.IUIComponent.isWidthRelative
No se pudo convertir com.ms.ui.IUIComponent.keyDown
No se pudo convertir com.ms.ui.IUIComponent.keyUp
No se pudo convertir com.ms.ui.IUIComponent.lostFocus
No se pudo convertir com.ms.ui.IUIComponent.mouseClicked
No se pudo convertir com.ms.ui.IUIComponent.mouseDown
No se pudo convertir com.ms.ui.IUIComponent.mouseEnter
No se pudo convertir com.ms.ui.IUIComponent.mouseExit
No se pudo convertir com.ms.ui.IUIComponent.mouseMove
No se pudo convertir com.ms.ui.IUIComponent.mouseUp
No se pudo convertir com.ms.ui.IUIComponent.paint
No se pudo convertir com.ms.ui.IUIComponent.paintAll
No se pudo convertir com.ms.ui.IUIComponent.prepareImage
No se pudo convertir com.ms.ui.IUIComponent.print
No se pudo convertir com.ms.ui.IUIComponent.printAll
No se pudo convertir com.ms.ui.IUIComponent.recalcPreferredSize
No se pudo convertir com.ms.ui.IUIComponent.setBounds
No se pudo convertir com.ms.ui.IUIComponent.setChecked
No se pudo convertir com.ms.ui.IUIComponent.setFlags
No se pudo convertir com.ms.ui.IUIComponent.setHot
No se pudo convertir com.ms.ui.IUIComponent.setID
No se pudo convertir com.ms.ui.IUIComponent.setIndeterminate
No se pudo convertir com.ms.ui.IUIComponent.setInvalidating
No se pudo convertir com.ms.ui.IUIComponent.setLocation(int, int)
No se pudo convertir com.ms.ui.IUIComponent.setLocation(Point)
No se pudo convertir com.ms.ui.IUIComponent.setPressed
No se pudo convertir com.ms.ui.IUIComponent.setRedrawing
No se pudo convertir com.ms.ui.IUIComponent.setSelected
No se pudo convertir com.ms.ui.IUIComponent.setValid
No se pudo convertir com.ms.ui.IUIComponent.setVisible
No se pudo convertir com.ms.ui.IUIComponent.validate
No se pudo convertir com.ms.ui.IUIContainer.add(IUIComponent)
No se pudo convertir com.ms.ui.IUIContainer.add(IUIComponent, int)
No se pudo convertir com.ms.ui.IUIContainer.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.IUIContainer.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.IUIContainer.add(String, IUIComponent)
No se pudo convertir com.ms.ui.IUIContainer.adjustLayoutSize
No se pudo convertir com.ms.ui.IUIContainer.continueInvalidate
No se pudo convertir com.ms.ui.IUIContainer.ensureVisible
No se pudo convertir com.ms.ui.IUIContainer.getChildBounds
No se pudo convertir com.ms.ui.IUIContainer.getChildLocation
No se pudo convertir com.ms.ui.IUIContainer.getChildSize
No se pudo convertir com.ms.ui.IUIContainer.getComponentFromID
No se pudo convertir com.ms.ui.IUIContainer.getEdge
No se pudo convertir com.ms.ui.IUIContainer.getLayout
No se pudo convertir com.ms.ui.IUIContainer.isOverlapping
No se pudo convertir com.ms.ui.IUIContainer.navigate
No se pudo convertir com.ms.ui.IUIContainer.paintComponents
No se pudo convertir com.ms.ui.IUIContainer.passFocus
No se pudo convertir com.ms.ui.IUIContainer.replace
No se pudo convertir com.ms.ui.IUIContainer.setChildBounds
No se pudo convertir com.ms.ui.IUIContainer.setChildLocation
No se pudo convertir com.ms.ui.IUIContainer.setChildSize
No se pudo convertir com.ms.ui.IUIContainer.setEdge
No se pudo convertir com.ms.ui.IUIContainer.setHeader
No se pudo convertir com.ms.ui.IUIContainer.setLayout
No se pudo convertir com.ms.ui.IUILayoutManager
No se pudo convertir com.ms.ui.IUIMenuLauncher
No se pudo convertir com.ms.ui.IUIPosition
No se pudo convertir com.ms.ui.IUIPropertyPage
No se pudo convertir com.ms.ui.IUIRootContainer.componentMoved
No se pudo convertir com.ms.ui.IUIRootContainer.endMenu
No se pudo convertir com.ms.ui.IUIRootContainer.endTooltip
No se pudo convertir com.ms.ui.IUIRootContainer.getFocus
No se pudo convertir com.ms.ui.IUIRootContainer.getLaunchedMenu
No se pudo convertir com.ms.ui.IUIRootContainer.launchMenu
No se pudo convertir com.ms.ui.IUIRootContainer.launchTooltip
No se pudo convertir com.ms.ui.IUIRootContainer.needsValidating
No se pudo convertir com.ms.ui.IUIRootContainer.setFocus
No se pudo convertir com.ms.ui.IUIScroll
No se pudo convertir com.ms.ui.IUISelector
No se pudo convertir com.ms.ui.IUISpinnerBuddy
No se pudo convertir com.ms.ui.IUITree
No se pudo convertir com.ms.ui.IUIWizardStep
No se pudo convertir com.ms.ui.IWinEvent
No se pudo convertir com.ms.ui.resource.DataBoundInputStream
No se pudo convertir com.ms.ui.resource.ResourceDecoder
No se pudo convertir com.ms.ui.resource.ResourceFormattingException
No se pudo convertir com.ms.ui.resource.ResourceTypeListener
No se pudo convertir com.ms.ui.resource.UIDialogLayout
No se pudo convertir com.ms.ui.resource.Win32ResourceDecoder
No se pudo convertir com.ms.ui.UIApplet.destroy
No se pudo convertir com.ms.ui.UIApplet.getAppletContext
No se pudo convertir com.ms.ui.UIApplet.getAudioClip(URL)
No se pudo convertir com.ms.ui.UIApplet.getAudioClip(URL, String)
No se pudo convertir com.ms.ui.UIApplet.getDocumentBase
No se pudo convertir com.ms.ui.UIApplet.isActive
No se pudo convertir com.ms.ui.UIApplet.play(URL)
No se pudo convertir com.ms.ui.UIApplet.play(URL, String)
No se pudo convertir com.ms.ui.UIApplet.setStub
No se pudo convertir com.ms.ui.UIApplet.showStatus
No se pudo convertir com.ms.ui.UIAwtHost.forwardEvents
No se pudo convertir com.ms.ui.UIAwtHost.getCachedPreferredSize
No se pudo convertir com.ms.ui.UIAwtHost.getMinimumSize
No se pudo convertir com.ms.ui.UIAwtHost.getPreferredSize
No se pudo convertir com.ms.ui.UIAwtHost.notifyEvent
No se pudo convertir com.ms.ui.UIAwtHost.setFocused
No se pudo convertir com.ms.ui.UIAwtHost.setValid
No se pudo convertir com.ms.ui.UIBand
No se pudo convertir com.ms.ui.UIBandBox
No se pudo convertir com.ms.ui.UIBandThumb
No se pudo convertir com.ms.ui.UIBarLayout
No se pudo convertir com.ms.ui.UIBorderLayout
No se pudo convertir com.ms.ui.UIButton.doDefaultAction
No se pudo convertir com.ms.ui.UIButton.getStyle
No se pudo convertir com.ms.ui.UIButton.keyDown
No se pudo convertir com.ms.ui.UIButton.keyUp
No se pudo convertir com.ms.ui.UIButton.mouseClicked
No se pudo convertir com.ms.ui.UIButton.setHot
No se pudo convertir com.ms.ui.UIButton.setStyle
No se pudo convertir com.ms.ui.UIButtonBar
No se pudo convertir com.ms.ui.UIButtonBar.<TipoBarraBotones>
No se pudo convertir com.ms.ui.UIButtonBar.add
No se pudo convertir com.ms.ui.UIButtonBar.addTo
No se pudo convertir com.ms.ui.UIButtonBar.UIButtonBar
No se pudo convertir com.ms.ui.UICanvas.getID
No se pudo convertir com.ms.ui.UICanvas.setID
No se pudo convertir com.ms.ui.UICardLayout
No se pudo convertir com.ms.ui.UICheckButton.getCheckImageSize
No se pudo convertir com.ms.ui.UICheckButton.getConvertedEvent
No se pudo convertir com.ms.ui.UICheckButton.getMinimumSize
No se pudo convertir com.ms.ui.UICheckButton.getPreferredSize
No se pudo convertir com.ms.ui.UICheckButton.paint
No se pudo convertir com.ms.ui.UICheckButton.setCheckImageSize
No se pudo convertir com.ms.ui.UICheckButton.setHot
No se pudo convertir com.ms.ui.UICheckButton.setID
No se pudo convertir com.ms.ui.UICheckButton.setPressed
No se pudo convertir com.ms.ui.UICheckButton.setSelected
No se pudo convertir com.ms.ui.UICheckGroup.add(IUIComponent)
$No se pudo convertir com.ms.ui.UICheckGroup.add(IUIComponent, int)
No se pudo convertir com.ms.ui.UICheckGroup.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.UICheckGroup.add(String, Object, int)
No se pudo convertir com.ms.ui.UICheckGroup.setHeader
No se pudo convertir com.ms.ui.UICheckGroup.UICheckGroup
No se pudo convertir com.ms.ui.UIChoice.add
No se pudo convertir com.ms.ui.UIChoice.addSelectedIndex(int)
No se pudo convertir com.ms.ui.UIChoice.addSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.UIChoice.addSelectedIndices
No se pudo convertir com.ms.ui.UIChoice.addSelectedItem
No se pudo convertir com.ms.ui.UIChoice.addSelectedItems
No se pudo convertir com.ms.ui.UIChoice.adjustPopupListSize
No se pudo convertir com.ms.ui.UIChoice.getAnchorItem
No se pudo convertir com.ms.ui.UIChoice.getConvertedEvent
No se pudo convertir com.ms.ui.UIChoice.getExtensionItem
No se pudo convertir com.ms.ui.UIChoice.getMenu
No se pudo convertir com.ms.ui.UIChoice.getPopupListMaxStringCount
No se pudo convertir com.ms.ui.UIChoice.getPreferredSize
No se pudo convertir com.ms.ui.UIChoice.getSelectedIndices
No se pudo convertir com.ms.ui.UIChoice.getSelectedItem
No se pudo convertir com.ms.ui.UIChoice.getSelectedItems
No se pudo convertir com.ms.ui.UIChoice.getSelectionMode
No se pudo convertir com.ms.ui.UIChoice.getStyle
No se pudo convertir com.ms.ui.UIChoice.keyDown
No se pudo convertir com.ms.ui.UIChoice.mouseDown
No se pudo convertir com.ms.ui.UIChoice.remove
No se pudo convertir com.ms.ui.UIChoice.removeSelectedIndex
No se pudo convertir com.ms.ui.UIChoice.removeSelectedIndices
No se pudo convertir com.ms.ui.UIChoice.removeSelectedItem
No se pudo convertir com.ms.ui.UIChoice.removeSelectedItems
No se pudo convertir com.ms.ui.UIChoice.setAnchorItem
No se pudo convertir com.ms.ui.UIChoice.setExtensionItem
No se pudo convertir com.ms.ui.UIChoice.setPopupListMaxStringCount
No se pudo convertir com.ms.ui.UIChoice.setSelectedIndex(int)
No se pudo convertir com.ms.ui.UIChoice.setSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.UIChoice.setSelectedIndices(int[])
No se pudo convertir com.ms.ui.UIChoice.setSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.UIChoice.setSelectedItem
No se pudo convertir com.ms.ui.UIChoice.setSelectionMode
No se pudo convertir com.ms.ui.UIChoice.setStyle
No se pudo convertir com.ms.ui.UIChoice.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIChoice.THICK
No se pudo convertir com.ms.ui.UIColorDialog.UIColorDialog
No se pudo convertir com.ms.ui.UIColumnHeader.isMoving
No se pudo convertir com.ms.ui.UIColumnHeader.isSizing
No se pudo convertir com.ms.ui.UIColumnHeader.isSizingLeft
No se pudo convertir com.ms.ui.UIColumnHeader.isSizingRight
No se pudo convertir com.ms.ui.UIColumnHeader.mouseDown
No se pudo convertir com.ms.ui.UIColumnViewer
No se pudo convertir com.ms.ui.UIComponent.action
No se pudo convertir com.ms.ui.UIComponent.adjustLayoutSize
No se pudo convertir com.ms.ui.UIComponent.clone
No se pudo convertir com.ms.ui.UIComponent.contains
No se pudo convertir com.ms.ui.UIComponent.deliverEvent
No se pudo convertir com.ms.ui.UIComponent.doDefaultAction
No se pudo convertir com.ms.ui.UIComponent.doLayout
No se pudo convertir com.ms.ui.UIComponent.ensureVisible
No se pudo convertir com.ms.ui.UIComponent.getBounds
No se pudo convertir com.ms.ui.UIComponent.getCachedPreferredSize
No se pudo convertir com.ms.ui.UIComponent.getComponentAt
No se pudo convertir com.ms.ui.UIComponent.getDefaultAction
No se pudo convertir com.ms.ui.UIComponent.getDescription
No se pudo convertir com.ms.ui.UIComponent.getGraphics
No se pudo convertir com.ms.ui.UIComponent.getHelp
No se pudo convertir com.ms.ui.UIComponent.getKeyboardShortcut
No se pudo convertir com.ms.ui.UIComponent.getLocation
No se pudo convertir com.ms.ui.UIComponent.getLocationOnScreen
No se pudo convertir com.ms.ui.UIComponent.getMaximumSize
No se pudo convertir com.ms.ui.UIComponent.getMinimumSize
No se pudo convertir com.ms.ui.UIComponent.getPreferredSize
No se pudo convertir com.ms.ui.UIComponent.getRoleCode
No se pudo convertir com.ms.ui.UIComponent.getRoot
No se pudo convertir com.ms.ui.UIComponent.getSize
No se pudo convertir com.ms.ui.UIComponent.getStateCode
No se pudo convertir com.ms.ui.UIComponent.getToolkit
No se pudo convertir com.ms.ui.UIComponent.getTreeLock
No se pudo convertir com.ms.ui.UIComponent.getValueText
No se pudo convertir com.ms.ui.UIComponent.imageUpdate
No se pudo convertir com.ms.ui.UIComponent.invalidate
No se pudo convertir com.ms.ui.UIComponent.isChecked
No se pudo convertir com.ms.ui.UIComponent.isEnabled
No se pudo convertir com.ms.ui.UIComponent.isHeightRelative
No se pudo convertir com.ms.ui.UIComponent.isHot
No se pudo convertir com.ms.ui.UIComponent.isIndeterminate
No se pudo convertir com.ms.ui.UIComponent.isInvalidating
No se pudo convertir com.ms.ui.UIComponent.isKeyable
No se pudo convertir com.ms.ui.UIComponent.isKeyable(boolean)
No se pudo convertir com.ms.ui.UIComponent.isPressed
No se pudo convertir com.ms.ui.UIComponent.isRedrawing
No se pudo convertir com.ms.ui.UIComponent.isSelectable
No se pudo convertir com.ms.ui.UIComponent.isShowing
No se pudo convertir com.ms.ui.UIComponent.isValid
No se pudo convertir com.ms.ui.UIComponent.isVisible
No se pudo convertir com.ms.ui.UIComponent.isWidthRelative
No se pudo convertir com.ms.ui.UIComponent.keyDown
No se pudo convertir com.ms.ui.UIComponent.keyUp
No se pudo convertir com.ms.ui.UIComponent.lostFocus
No se pudo convertir com.ms.ui.UIComponent.mouseClicked
No se pudo convertir com.ms.ui.UIComponent.mouseDown
No se pudo convertir com.ms.ui.UIComponent.mouseDrag
No se pudo convertir com.ms.ui.UIComponent.mouseEnter
No se pudo convertir com.ms.ui.UIComponent.mouseExit
No se pudo convertir com.ms.ui.UIComponent.mouseMove
No se pudo convertir com.ms.ui.UIComponent.mouseUp
No se pudo convertir com.ms.ui.UIComponent.navigate
No se pudo convertir com.ms.ui.UIComponent.notifyEvent
No se pudo convertir com.ms.ui.UIComponent.paint
No se pudo convertir com.ms.ui.UIComponent.paintAll
No se pudo convertir com.ms.ui.UIComponent.prepareImage(Image, ImageObserver)
No se pudo convertir com.ms.ui.UIComponent.prepareImage(int, int, ImageObserver)
No se pudo convertir com.ms.ui.UIComponent.print
No se pudo convertir com.ms.ui.UIComponent.printAll
No se pudo convertir com.ms.ui.UIComponent.recalcPreferredSize
No se pudo convertir com.ms.ui.UIComponent.requestFocus
No se pudo convertir com.ms.ui.UIComponent.repaint
No se pudo convertir com.ms.ui.UIComponent.requestFocus
No se pudo convertir com.ms.ui.UIComponent.setBounds
No se pudo convertir com.ms.ui.UIComponent.setChecked
No se pudo convertir com.ms.ui.UIComponent.setFlags
No se pudo convertir com.ms.ui.UIComponent.setHot
No se pudo convertir com.ms.ui.UIComponent.setID
No se pudo convertir com.ms.ui.UIComponent.setIndeterminate
No se pudo convertir com.ms.ui.UIComponent.setInvalidating
No se pudo convertir com.ms.ui.UIComponent.setLocation(int, int)
No se pudo convertir com.ms.ui.UIComponent.setLocation(Point)
No se pudo convertir com.ms.ui.UIComponent.setPressed
No se pudo convertir com.ms.ui.UIComponent.setRedrawing
No se pudo convertir com.ms.ui.UIComponent.setSelected
No se pudo convertir com.ms.ui.UIComponent.setSize
No se pudo convertir com.ms.ui.UIComponent.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIComponent.setValid
No se pudo convertir com.ms.ui.UIComponent.setValueText
No se pudo convertir com.ms.ui.UIComponent.setVisible
No se pudo convertir com.ms.ui.UIComponent.validate
No se pudo convertir com.ms.ui.UIContainer.add(IUIComponent)
No se pudo convertir com.ms.ui.UIContainer.add(IUIComponent, int)
No se pudo convertir com.ms.ui.UIContainer.add(IUIComponent, Object)
No se pudo convertir com.ms.ui.UIContainer.add(IUIComponent, Object, int)
No se pudo convertir com.ms.ui.UIContainer.add(String, IUIComponent)
No se pudo convertir com.ms.ui.UIContainer.adjustLayoutSize
No se pudo convertir com.ms.ui.UIContainer.continueInvalidate
No se pudo convertir com.ms.ui.UIContainer.ensureVisible
No se pudo convertir com.ms.ui.UIContainer.getChildBounds
No se pudo convertir com.ms.ui.UIContainer.getChildIndex
No se pudo convertir com.ms.ui.UIContainer.getChildLocation
No se pudo convertir com.ms.ui.UIContainer.getChildSize
No se pudo convertir com.ms.ui.UIContainer.getClientRect
No se pudo convertir com.ms.ui.UIContainer.getComponent
No se pudo convertir com.ms.ui.UIContainer.getComponentFromID
No se pudo convertir com.ms.ui.UIContainer.getComponentIndex
No se pudo convertir com.ms.ui.UIContainer.getComponents
No se pudo convertir com.ms.ui.UIContainer.getEdge
No se pudo convertir com.ms.ui.UIContainer.getFocusComponent
No se pudo convertir com.ms.ui.UIContainer.getID
No se pudo convertir com.ms.ui.UIContainer.getInsets
No se pudo convertir com.ms.ui.UIContainer.getLayout
No se pudo convertir com.ms.ui.UIContainer.getMinimumSize
No se pudo convertir com.ms.ui.UIContainer.getName
No se pudo convertir com.ms.ui.UIContainer.getPreferredSize
No se pudo convertir com.ms.ui.UIContainer.gotFocus
No se pudo convertir com.ms.ui.UIContainer.invalidateAll
No se pudo convertir com.ms.ui.UIContainer.isHeightRelative
No se pudo convertir com.ms.ui.UIContainer.isOverlapping
No se pudo convertir com.ms.ui.UIContainer.isWidthRelative
No se pudo convertir com.ms.ui.UIContainer.keyDown
No se pudo convertir com.ms.ui.UIContainer.lostFocus
No se pudo convertir com.ms.ui.UIContainer.mouseEnter
No se pudo convertir com.ms.ui.UIContainer.mouseExit
No se pudo convertir com.ms.ui.UIContainer.move(int, int)
No se pudo convertir com.ms.ui.UIContainer.move(IUIComponent, IUIComponent)
No se pudo convertir com.ms.ui.UIContainer.navigate
No se pudo convertir com.ms.ui.UIContainer.notifyEvent
No se pudo convertir com.ms.ui.UIContainer.paint
No se pudo convertir com.ms.ui.UIContainer.paintAll
No se pudo convertir com.ms.ui.UIContainer.paintComponents
No se pudo convertir com.ms.ui.UIContainer.passFocus
No se pudo convertir com.ms.ui.UIContainer.printAll
No se pudo convertir com.ms.ui.UIContainer.remove
No se pudo convertir com.ms.ui.UIContainer.removeAll
No se pudo convertir com.ms.ui.UIContainer.removeAllChildren
No se pudo convertir com.ms.ui.UIContainer.replace
No se pudo convertir com.ms.ui.UIContainer.setChildBounds
No se pudo convertir com.ms.ui.UIContainer.setChildLocation
No se pudo convertir com.ms.ui.UIContainer.setChildSize
No se pudo convertir com.ms.ui.UIContainer.setComponent
No se pudo convertir com.ms.ui.UIContainer.setEdge
No se pudo convertir com.ms.ui.UIContainer.setID
No se pudo convertir com.ms.ui.UIContainer.setLayout
No se pudo convertir com.ms.ui.UIContainer.setLocation
No se pudo convertir com.ms.ui.UIContainer.setSize
No se pudo convertircom.ms.ui.UIContextMenu.action
No se pudo convertir com.ms.ui.UIContextMenu.ended
No se pudo convertir com.ms.ui.UIContextMenu.getPlacement
No se pudo convertir com.ms.ui.UIContextMenu.getRoot
No se pudo convertir com.ms.ui.UIContextMenu.getUserItem
No se pudo convertir com.ms.ui.UIContextMenu.UIContextMenu
No se pudo convertir com.ms.ui.UIDialog.adjustLayoutSize
No se pudo convertir com.ms.ui.UIDialog.isAutoPack
No se pudo convertir com.ms.ui.UIDialog.keyDown
No se pudo convertir com.ms.ui.UIDialog.keyUp
No se pudo convertir com.ms.ui.UIDialog.position
No se pudo convertir com.ms.ui.UIDialog.setAutoPack
No se pudo convertir com.ms.ui.UIDialog.setModal
No se pudo convertir com.ms.ui.UIDialog.UIDialog(UIFrame, boolean)
No se pudo convertir com.ms.ui.UIDialog.UIDialog(UIFrame, String, boolean)
No se pudo convertir com.ms.ui.UIDialogMapping
No se pudo convertir com.ms.ui.UIDragDrop
No se pudo convertir com.ms.ui.UIDrawText.ensureNotDirty
No se pudo convertir com.ms.ui.UIDrawText.ensureVisible(Point)
No se pudo convertir com.ms.ui.UIDrawText.ensureVisible(Rectangle)
No se pudo convertir com.ms.ui.UIDrawText.eoln
No se pudo convertir com.ms.ui.UIDrawText.getCachedGraphics
No se pudo convertir com.ms.ui.UIDrawText.getCaretWidth
No se pudo convertir com.ms.ui.UIDrawText.getCharFromScreen(int, int)
No se pudo convertir com.ms.ui.UIDrawText.getCharFromScreen(Point)
No se pudo convertir com.ms.ui.UIDrawText.getCharLocation
No se pudo convertir com.ms.ui.UIDrawText.getMinimumSize
No se pudo convertir com.ms.ui.UIDrawText.getOutline
No se pudo convertir com.ms.ui.UIDrawText.getPreferredSize
No se pudo convertir com.ms.ui.UIDrawText.getStartPoint
No se pudo convertir com.ms.ui.UIDrawText.getVertAlign
No se pudo convertir com.ms.ui.UIDrawText.getWordEdge
No se pudo convertir com.ms.ui.UIDrawText.gotFocus
No se pudo convertir com.ms.ui.UIDrawText.hideCaret
No se pudo convertir com.ms.ui.UIDrawText.isAutoResizable
No se pudo convertir com.ms.ui.UIDrawText.keyDown
No se pudo convertir com.ms.ui.UIDrawText.lostFocus
No se pudo convertir com.ms.ui.UIDrawText.mouseDown
No se pudo convertir com.ms.ui.UIDrawText.mouseDrag
No se pudo convertir com.ms.ui.UIDrawText.paint(FxGraphics)
No se pudo convertir com.ms.ui.UIDrawText.paint(FxGraphics, int, int, boolean)
No se pudo convertir com.ms.ui.UIDrawText.setAutoResizable
No se pudo convertir com.ms.ui.UIDrawText.setCaretWidth
No se pudo convertir com.ms.ui.UIDrawText.setCurrIndex
No se pudo convertir com.ms.ui.UIDrawText.setHorizAlign
No se pudo convertir com.ms.ui.UIDrawText.setInputMethod
No se pudo convertir com.ms.ui.UIDrawText.setOutline
No se pudo convertir com.ms.ui.UIDrawText.setRefresh
No se pudo convertir com.ms.ui.UIDrawText.setTabs
No se pudo convertir com.ms.ui.UIDrawText.setTextCallback
No se pudo convertir com.ms.ui.UIDrawText.setUnderlined
No se pudo convertir com.ms.ui.UIDrawText.setVertAlign
No se pudo convertir com.ms.ui.UIDrawText.setWordWrap
No se pudo convertir com.ms.ui.UIDrawText.showCaret
No se pudo convertir com.ms.ui.UIEdit.allowUndo
No se pudo convertir com.ms.ui.UIEdit.append(char, boolean)
No se pudo convertir com.ms.ui.UIEdit.append(char[], boolean)
No se pudo convertir com.ms.ui.UIEdit.append(String, boolean)
No se pudo convertir com.ms.ui.UIEdit.clear
No se pudo convertir com.ms.ui.UIEdit.EXCLUDE
No se pudo convertir com.ms.ui.UIEdit.getConvertedEvent
No se pudo convertir com.ms.ui.UIEdit.getMaskChars
No se pudo convertir com.ms.ui.UIEdit.getMaskMode
No se pudo convertir com.ms.ui.UIEdit.INCLUDE
No se pudo convertir com.ms.ui.UIEdit.insert(char, int, boolean)
No se pudo convertir com.ms.ui.UIEdit.insert(char[], int, boolean)
No se pudo convertir com.ms.ui.UIEdit.insert(String, int, boolean)
No se pudo convertir com.ms.ui.UIEdit.isRedoable
No se pudo convertir com.ms.ui.UIEdit.isUndoable
No se pudo convertir com.ms.ui.UIEdit.isUndoAllowed
No se pudo convertir com.ms.ui.UIEdit.keyDown
No se pudo convertir com.ms.ui.UIEdit.READONLY
No se pudo convertir com.ms.ui.UIEdit.redo
No se pudo convertir com.ms.ui.UIEdit.redo(boolean)
No se pudo convertir com.ms.ui.UIEdit.remove
No se pudo convertir com.ms.ui.UIEdit.setMaskChars
No se pudo convertir com.ms.ui.UIEdit.setMaskMode
No se pudo convertir com.ms.ui.UIEditChoice.action
No se pudo convertir com.ms.ui.UIEditChoice.getEditComponent
No se pudo convertir com.ms.ui.UIEditChoice.keyDown
No se pudo convertir com.ms.ui.UIEditChoice.lostFocus
No se pudo convertir com.ms.ui.UIExpandButton
No se pudo convertir com.ms.ui.UIFindReplaceDialog
No se pudo convertir com.ms.ui.UIFixedFlowLayout
No se pudo convertir com.ms.ui.UIFixedFlowLayout.computeUnitDimension
No se pudo convertir com.ms.ui.UIFixedFlowLayout.getAlignment
No se pudo convertir com.ms.ui.UIFixedFlowLayout.getMinimumSize
No se pudo convertir com.ms.ui.UIFixedFlowLayout.getPreferredSize
No se pudo convertir com.ms.ui.UIFixedFlowLayout.isOverlapping
No se pudo convertir com.ms.ui.UIFixedFlowLayout.isWidthRelative
No se pudo convertir com.ms.ui.UIFixedFlowLayout.layout
No se pudo convertir com.ms.ui.UIFixedFlowLayout.navigate
No se pudo convertir com.ms.ui.UIFixedFlowLayout.setAlignment
No se pudo convertir com.ms.ui.UIFixedFlowLayout.UIFixedFlowLayout
No se pudo convertir com.ms.ui.UIFixedFlowLayout.UIFixedFlowLayout(int, int)
No se pudo convertir com.ms.ui.UIFixedFlowLayout.UIFixedFlowLayout(int, int, int)
No se pudo convertir com.ms.ui.UIFlowLayout
No se pudo convertir com.ms.ui.UIFlowLayout.getAlignment
No se pudo convertir com.ms.ui.UIFlowLayout.getMinimumSize
No se pudo convertir com.ms.ui.UIFlowLayout.getPreferredSize
No se pudo convertir com.ms.ui.UIFlowLayout.isOverlapping
No se pudo convertir com.ms.ui.UIFlowLayout.isWidthRelative
No se pudo convertir com.ms.ui.UIFlowLayout.layout
No se pudo convertir com.ms.ui.UIFlowLayout.navigate
No se pudo convertir com.ms.ui.UIFlowLayout.setAlignment
No se pudo convertir com.ms.ui.UIFlowLayout.setWrap
No se pudo convertir com.ms.ui.UIFlowLayout.UIFlowLayout
No se pudo convertir com.ms.ui.UIFlowLayout.UIFlowLayout(int)
No se pudo convertir com.ms.ui.UIFlowLayout.UIFlowLayout(int, int, int)
No se pudo convertir com.ms.ui.UIFontDialog.UIFontDialog(UIFrame)
No se pudo convertir com.ms.ui.UIFontDialog.UIFontDialog(UIFrame, String[])
No se pudo convertir com.ms.ui.UIFrame.setMenuBar
No se pudo convertir com.ms.ui.UIGraphic.getPreferredSize
No se pudo convertir com.ms.ui.UIGraphic.imageUpdate
No se pudo convertir com.ms.ui.UIGraphic.paint
No se pudo convertir com.ms.ui.UIGraphic.UIGraphic
No se pudo convertir com.ms.ui.UIGridBagConstraints
No se pudo convertir com.ms.ui.UIGridBagLayout
No se pudo convertir com.ms.ui.UIGridLayout
No se pudo convertir com.ms.ui.UIGridLayout.continueInvalidate
No se pudo convertir com.ms.ui.UIGridLayout.getMinimumSize
No se pudo convertir com.ms.ui.UIGridLayout.getPreferredSize
No se pudo convertir com.ms.ui.UIGridLayout.isOverlapping
No se pudo convertir com.ms.ui.UIGridLayout.layout
No se pudo convertir com.ms.ui.UIGridLayout.navigate
No se pudo convertir com.ms.ui.UIGridLayout.UIGridLayout(int, int)
No se pudo convertir com.ms.ui.UIGridLayout.UIGridLayout(int, int, int, int)
No se pudo convertir com.ms.ui.UIGroup.adjustLayoutSize
No se pudo convertir com.ms.ui.UIGroup.paint
No se pudo convertir com.ms.ui.UIGroup.UIGroup
No se pudo convertir com.ms.ui.UIHeaderRow.mouseDown
No se pudo convertir com.ms.ui.UIHeaderRow.mouseDrag
No se pudo convertir com.ms.ui.UIHeaderRow.mouseUp
No se pudo convertir com.ms.ui.UIHeaderRow.navigate
No se pudo convertir com.ms.ui.UIItem.<Posición>
No se pudo convertir com.ms.ui.UIItem.getGap
No se pudo convertir com.ms.ui.UIItem.getImagePos
No se pudo convertir com.ms.ui.UIItem.getPreferredSize
No se pudo convertir com.ms.ui.UIItem.imageUpdate
No se pudo convertir com.ms.ui.UIItem.paint
No se pudo convertir com.ms.ui.UIItem.setFocused
No se pudo convertir com.ms.ui.UIItem.setGap
No se pudo convertir com.ms.ui.UIItem.setHot
No se pudo convertir com.ms.ui.UIItem.setImagePos
No se pudo convertir com.ms.ui.UIItem.setSelected
No se pudo convertir com.ms.ui.UIItem.UIItem(Image, String, int)
No se pudo convertir com.ms.ui.UIItem.UIItem(Image, String, int, int)
No se pudo convertir com.ms.ui.UILayoutManager
No se pudo convertir com.ms.ui.UILine.getMinimumSize
No se pudo convertir com.ms.ui.UILine.getPreferredSize
No se pudo convertir com.ms.ui.UILine.paint
No se pudo convertir com.ms.ui.UIList.UIList(int)
No se pudo convertir com.ms.ui.UIList.UIList(int, int)
No se pudo convertir com.ms.ui.UIMarquee
No se pudo convertir com.ms.ui.UIMenuButton.action
No se pudo convertir com.ms.ui.UIMenuButton.ended
No se pudo convertir com.ms.ui.UIMenuButton.getPlacement
No se pudo convertir com.ms.ui.UIMenuButton.keyDown
No se pudo convertir com.ms.ui.UIMenuButton.launch
No se pudo convertir com.ms.ui.UIMenuButton.mouseDown
No se pudo convertir com.ms.ui.UIMenuButton.requestFocus
No se pudo convertir com.ms.ui.UIMenuButton.UIMenuButton(IUIComponent, int, UIMenuList)
No se pudo convertir com.ms.ui.UIMenuButton.UIMenuButton(IUIComponent, UIMenuList)
No se pudo convertir com.ms.ui.UIMenuButton.UIMenuButton(String, int, UIMenuList)
No se pudo convertir com.ms.ui.UIMenuItem.UIMenuItem
No se pudo convertir com.ms.ui.UIMenuItem.action
No se pudo convertir com.ms.ui.UIMenuItem.getInsets
No se pudo convertir com.ms.ui.UIMenuItem.keyDown
No se pudo convertir com.ms.ui.UIMenuItem.paint
No se pudo convertir com.ms.ui.UIMenuItem.UIMenuItem(IUIComponent)
No se pudo convertir com.ms.ui.UIMenuItem.UIMenuItem(IUIComponent, UIMenuList)
No se pudo convertir com.ms.ui.UIMenuLauncher.cancel
No se pudo convertir com.ms.ui.UIMenuLauncher.ended
No se pudo convertir com.ms.ui.UIMenuLauncher.fitToScreen
No se pudo convertir com.ms.ui.UIMenuLauncher.getDisplayer
No se pudo convertir com.ms.ui.UIMenuLauncher.getPlacement
No se pudo convertir com.ms.ui.UIMenuLauncher.isLaunched
No se pudo convertir com.ms.ui.UIMenuLauncher.launch
No se pudo convertir com.ms.ui.UIMenuLauncher.raiseEvent
No se pudo convertir com.ms.ui.UIMenuLauncher.setFocused
No se pudo convertir com.ms.ui.UIMenuLauncher.setHot
No se pudo convertir com.ms.ui.UIMenuLauncher.setSelected
No se pudo convertir com.ms.ui.UIMenuLauncher.UIMenuLauncher(IUIComponent)
No se pudo convertir com.ms.ui.UIMenuLauncher.UIMenuLauncher(IUIComponent, UIMenuList)
No se pudo convertir com.ms.ui.UIMenuLauncher.UIMenuLauncher(UIMenuList)
No se pudo convertir com.ms.ui.UIMenuList
No se pudo convertir com.ms.ui.UIMenuList.action
No se pudo convertir com.ms.ui.UIMenuList.getMenuLauncher
No se pudo convertir com.ms.ui.UIMenuList.gotFocus
No se pudo convertir com.ms.ui.UIMenuList.keyDown
No se pudo convertir com.ms.ui.UIMenuList.lostFocus
No se pudo convertir com.ms.ui.UIMenuList.mouseClicked
No se pudo convertir com.ms.ui.UIMenuList.mouseEnter
No se pudo convertir com.ms.ui.UIMenuList.requestFocus
No se pudo convertir com.ms.ui.UIMenuList.setMenuLauncher
No se pudo convertir com.ms.ui.UIMenuList.UIMenuList
No se pudo convertir com.ms.ui.UIMessageBox
No se pudo convertir com.ms.ui.UIMessageBox.action
No se pudo convertir com.ms.ui.UIMessageBox.doModal
No se pudo convertir com.ms.ui.UIMessageBox.doModalIndex
No se pudo convertir com.ms.ui.UIMessageBox.getButtonAlignment
No se pudo convertir com.ms.ui.UIMessageBox.getButtons
No se pudo convertir com.ms.ui.UIMessageBox.getDefaultButton
No se pudo convertir com.ms.ui.UIMessageBox.getFrame
No se pudo convertir com.ms.ui.UIMessageBox.getImage
No se pudo convertir com.ms.ui.UIMessageBox.getInsets
No se pudo convertir com.ms.ui.UIMessageBox.getPreferredSize
No se pudo convertir com.ms.ui.UIMessageBox.getText
No se pudo convertir com.ms.ui.UIMessageBox.getTimeout
No se pudo convertir com.ms.ui.UIMessageBox.insets
No se pudo convertir com.ms.ui.UIMessageBox.keyDown
No se pudo convertir com.ms.ui.UIMessageBox.keyUp
No se pudo convertir com.ms.ui.UIMessageBox.setButtonAlignment
No se pudo convertir com.ms.ui.UIMessageBox.setButtons
No se pudo convertir com.ms.ui.UIMessageBox.setDefaultButton
No se pudo convertir com.ms.ui.UIMessageBox.setImage
No se pudo convertir com.ms.ui.UIMessageBox.setText
No se pudo convertir com.ms.ui.UIMessageBox.setTimeout
No se pudo convertir com.ms.ui.UIMessageBox.timeTriggered
No se pudo convertir com.ms.ui.UIMessageBox.UIMessageBox(UIFrame)
No se pudo convertir com.ms.ui.UIMessageBox.UIMessageBox(UIFrame, String, String, int, int)
No se pudo convertir com.ms.ui.UIMSVMPopup
No se pudo convertir com.ms.ui.UIOldEvent
No se pudo convertir com.ms.ui.UIPanel.add
No se pudo convertir com.ms.ui.UIPanel.getChild
No se pudo convertir com.ms.ui.UIPanel.getChildCount
No se pudo convertir com.ms.ui.UIPanel.getHeader
No se pudo convertir com.ms.ui.UIPanel.getID
No se pudo convertir com.ms.ui.UIPanel.getLayout
No se pudo convertir com.ms.ui.UIPanel.paintAll
No se pudo convertir com.ms.ui.UIPanel.setID
No se pudo convertir com.ms.ui.UIPanel.setLayout
No se pudo convertir com.ms.ui.UIPanel.setRedrawing
No se pudo convertir com.ms.ui.UIPanel.UIPanel
No se pudo convertir com.ms.ui.UIProgress.paint
No se pudo convertir com.ms.ui.UIProgress.UIProgress
No se pudo convertir com.ms.ui.UIProgress.UIProgress(int)
No se pudo convertir com.ms.ui.UIProgress.UIProgress(int, int)
No se pudo convertir com.ms.ui.UIProgress.update
No se pudo convertir com.ms.ui.UIPropertyDialog
No se pudo convertir com.ms.ui.UIPropertyPage
No se pudo convertir com.ms.ui.UIPushButton.getConvertedEvent
No se pudo convertir com.ms.ui.UIPushButton.paint
No se pudo convertir com.ms.ui.UIPushButton.setChecked
No se pudo convertir com.ms.ui.UIPushButton.setFocused
No se pudo convertir com.ms.ui.UIPushButton.setPressed
No se pudo convertir com.ms.ui.UIRadioButton.UIRadioButton(IUIComponent, int)
No se pudo convertir com.ms.ui.UIRadioButton.UIRadioButton(String, int)
No se pudo convertir com.ms.ui.UIRadioGroup.add
No se pudo convertir com.ms.ui.UIRadioGroup.UIRadioGroup
No se pudo convertir com.ms.ui.UIRepeatButton.mouseClicked
No se pudo convertir com.ms.ui.UIRepeatButton.setPressed
No se pudo convertir com.ms.ui.UIRepeatButton.timeTriggered
No se pudo convertir com.ms.ui.UIRepeatButton.UIRepeatButton
No se pudo convertir com.ms.ui.UIRepeatButton.UIRepeatButton(IUIComponent)
No se pudo convertir com.ms.ui.UIRepeatButton.UIRepeatButton(IUIComponent, int)
No se pudo convertir com.ms.ui.UIRepeatButton.UIRepeatButton(String)
No se pudo convertir com.ms.ui.UIRepeatButton.UIRepeatButton(String, int)
No se pudo convertir com.ms.ui.UIRow.getName
No se pudo convertir com.ms.ui.UIRow.requestFocus
No se pudo convertir com.ms.ui.UIRow.setSelected
No se pudo convertir com.ms.ui.UIRowLayout
No se pudo convertir com.ms.ui.UIScroll
No se pudo convertir com.ms.ui.UIScroll.scrollLineDown
No se pudo convertir com.ms.ui.UIScroll.scrollLineUp
No se pudo convertir com.ms.ui.UIScroll.scrollPageDown
No se pudo convertir com.ms.ui.UIScroll.scrollPageUp
No se pudo convertir com.ms.ui.UIScroll.setScrollInfo
No se pudo convertir com.ms.ui.UIScroll.setScrollLine
No se pudo convertir com.ms.ui.UIScrollBar
No se pudo convertir com.ms.ui.UIScrollBar.<Dirección>
No se pudo convertir com.ms.ui.UIScrollBar.add
No se pudo convertir com.ms.ui.UIScrollBar.getLayoutComponent
No se pudo convertir com.ms.ui.UIScrollBar.setStyle
No se pudo convertir com.ms.ui.UIScrollBar.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIScrollBar.UIScrollBar
No se pudo convertir com.ms.ui.UIScrollBar.UIScrollBar(int)
No se pudo convertir com.ms.ui.UIScrollBar.UIScrollBar(int, int, int, int, int, int)
No se pudo convertir com.ms.ui.UIScrollThumb
No se pudo convertir com.ms.ui.UIScrollViewer
No se pudo convertir com.ms.ui.UIScrollViewer.<Posición>
No se pudo convertir com.ms.ui.UIScrollViewer.add
No se pudo convertir com.ms.ui.UIScrollViewer.CONT
No se pudo convertir com.ms.ui.UIScrollViewer.CONTENT
No se pudo convertir com.ms.ui.UIScrollViewer.ensureVisible
No se pudo convertir com.ms.ui.UIScrollViewer.getContent
No se pudo convertir com.ms.ui.UIScrollViewer.getHLine
No se pudo convertir com.ms.ui.UIScrollViewer.getLayoutComponent
No se pudo convertir com.ms.ui.UIScrollViewer.getLine
No se pudo convertir com.ms.ui.UIScrollViewer.getMinimumSize
No se pudo convertir com.ms.ui.UIScrollViewer.getPosition
No se pudo convertir com.ms.ui.UIScrollViewer.getPreferredSize
No se pudo convertir com.ms.ui.UIScrollViewer.getRoleCode
No se pudo convertir com.ms.ui.UIScrollViewer.getVLine
No se pudo convertir com.ms.ui.UIScrollViewer.getXPosition
No se pudo convertir com.ms.ui.UIScrollViewer.getYPosition
No se pudo convertir com.ms.ui.UIScrollViewer.isKeyable
No se pudo convertir com.ms.ui.UIScrollViewer.keyDown
No se pudo convertir com.ms.ui.UIScrollViewer.remove
No se pudo convertir com.ms.ui.UIScrollViewer.replace
No se pudo convertir com.ms.ui.UIScrollViewer.setContent
No se pudo convertir com.ms.ui.UIScrollViewer.setHLine
No se pudo convertir com.ms.ui.UIScrollViewer.setLine
No se pudo convertir com.ms.ui.UIScrollViewer.setScrollStyle
No se pudo convertir com.ms.ui.UIScrollViewer.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIScrollViewer.setVLine
No se pudo convertir com.ms.ui.UIScrollViewer.setXPosition
No se pudo convertir com.ms.ui.UIScrollViewer.setYPosition
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent)
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent, int)
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent, int, int)
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent, int, int, int)
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent, int, int, int, int)
No se pudo convertir com.ms.ui.UIScrollViewer.UIScrollViewer(IUIComponent, int, int, int, int, int)
No se pudo convertir com.ms.ui.UISelector
No se pudo convertir com.ms.ui.UISelector.addSelectedIndex(int)
No se pudo convertir com.ms.ui.UISelector.addSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.UISelector.addSelectedIndices(int[])
No se pudo convertir com.ms.ui.UISelector.addSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.UISelector.find
No se pudo convertir com.ms.ui.UISelector.getSelectedIndex
No se pudo convertir com.ms.ui.UISelector.getSelectedItem
No se pudo convertir com.ms.ui.UISelector.remove
No se pudo convertir com.ms.ui.UISelector.removeSelectedIndex(int)
No se pudo convertir com.ms.ui.UISelector.removeSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.UISelector.removeSelectedIndices(int[])
No se pudo convertir com.ms.ui.UISelector.removeSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.UISelector.setSelectedIndex(int)
No se pudo convertir com.ms.ui.UISelector.setSelectedIndex(int, boolean)
No se pudo convertir com.ms.ui.UISelector.setSelectedIndices(int[])
No se pudo convertir com.ms.ui.UISelector.setSelectedIndices(int[], boolean)
No se pudo convertir com.ms.ui.UISelector.setSelectedItem
No se pudo convertir com.ms.ui.UISelector.setSelectionMode
No se pudo convertir com.ms.ui.UISingleContainer.add
No se pudo convertir com.ms.ui.UISingleContainer.getChildBounds
No se pudo convertir com.ms.ui.UISingleContainer.getChildLocation
No se pudo convertir com.ms.ui.UISingleContainer.getChildSize
No se pudo convertir com.ms.ui.UISingleContainer.getComponent
No se pudo convertir com.ms.ui.UISingleContainer.getHeader
No se pudo convertir com.ms.ui.UISingleContainer.layout
No se pudo convertir com.ms.ui.UISingleContainer.mouseExit
No se pudo convertir com.ms.ui.UISingleContainer.relayout
No se pudo convertir com.ms.ui.UISingleContainer.remove
No se pudo convertir com.ms.ui.UISingleContainer.setHeader
No se pudo convertir com.ms.ui.UISingleContainer.setID
No se pudo convertir com.ms.ui.UISingleContainer.setName
No se pudo convertir com.ms.ui.UISingleContainer.UISingleContainer
No se pudo convertir com.ms.ui.UISlider.add
No se pudo convertir com.ms.ui.UISlider.clearSelection
No se pudo convertir com.ms.ui.UISlider.getLayoutComponent
No se pudo convertir com.ms.ui.UISlider.getSelectionEnd
No se pudo convertir com.ms.ui.UISlider.getSelectionStart
No se pudo convertir com.ms.ui.UISlider.setSelection
No se pudo convertir com.ms.ui.UISlider.setSelectionEnd
No se pudo convertir com.ms.ui.UISlider.setSelectionStart
No se pudo convertir com.ms.ui.UISpinner
No se pudo convertir com.ms.ui.UISpinner.<Dirección>
No se pudo convertir com.ms.ui.UISpinner.<Tipo>
No se pudo convertir com.ms.ui.UISpinner.add
No se pudo convertir com.ms.ui.UISpinner.getLayoutComponent
No se pudo convertir com.ms.ui.UISpinner.getMinimumSize
No se pudo convertir com.ms.ui.UISpinner.getPreferredSize
No se pudo convertir com.ms.ui.UISpinner.getRoleCode
No se pudo convertir com.ms.ui.UISpinner.getScrollPos
No se pudo convertir com.ms.ui.UISpinner.keyDown
No se pudo convertir com.ms.ui.UISpinner.layout
No se pudo convertir com.ms.ui.UISpinner.RAISED
No se pudo convertir com.ms.ui.UISpinner.requestFocus
No se pudo convertir com.ms.ui.UISpinner.scrollLineDown
No se pudo convertir com.ms.ui.UISpinner.scrollLineUp
No se pudo convertir com.ms.ui.UISpinner.scrollPageDown
No se pudo convertir com.ms.ui.UISpinner.scrollPageUp
No se pudo convertir com.ms.ui.UISpinner.setScrollInfo
No se pudo convertir com.ms.ui.UISpinner.setStyle
No se pudo convertir com.ms.ui.UISpinner.UISpinner(int)
No se pudo convertir com.ms.ui.UISpinner.UISpinner(int, int, int, int, int, int)
No se pudo convertir com.ms.ui.UISpinnerEdit.BORDER
No se pudo convertir com.ms.ui.UISpinnerEdit.CENTER
No se pudo convertir com.ms.ui.UISpinnerEdit.getEditStyle
No se pudo convertir com.ms.ui.UISpinnerEdit.setEditStyle
No se pudo convertir com.ms.ui.UISpinnerEdit.UISpinnerEdit(int, int)
No se pudo convertir com.ms.ui.UISpinnerEdit.UISpinnerEdit(int, int, int, int, int, int, int)
No se pudo convertir com.ms.ui.UISplitLayout
No se pudo convertir com.ms.ui.UISplitViewer
No se pudo convertir com.ms.ui.UISplitViewer.<Tipo>
No se pudo convertir com.ms.ui.UISplitViewer.getComponent
No se pudo convertir com.ms.ui.UISplitViewer.getFloater
No se pudo convertir com.ms.ui.UISplitViewer.getPos
No se pudo convertir com.ms.ui.UISplitViewer.getStyle
No se pudo convertir com.ms.ui.UISplitViewer.mouseDown
No se pudo convertir com.ms.ui.UISplitViewer.mouseDrag
No se pudo convertir com.ms.ui.UISplitViewer.mouseUp
No se pudo convertir com.ms.ui.UISplitViewer.setPos
No se pudo convertir com.ms.ui.UISplitViewer.UISplitViewer
No se pudo convertir com.ms.ui.UIStateComponent.adjustLayoutSize
No se pudo convertir com.ms.ui.UIStateComponent.disableEvents
No se pudo convertir com.ms.ui.UIStateComponent.enableEvents
No se pudo convertir com.ms.ui.UIStateComponent.getCachedPreferredSize
No se pudo convertir com.ms.ui.UIStateComponent.getConvertedEvent
No se pudo convertir com.ms.ui.UIStateComponent.getFlags
No se pudo convertir com.ms.ui.UIStateComponent.HEADER
No se pudo convertir com.ms.ui.UIStateComponent.isInvalidating
No se pudo convertir com.ms.ui.UIStateComponent.isRedrawing
No se pudo convertir com.ms.ui.UIStateComponent.isSelected
No se pudo convertir com.ms.ui.UIStateComponent.isValid
No se pudo convertir com.ms.ui.UIStateComponent.listeners
No se pudo convertir com.ms.ui.UIStateComponent.obtainListenerTracker
No se pudo convertir com.ms.ui.UIStateComponent.recalcPreferredSize
No se pudo convertir com.ms.ui.UIStateComponent.setChecked
No se pudo convertir com.ms.ui.UIStateComponent.setFlags
No se pudo convertir com.ms.ui.UIStateComponent.setHot
No se pudo convertir com.ms.ui.UIStateComponent.setIndeterminate
No se pudo convertir com.ms.ui.UIStateComponent.setInvalidating
No se pudo convertir com.ms.ui.UIStateComponent.setPressed
No se pudo convertir com.ms.ui.UIStateComponent.setRedrawing
No se pudo convertir com.ms.ui.UIStateComponent.setReparent
No se pudo convertir com.ms.ui.UIStateComponent.setSelected
No se pudo convertir com.ms.ui.UIStateComponent.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIStateComponent.setValid
No se pudo convertir com.ms.ui.UIStateContainer.add
No se pudo convertir com.ms.ui.UIStateContainer.adjustLayoutSize
No se pudo convertir com.ms.ui.UIStateContainer.disableEvents
No se pudo convertir com.ms.ui.UIStateContainer.enableEvents
No se pudo convertir com.ms.ui.UIStateContainer.getBackground
No se pudo convertir com.ms.ui.UIStateContainer.getCachedPreferredSize
No se pudo convertir com.ms.ui.UIStateContainer.getConvertedEvent
No se pudo convertir com.ms.ui.UIStateContainer.getCursor
No se pudo convertir com.ms.ui.UIStateContainer.getEdge
No se pudo convertir com.ms.ui.UIStateContainer.getFlags
No se pudo convertir com.ms.ui.UIStateContainer.getFont
No se pudo convertir com.ms.ui.UIStateContainer.getForeground
No se pudo convertir com.ms.ui.UIStateContainer.getIndex
No se pudo convertir com.ms.ui.UIStateContainer.getParent
No se pudo convertir com.ms.ui.UIStateContainer.isChecked
No se pudo convertir com.ms.ui.UIStateContainer.isEnabled
No se pudo convertir com.ms.ui.UIStateContainer.isFocused
No se pudo convertir com.ms.ui.UIStateContainer.isInvalidating
No se pudo convertir com.ms.ui.UIStateContainer.isRedrawing
No se pudo convertir com.ms.ui.UIStateContainer.isSelected
No se pudo convertir com.ms.ui.UIStateContainer.isValid
No se pudo convertir com.ms.ui.UIStateContainer.isVisible
No se pudo convertir com.ms.ui.UIStateContainer.listeners
No se pudo convertir com.ms.ui.UIStateContainer.obtainConvertedEvent
No se pudo convertir com.ms.ui.UIStateContainer.obtainListenerTracker
No se pudo convertir com.ms.ui.UIStateContainer.recalcPreferredSize
No se pudo convertir com.ms.ui.UIStateContainer.setBackground
No se pudo convertir com.ms.ui.UIStateContainer.setChecked
No se pudo convertir com.ms.ui.UIStateContainer.setCursor
No se pudo convertir com.ms.ui.UIStateContainer.setEdge
No se pudo convertir com.ms.ui.UIStateContainer.setEnabled
No se pudo convertir com.ms.ui.UIStateContainer.setFlags
No se pudo convertir com.ms.ui.UIStateContainer.setFont
No se pudo convertir com.ms.ui.UIStateContainer.setForeground
No se pudo convertir com.ms.ui.UIStateContainer.setHot
No se pudo convertir com.ms.ui.UIStateContainer.setIndeterminate
No se pudo convertir com.ms.ui.UIStateContainer.setIndex
No se pudo convertir com.ms.ui.UIStateContainer.setInvalidating
No se pudo convertir com.ms.ui.UIStateContainer.setParent
No se pudo convertir com.ms.ui.UIStateContainer.setPressed
No se pudo convertir com.ms.ui.UIStateContainer.setRedrawing
No se pudo convertir com.ms.ui.UIStateContainer.setReparent
No se pudo convertir com.ms.ui.UIStateContainer.setSelected
No se pudo convertir com.ms.ui.UIStateContainer.setUsingWindowsLook
No se pudo convertir com.ms.ui.UIStateContainer.setValid
No se pudo convertir com.ms.ui.UIStateContainer.setVisible
No se pudo convertir com.ms.ui.UIStateContainer.UIStateContainer
No se pudo convertir com.ms.ui.UIStatic
No se pudo convertir com.ms.ui.UIStatic.HCENTER
No se pudo convertir com.ms.ui.UIStatic.setFlags
No se pudo convertir com.ms.ui.UIStatic.VCENTER
No se pudo convertir com.ms.ui.UISystem
No se pudo convertir com.ms.ui.UITab.paint
No se pudo convertir com.ms.ui.UITab.setSelected
No se pudo convertir com.ms.ui.UITab.UITab
No se pudo convertir com.ms.ui.UITabLayout
No se pudo convertir com.ms.ui.UITabList
No se pudo convertir com.ms.ui.UITabList.add(IUIComponent)
No se pudo convertir com.ms.ui.UITabList.add(IUIComponent, int)
No se pudo convertir com.ms.ui.UITabList.add(String)
No se pudo convertir com.ms.ui.UITabList.add(String, int)
No se pudo convertir com.ms.ui.UITabList.layout
No se pudo convertir com.ms.ui.UITabList.paint
No se pudo convertir com.ms.ui.UITabList.passFocus
No se pudo convertir com.ms.ui.UITabList.setSelectedItem
No se pudo convertir com.ms.ui.UITabListLayout
No se pudo convertir com.ms.ui.UITabViewer.add
No se pudo convertir com.ms.ui.UITabViewer.addTab(IUIComponent, IUIComponent)
No se pudo convertir com.ms.ui.UITabViewer.getConvertedEvent
No se pudo convertir com.ms.ui.UITabViewer.paint
No se pudo convertir com.ms.ui.UITabViewer.removeTab
No se pudo convertir com.ms.ui.UITabViewer.requestFocus
No se pudo convertir com.ms.ui.UITabViewer.setSelectedItem
No se pudo convertir com.ms.ui.UIText.getPreferredSize
No se pudo convertir com.ms.ui.UIText.paint
No se pudo convertir com.ms.ui.UIText.setFocused
No se pudo convertir com.ms.ui.UIText.setHot
No se pudo convertir com.ms.ui.UIText.setSelected
No se pudo convertir com.ms.ui.UIThreePanelLayout
No se pudo convertir com.ms.ui.UIThumb
No se pudo convertir com.ms.ui.UITree
No se pudo convertir com.ms.ui.UITree.action
No se pudo convertir com.ms.ui.UITree.add(Component)
No se pudo convertir com.ms.ui.UITree.add(Component, int)
No se pudo convertir com.ms.ui.UITree.add(Image, String, int)
No se pudo convertir com.ms.ui.UITree.add(String, int)
No se pudo convertir com.ms.ui.UITree.add(IUIComponent)
No se pudo convertir com.ms.ui.UITree.getAttachRect
No se pudo convertir com.ms.ui.UITree.getExpander
No se pudo convertir com.ms.ui.UITree.keyDown
No se pudo convertir com.ms.ui.UITree.remove
No se pudo convertir com.ms.ui.UITree.setChecked
No se pudo convertir com.ms.ui.UITree.setExpanded
No se pudo convertir com.ms.ui.UITree.setExpander
No se pudo convertir com.ms.ui.UITree.setLayout
No se pudo convertir com.ms.ui.UITreeLayout
No se pudo convertir com.ms.ui.UIVerticalFlowLayout
No se pudo convertir com.ms.ui.UIViewer.ensureVisible
No se pudo convertir com.ms.ui.UIViewer.isOverlapping
No se pudo convertir com.ms.ui.UIViewer.mouseDown
No se pudo convertir com.ms.ui.UIViewer.mouseDrag
No se pudo convertir com.ms.ui.UIViewer.mouseUp
No se pudo convertir com.ms.ui.UIViewer.requestFocus
No se pudo convertir com.ms.ui.UIViewer.timeTriggered
No se pudo convertir com.ms.ui.UIWindow.keyDown
No se pudo convertir com.ms.ui.UIWindow.pack
No se pudo convertir com.ms.ui.UIWindow.setSize
No se pudo convertir com.ms.ui.UIWinEvent
No se pudo convertir com.ms.ui.UIWizard
No se pudo convertir com.ms.ui.UIWizardStep
No se pudo convertir com.ms.ui.Version
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.util


No se pudo convertir com.ms.util.ArraySort.compare
No se pudo convertir com.ms.util.ArraySort.sort
No se pudo convertir com.ms.util.ArraySort.swap
No se pudo convertir com.ms.util.cab.CabEnumerator
No se pudo convertir com.ms.util.cab.CabException
No se pudo convertir com.ms.util.cab.CabFileEntry
No se pudo convertir com.ms.util.cab.CabFolderEntry
No se pudo convertir com.ms.util.cab.CabProgressInterface
No se pudo convertir com.ms.util.EventLog.reportEvent
No se pudo convertir com.ms.util.HTMLTokenizer
No se pudo convertir com.ms.util.IIntRangeComparator
No se pudo convertir com.ms.util.IncludeExcludeIntRanges
No se pudo convertir com.ms.util.IncludeExcludeWildcards
No se pudo convertir com.ms.util.ini.IniFile
No se pudo convertir com.ms.util.ini.IniSection
No se pudo convertir com.ms.util.ini.IniSyntaxErrorException
No se pudo convertir com.ms.util.IntRanges.compare
No se pudo convertir com.ms.util.IntRanges.compareSet
No se pudo convertir com.ms.util.IntRanges.ComparisonResulttoString
No se pudo convertir com.ms.util.IntRanges.condense
No se pudo convertir com.ms.util.IntRanges.contains
No se pudo convertir com.ms.util.IntRanges.indexOf
No se pudo convertir com.ms.util.IntRanges.intersect
No se pudo convertir com.ms.util.IntRanges.IntRanges
No se pudo convertir com.ms.util.IntRanges.invertComparisonResult
No se pudo convertir com.ms.util.IntRanges.lock
No se pudo convertir com.ms.util.IntRanges.parse
No se pudo convertir com.ms.util.IntRanges.removeRange
No se pudo convertir com.ms.util.IntRanges.removeRanges
No se pudo convertir com.ms.util.IntRanges.removeRanges(int, int)
No se pudo convertir com.ms.util.IntRanges.removeRanges(int, int, IntRangeComparator)
No se pudo convertir com.ms.util.IntRanges.removeSingleton
No se pudo convertir com.ms.util.IntRanges.size
No se pudo convertir com.ms.util.IntRanges.sort
No se pudo convertir com.ms.util.IntRanges.unlock
No se pudo convertir com.ms.util.IWildcardExpressionComparator
No se pudo convertir com.ms.util.OrdinalMap.insertInCognate
No se pudo convertir com.ms.util.OrdinalMap.moveCognate
No se pudo convertir com.ms.util.OrdinalMap.newCognate
No se pudo convertir com.ms.util.OrdinalMap.removeFromCognate
No se pudo convertir com.ms.util.ProvideSetComparisonInfo
No se pudo convertir com.ms.util.Queue.capacity
No se pudo convertir com.ms.util.Queue.elementFromHead
No se pudo convertir com.ms.util.Queue.elementFromTail
No se pudo convertir com.ms.util.Queue.hasMoreElements
No se pudo convertir com.ms.util.Queue.nextElement
No se pudo convertir com.ms.util.Queue.setCapacity
No se pudo convertir com.ms.util.Queue.toString
No se pudo convertir com.ms.util.SetComparer
No se pudo convertir com.ms.util.SetComparison
No se pudo convertir com.ms.util.SetTemplate.foundAt
No se pudo convertir com.ms.util.SetTemplate.foundCognate
No se pudo convertir com.ms.util.SetTemplate.foundIn
No se pudo convertir com.ms.util.SetTemplate.generation
No se pudo convertir com.ms.util.SetTemplate.insertInCognate
No se pudo convertir com.ms.util.SetTemplate.keys
No se pudo convertir com.ms.util.SetTemplate.locate
No se pudo convertir com.ms.util.SetTemplate.moveCognate
No se pudo convertir com.ms.util.SetTemplate.newCognate
No se pudo convertir com.ms.util.SetTemplate.rehash
No se pudo convertir com.ms.util.SetTemplate.removeFromCognate
No se pudo convertir com.ms.util.SetTemplate.reportFinds
No se pudo convertir com.ms.util.SetTemplate.reportRequests
No se pudo convertir com.ms.util.SetTemplate.reportUnits
No se pudo convertir com.ms.util.SetTemplate.SetTemplate
No se pudo convertir com.ms.util.Sort.compare
No se pudo convertir com.ms.util.Sort.doSort
No se pudo convertir com.ms.util.Sort.swap
No se pudo convertir com.ms.util.StringComparison.ascending
No se pudo convertir com.ms.util.StringComparison.descending
No se pudo convertir com.ms.util.SystemVersionManager
No se pudo convertir com.ms.util.Task
No se pudo convertir com.ms.util.TaskManager
No se pudo convertir com.ms.util.ThreadLocalStorage
No se pudo convertir com.ms.util.Timer.getRepeat
No se pudo convertir com.ms.util.Timer.getUserID
No se pudo convertir com.ms.util.Timer.Timer
No se pudo convertir com.ms.util.TimerEvent.getSource
No se pudo convertir com.ms.util.TimerEvent.getTime
No se pudo convertir com.ms.util.TimerEvent.getUserID
No se pudo convertir com.ms.util.TimerListener
No se pudo convertir com.ms.util.UnsignedIntRanges.contains
No se pudo convertir com.ms.util.UnsignedIntRanges.indexOf
No se pudo convertir com.ms.util.UnsignedIntRanges.intersect
No se pudo convertir com.ms.util.UnsignedIntRanges.removeRange
No se pudo convertir com.ms.util.UnsignedIntRanges.UnsignedIntRanges
No se pudo convertir com.ms.util.VectorSort.compare
No se pudo convertir com.ms.util.VectorSort.swap
No se pudo convertir com.ms.util.WildcardExpression
No se pudo convertir com.ms.util.zip.ZipInputStreamEx
No se pudo convertir com.ms.util.zip.ZipOutputStreamEx
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc


No se pudo convertir com.ms.wfc.Rectangle.Editor
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.app


No se pudo convertir com.ms.wfc.app.Application.addOnSettingChange
No se pudo convertir com.ms.wfc.app.Application.addOnSystemShutdown
No se pudo convertir com.ms.wfc.app.Application.allocThreadStorage
No se pudo convertir com.ms.wfc.app.Application.createThread
No se pudo convertir com.ms.wfc.app.Application.doEvents
No se pudo convertir com.ms.wfc.app.Application.freeThreadStorage
No se pudo convertir com.ms.wfc.app.Application.getParkingForm
No se pudo convertir com.ms.wfc.app.Application.getThreadStorage
No se pudo convertir com.ms.wfc.app.Application.removeOnSettingChange
No se pudo convertir com.ms.wfc.app.Application.removeOnSystemShutdown
No se pudo convertir com.ms.wfc.app.Application.runDialog
No se pudo convertir com.ms.wfc.app.Application.setThreadStorage
No se pudo convertir com.ms.wfc.app.CharacterSet
No se pudo convertir com.ms.wfc.app.Clipboard.Clipboard
No se pudo convertir com.ms.wfc.app.DataFormats.CF_CSV
No se pudo convertir com.ms.wfc.app.DataFormats.CF_WFCOBJECT
No se pudo convertir com.ms.wfc.app.DataFormats.DataFormats
No se pudo convertir com.ms.wfc.app.DataFormats.Format.Format
No se pudo convertir com.ms.wfc.app.DataFormats.Format.win32Handle
No se pudo convertir com.ms.wfc.app.DataObject.OleDAdvise
No se pudo convertir com.ms.wfc.app.DataObject.OleDUnadvise
No se pudo convertir com.ms.wfc.app.DataObject.OleEnumDAdvise
No se pudo convertir com.ms.wfc.app.DataObject.OleEnumFormatEtc
No se pudo convertir com.ms.wfc.app.DataObject.OleGetCanonicalFormatEtc
No se pudo convertir com.ms.wfc.app.DataObject.OleGetData
No se pudo convertir com.ms.wfc.app.DataObject.OleGetDataHere
No se pudo convertir com.ms.wfc.app.DataObject.OleQueryGetData
No se pudo convertir com.ms.wfc.app.DataObject.OleSetData
No se pudo convertir com.ms.wfc.app.IMessageFilter.postFilterMessage
No se pudo convertir com.ms.wfc.app.KeywordVk
No se pudo convertir com.ms.wfc.app.Languages.Languages
No se pudo convertir com.ms.wfc.app.Locale.CalendarType
No se pudo convertir com.ms.wfc.app.Locale.compareStrings
No se pudo convertir com.ms.wfc.app.Locale.DateFormatOrder
No se pudo convertir com.ms.wfc.app.Locale.getCalendarType
No se pudo convertir com.ms.wfc.app.Locale.getCenturyFormat
No se pudo convertir com.ms.wfc.app.Locale.getCharacterSet
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreCase
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreKana
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreKashida
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreNonSpace
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreSymbols
No se pudo convertir com.ms.wfc.app.Locale.getCompareIgnoreWidth
No se pudo convertir com.ms.wfc.app.Locale.getCountryCode
No se pudo convertir com.ms.wfc.app.Locale.getDefaultCountry
No se pudo convertir com.ms.wfc.app.Locale.getEnglishCurrencyName
No se pudo convertir com.ms.wfc.app.Locale.getLeadingZero
No se pudo convertir com.ms.wfc.app.Locale.getNativeDigits
No se pudo convertir com.ms.wfc.app.Locale.getSortId
No se pudo convertir com.ms.wfc.app.Locale.getSupportedLocales
No se puede convertir com.ms.wfc.app.Locale.Languages.Locale.Languages
No se pudo convertir com.ms.wfc.app.Locale.Languages.RHAETO_ROMAN
No se pudo convertir com.ms.wfc.app.Locale.LeadingZeros
No se pudo convertir com.ms.wfc.app.Locale.Locale
No se pudo convertir com.ms.wfc.app.Locale.MeasurementSystem
No se puede convertir com.ms.wfc.app.Locale.NegativeNumberMode.Locale.NegativeNumberMode
No se pudo convertir com.ms.wfc.app.Locale.OptionalCalendarType
No se pudo convertir com.ms.wfc.app.Locale.PositiveCurrencyMode.Locale.PositiveCurrencyMode
No se pudo convertir com.ms.wfc.app.Locale.setCalendarType
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreCase
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreKana
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreKashida
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreNonSpace
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreSymbols
No se pudo convertir com.ms.wfc.app.Locale.setCompareIgnoreWidth
No se pudo convertir com.ms.wfc.app.Locale.setFirstDayOfWeek
No se pudo convertir com.ms.wfc.app.Locale.setFirstWeekOfYear
No se pudo convertir com.ms.wfc.app.Locale.setLeadingZero
No se pudo convertir com.ms.wfc.app.Locale.setListSeparator
No se pudo convertir com.ms.wfc.app.Locale.setMeasurementSystem
No se pudo convertir com.ms.wfc.app.Locale.Sort
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.CHINESE_SIMPLIFIED
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.CHINESE_TRADITIONAL
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.DUTCH_BELGIAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_AUS
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_CAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_EIRE
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_NZ
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_UK
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ENGLISH_US
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.FRENCH_BELGIAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.FRENCH_CANADIAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.FRENCH_SWISS
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.GERMAN_AUSTRIAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.GERMAN_SWISS
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.ITALIAN_SWISS
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.Locale.SubLanguages
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.NORWEGIAN_BOKMAL
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.NORWEGIAN_NYNORSK
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.PORTUGUESE_BRAZILIAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SERBO_CROATIAN_CYRILLIC
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SERBO_CROATIAN_LATIN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SPANISH_MEXICAN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SPANISH_MODERN
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SubLanguages
No se pudo convertir com.ms.wfc.app.Locale.SubLanguages.SYS_DEFAULT
No se pudo convertir com.ms.wfc.app.Message.free
No se pudo convertir com.ms.wfc.app.MethodInvoker.MethodInvoker
No se pudo convertir com.ms.wfc.app.NegativeNumberMode.NegativeNumberMode
No se pudo convertir com.ms.wfc.app.PositiveCurrencyMode.PositiveCurrencyMode
No se pudo convertir com.ms.wfc.app.Registry.Registry
No se pudo convertir com.ms.wfc.app.RegistryKey.getBaseKey
No se pudo convertir com.ms.wfc.app.SendKeysHookProc
No se pudo convertir com.ms.wfc.app.SKEvent
No se pudo convertir com.ms.wfc.app.SubLanguages.SubLanguages
No se pudo convertir com.ms.wfc.app.SystemInformation.getArrange
No se pudo convertir com.ms.wfc.app.ThreadExceptionEventHandler.ThreadExceptionEventHandler
com.ms.wfc.app.Time.getConstructorArgs
No se pudo convertir com.ms.wfc.app.Time.getExtension
No se pudo convertir com.ms.wfc.app.Time.save
No se pudo convertir com.ms.wfc.app.Time.Time
No se pudo convertir com.ms.wfc.app.Time.toSystemTime
No se pudo convertir com.ms.wfc.app.Time.toVariant
No se pudo convertir com.ms.wfc.app.Window.callback
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.ax


No se pudo convertir com.ms.wfc.ax
No se pudo convertir com.ms.wfc.ax._POINTL
No se pudo convertir com.ms.wfc.ax.ActiveX
No se pudo convertir com.ms.wfc.ax.Ambients
No se pudo convertir com.ms.wfc.ax.IAdviseSink
No se pudo convertir com.ms.wfc.ax.ICategorizeProperties
No se pudo convertir com.ms.wfc.ax.IClassFactory
No se pudo convertir com.ms.wfc.ax.IClassFactory2
No se pudo convertir com.ms.wfc.ax.IDDispatch
No se pudo convertir com.ms.wfc.ax.IEDispatch
No se pudo convertir com.ms.wfc.ax.IEnumOLEVERB
No se pudo convertir com.ms.wfc.ax.IEnumUnknown
No se pudo convertir com.ms.wfc.ax.IExtender
No se pudo convertir com.ms.wfc.ax.IFont
No se pudo convertir com.ms.wfc.ax.IFontDisp
No se pudo convertir com.ms.wfc.ax.IGetOleObject
No se pudo convertir com.ms.wfc.ax.IGetVBAObject
No se pudo convertir com.ms.wfc.ax.IMyDispatch
No se pudo convertir com.ms.wfc.ax.IObjectIdentity
No se pudo convertir com.ms.wfc.ax.IObjectWithSite
No se pudo convertir com.ms.wfc.ax.IOleClientSite
No se pudo convertir com.ms.wfc.ax.IOleContainer
No se pudo convertir com.ms.wfc.ax.IOleControl
No se pudo convertir com.ms.wfc.ax.IOleControlSite
No se pudo convertir com.ms.wfc.ax.IOleInPlaceActiveObject
No se pudo convertir com.ms.wfc.ax.IOleInPlaceFrame
No se pudo convertir com.ms.wfc.ax.IOleInPlaceObject
No se pudo convertir com.ms.wfc.ax.IOleInPlaceSite
No se pudo convertir com.ms.wfc.ax.IOleInPlaceUIWindow
No se pudo convertir com.ms.wfc.ax.IOleWindow
No se pudo convertir com.ms.wfc.ax.IParseDisplayName
No se pudo convertir com.ms.wfc.ax.IPerPropertyBrowsing
No se pudo convertir com.ms.wfc.ax.IPersist
No se pudo convertir com.ms.wfc.ax.IPersist.iid
No se pudo convertir com.ms.wfc.ax.IPersistPropertyBag
No se pudo convertir com.ms.wfc.ax.IPersistStorage
No se pudo convertir com.ms.wfc.ax.IPersistStream
No se pudo convertir com.ms.wfc.ax.IPersistStreamInit
No se pudo convertir com.ms.wfc.ax.IPicture
No se pudo convertir com.ms.wfc.ax.IPictureDisp
No se pudo convertir com.ms.wfc.ax.IPropertyBag
No se pudo convertir com.ms.wfc.ax.IQuickActivate
No se pudo convertir com.ms.wfc.ax.ISimpleFrameSite
No se pudo convertir com.ms.wfc.ax.ISpecifyPropertyPages
No se pudo convertir com.ms.wfc.ax.IVBFormat
No se pudo convertir com.ms.wfc.ax.IVBGetControl
No se pudo convertir com.ms.wfc.ax.tagCADWORD
No se pudo convertir com.ms.wfc.ax.tagCALPOLESTR
No se pudo convertir com.ms.wfc.ax.tagCAUUID
No se pudo convertir com.ms.wfc.ax.tagCONTROLINFO
No se pudo convertir com.ms.wfc.ax.tagDISPPARAMS
No se pudo convertir com.ms.wfc.ax.tagLICINFO
No se pudo convertir com.ms.wfc.ax.tagLOGPALETTE
No se pudo convertir com.ms.wfc.ax.tagMSG
No se pudo convertir com.ms.wfc.ax.tagOIFI
No se pudo convertir com.ms.wfc.ax.tagOleMenuGroupWidths
No se pudo convertir com.ms.wfc.ax.tagOLEVERB
No se pudo convertir com.ms.wfc.ax.tagPOINTF
No se pudo convertir com.ms.wfc.ax.tagQACONTAINER
No se pudo convertir com.ms.wfc.ax.tagQACONTROL
No se pudo convertir com.ms.wfc.ax.tagRECT
No se pudo convertir com.ms.wfc.ax.tagSIZE
No se pudo convertir com.ms.wfc.ax.tagSIZEL
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Com.ms.wfc.core


No se pudo convertir com.ms.wfc.core.ArrayDialog
No se pudo convertir com.ms.wfc.core.ArrayEditor.createNewInstance
No se pudo convertir com.ms.wfc.core.ArrayEditor.defaultPropInfo
No se pudo convertir com.ms.wfc.core.ArrayEditor.editValue
No se pudo convertir com.ms.wfc.core.ArrayEditor.getBaseName
No se pudo convertir com.ms.wfc.core.ArrayEditor.getDisplayText
No se pudo convertir com.ms.wfc.core.ArrayEditor.getTextFromValue
No se pudo convertir com.ms.wfc.core.ArrayEditor.getTypeDescription
No se pudo convertir com.ms.wfc.core.BooleanEditor.getStyle
No se pudo convertir com.ms.wfc.core.BooleanEditor.getValueFromText
No se pudo convertir com.ms.wfc.core.CancelEventHandler.CancelEventHandler
No se pudo convertir com.ms.wfc.core.CategoryAttribute.Position
No se pudo convertir com.ms.wfc.core.Component.appendEventHandlers
No se pudo convertir com.ms.wfc.core.Component.componentChanged
No se pudo convertir com.ms.wfc.core.Component.getDisposing
No se pudo convertir com.ms.wfc.core.Component.getResource
No se pudo convertir com.ms.wfc.core.Component.getService
No se pudo convertir com.ms.wfc.core.ComponentInfo.getClassInfo
No se pudo convertir com.ms.wfc.core.ComponentInfo.getDefaultEventInfo
No se pudo convertir com.ms.wfc.core.ComponentInfo.getExtenders
No se pudo convertir com.ms.wfc.core.ComponentManager.createClassInfo
No se pudo convertir com.ms.wfc.core.ComponentManager.createValueEditor
No se pudo convertir com.ms.wfc.core.ComponentManager.getComponentInfo
No se pudo convertir com.ms.wfc.core.ComponentManager.getValueEditor
No se pudo convertir com.ms.wfc.core.ComponentManager.registerClassInfo
No se pudo convertir com.ms.wfc.core.ComponentManager.registerValueEditorClass
No se pudo convertir com.ms.wfc.core.ConstructorArg
No se pudo convertir com.ms.wfc.core.ConstructorArg.ConstructorArg
No se pudo convertir com.ms.wfc.core.CustomizerVerb.addOnVerbExecute
No se pudo convertir com.ms.wfc.core.CustomizerVerb.CustomizerVerb
No se pudo convertir com.ms.wfc.core.CustomizerVerb.getBitmap
No se pudo convertir com.ms.wfc.core.CustomizerVerb.getData
No se pudo convertir com.ms.wfc.core.CustomizerVerb.onVerbExecute
No se pudo convertir com.ms.wfc.core.CustomizerVerb.performVerbExecute
No se pudo convertir com.ms.wfc.core.CustomizerVerb.removeOnVerbExecute
No se pudo convertir com.ms.wfc.core.CustomizerVerb.setBitmap
No se pudo convertir com.ms.wfc.core.CustomizerVerb.setData
No se pudo convertir com.ms.wfc.core.DescriptionAttribute.getDescription
No se pudo convertir com.ms.wfc.core.DesignForm.DesignForm
No se pudo convertir com.ms.wfc.core.DesignForm.getPage
No se pudo convertir com.ms.wfc.core.DesignForm.getPageCount
No se pudo convertir com.ms.wfc.core.DesignForm.showForm
No se pudo convertir com.ms.wfc.core.DesignPage.getPageMessage
No se pudo convertir com.ms.wfc.core.DesignPage.NULLVALUE
No se pudo convertir com.ms.wfc.core.DesignPage.objects
No se pudo convertir com.ms.wfc.core.DesignPage.onReadProperty
No se pudo convertir com.ms.wfc.core.DesignPage.onWriteProperty
No se pudo convertir com.ms.wfc.core.DesignPage.properties
No se pudo convertir com.ms.wfc.core.DesignPage.setObjects
No se pudo convertir com.ms.wfc.core.DoubleEditor.getValueFromText
No se pudo convertir com.ms.wfc.core.Enum.Enum
No se pudo convertir com.ms.wfc.core.Event.Event
No se pudo convertir com.ms.wfc.core.Event.extendedInfo
No se pudo convertir com.ms.wfc.core.EventHandler.EventHandler
No se pudo convertir com.ms.wfc.core.EventInfo.addEventHandler
No se pudo convertir com.ms.wfc.core.EventInfo.getAddMethod
No se pudo convertir com.ms.wfc.core.EventInfo.getMulticast
No se pudo convertir com.ms.wfc.core.EventInfo.getRemoveMethod
No se pudo convertir com.ms.wfc.core.EventInfo.getType
No se pudo convertir com.ms.wfc.core.EventInfo.removeEventHandler
No se pudo convertir com.ms.wfc.core.ExtenderInfo
No se pudo convertir com.ms.wfc.core.FieldsEditor
No se pudo convertir com.ms.wfc.core.FloatEditor.getValueFromText
No se pudo convertir com.ms.wfc.core.IAttributes
No se pudo convertir com.ms.wfc.core.IClassInfo
No se pudo convertir com.ms.wfc.core.IComponent.dispose
No se pudo convertir com.ms.wfc.core.IComponent.getChildOf
No se pudo convertir com.ms.wfc.core.IComponentSite.componentChanged
No se pudo convertir com.ms.wfc.core.IComponentSite.getDisposing
No se pudo convertir com.ms.wfc.core.IConstructable
No se pudo convertir com.ms.wfc.core.IContainer.dispose
No se pudo convertir com.ms.wfc.core.IContainer.getComponent
No se pudo convertir com.ms.wfc.core.IContainer.getComponents
No se pudo convertir com.ms.wfc.core.ICustomizer.getDesignPages
No se pudo convertir com.ms.wfc.core.ICustomizer.getHitTest
No se pudo convertir com.ms.wfc.core.ICustomizer.getVerbs
No se pudo convertir com.ms.wfc.core.IDesignPage.getSize
No se pudo convertir com.ms.wfc.core.IDesignPage.setObjects
No se pudo convertir com.ms.wfc.core.IDesignPage.setSize
No se pudo convertir com.ms.wfc.core.IEditorHost.getHostHandle
No se pudo convertir com.ms.wfc.core.IEditorSite.getType
No se pudo convertir com.ms.wfc.core.IEditorSite.getValueOwner
No se pudo convertir com.ms.wfc.core.IEditorSite.getValueOwners
No se pudo convertir com.ms.wfc.core.IResourceLoader
No se pudo convertir com.ms.wfc.core.IResourceManager.containsProperty
No se pudo convertir com.ms.wfc.core.IResourceManager.getNames
No se pudo convertir com.ms.wfc.core.IResourceManager.getProperties
No se pudo convertir com.ms.wfc.core.IResourceManager.saveAllProperties
No se pudo convertir com.ms.wfc.core.IResourceManager.setProperty
No se pudo convertir com.ms.wfc.core.IResourceManager.setResourceSet
No se pudo convertir com.ms.wfc.core.IValueEditor.getConstantName
No se pudo convertir com.ms.wfc.core.IValueEditor.getValueFromSubPropertyValues
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_IMMEDIATE
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_NOARRAYEXPANSION
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_NOARRAYMULTISELECT
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_NOEDITABLETEXT
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_PAINTVALUE
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_PROPERTIES
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_SHOWFIELDS
No se pudo convertir com.ms.wfc.core.IValueEditor.STYLE_VALUES
No se pudo convertir com.ms.wfc.core.MemberAttribute.MemberAttribute
No se pudo convertir com.ms.wfc.core.NonEditableReferenceEditor.getStyle
No se pudo convertir com.ms.wfc.core.NonEditableReferenceEditor.NonEditableReferenceEditor
No se pudo convertir com.ms.wfc.core.NonPersistableAttribute
No se pudo convertir com.ms.wfc.core.PropertyInfo.canResetValue
No se pudo convertir com.ms.wfc.core.PropertyInfo.getGetMethod
No se pudo convertir com.ms.wfc.core.PropertyInfo.getIsReadOnly
No se pudo convertir com.ms.wfc.core.PropertyInfo.getResetMethod
No se pudo convertir com.ms.wfc.core.PropertyInfo.getSetMethod
No se pudo convertir com.ms.wfc.core.PropertyInfo.getShouldPersistMethod
No se pudo convertir com.ms.wfc.core.PropertyInfo.getType
No se pudo convertir com.ms.wfc.core.PropertyInfo.getValue
No se pudo convertir com.ms.wfc.core.PropertyInfo.getValueEditor
No se pudo convertir com.ms.wfc.core.PropertyInfo.resetValue
No se pudo convertir com.ms.wfc.core.PropertyInfo.setValue
No se pudo convertir com.ms.wfc.core.PropertyInfo.shouldPersistValue
No se pudo convertir com.ms.wfc.core.ReferenceEditor.container
No se pudo convertir com.ms.wfc.core.ReferenceEditor.getStyle
No se pudo convertir com.ms.wfc.core.ReferenceEditor.getTextFromValue
No se pudo convertir com.ms.wfc.core.ReferenceEditor.getValueFromText
No se pudo convertir com.ms.wfc.core.ReferenceEditor.getValues
No se pudo convertir com.ms.wfc.core.ReferenceEditor.none
No se pudo convertir com.ms.wfc.core.ReferenceEditor.ReferenceEditor
No se pudo convertir com.ms.wfc.core.ReferenceEditor.type
No se pudo convertir com.ms.wfc.core.ResourceManager.containsProperty
No se pudo convertir com.ms.wfc.core.ResourceManager.EXTENSION
No se pudo convertir com.ms.wfc.core.ResourceManager.getLocaleFileNameFromBase
No se pudo convertir com.ms.wfc.core.ResourceManager.getNames
No se pudo convertir com.ms.wfc.core.ResourceManager.getProperties
No se pudo convertir com.ms.wfc.core.ResourceManager.getResource
No se pudo convertir com.ms.wfc.core.ResourceManager.getResourceLoader
No se pudo convertir com.ms.wfc.core.ResourceManager.ResourceManager
No se pudo convertir com.ms.wfc.core.ResourceManager.save
No se pudo convertir com.ms.wfc.core.ResourceManager.saveAllProperties
No se pudo convertir com.ms.wfc.core.ResourceManager.setBaseName
No se pudo convertir com.ms.wfc.core.ResourceManager.setProperty
No se pudo convertir com.ms.wfc.core.ResourceManager.setResourceLoader
No se pudo convertir com.ms.wfc.core.ResourceManager.setResourceSet
No se pudo convertir com.ms.wfc.core.ResourceReader
No se pudo convertir com.ms.wfc.core.ResourceWriter
No se pudo convertir com.ms.wfc.core.ShowInToolboxAttribute.NO
No se pudo convertir com.ms.wfc.core.ShowInToolboxAttribute.YES
No se pudo convertir com.ms.wfc.core.StringListDialog
No se pudo convertir com.ms.wfc.core.StringListEditor
No se pudo convertir com.ms.wfc.core.Sys
No se pudo convertir com.ms.wfc.core.ValueEditor.editValue
No se pudo convertir com.ms.wfc.core.ValueEditor.getValueFromSubPropertyValues
No se pudo convertir com.ms.wfc.core.ValueEditorAttribute.valueEditorType
No se pudo convertir com.ms.wfc.core.VerbExecuteEvent
No se pudo convertir com.ms.wfc.core.VerbExecuteEventHandler
No se pudo convertir com.ms.wfc.core.WFCException.getBaseException
No se pudo convertir com.ms.wfc.core.WFCException.printStackTrace
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.data


No se pudo convertir com.ms.wfc.data.AdoEnums
No se pudo convertir com.ms.wfc.data.AdoEvent
No se pudo convertir com.ms.wfc.data.AdoException.AdoException
No se pudo convertir com.ms.wfc.data.AdoProperties.AdoProperties
No se pudo convertir com.ms.wfc.data.BooleanDataFormat
No se pudo convertir com.ms.wfc.data.Connection.addOnBeginTransComplete
No se pudo convertir com.ms.wfc.data.Connection.addOnCommitTransComplete
No se pudo convertir com.ms.wfc.data.Connection.addOnConnectComplete
No se pudo convertir com.ms.wfc.data.Connection.addOnDisconnect
No se pudo convertir com.ms.wfc.data.Connection.addOnExecuteComplete
No se pudo convertir com.ms.wfc.data.Connection.addOnInfoMessage
No se pudo convertir com.ms.wfc.data.Connection.addOnRollbackTransComplete
No se pudo convertir com.ms.wfc.data.Connection.addOnWillConnect
No se pudo convertir com.ms.wfc.data.Connection.addOnWillExecute
No se pudo convertir com.ms.wfc.data.Connection.Connection
No se pudo convertir com.ms.wfc.data.Connection.getPeer
No se pudo convertir com.ms.wfc.data.Connection.openSchema
No se pudo convertir com.ms.wfc.data.Connection.removeOnBeginTransComplete
No se pudo convertir com.ms.wfc.data.Connection.removeOnCommitTransComplete
No se pudo convertir com.ms.wfc.data.Connection.removeOnConnectComplete
No se pudo convertir com.ms.wfc.data.Connection.removeOnDisconnect
No se pudo convertir com.ms.wfc.data.Connection.removeOnExecuteComplete
No se pudo convertir com.ms.wfc.data.Connection.removeOnInfoMessage
No se pudo convertir com.ms.wfc.data.Connection.removeOnRollbackTransComplete
No se pudo convertir com.ms.wfc.data.Connection.removeOnWillConnect
No se pudo convertir com.ms.wfc.data.Connection.removeOnWillExecute
No se pudo convertir com.ms.wfc.data.Connection.setConnectionString
No se pudo convertir com.ms.wfc.data.ConnectionEvent
No se pudo convertir com.ms.wfc.data.ConnectionEventHandler
No se pudo convertir com.ms.wfc.data.DataFormat
No se pudo convertir com.ms.wfc.data.DataFormat.FormatWrapper
No se pudo convertir com.ms.wfc.data.DateDataFormat
No se pudo convertir com.ms.wfc.data.DateFormat.valid
No se pudo convertir com.ms.wfc.data.dsl.<NombreClase>.clsid
No se pudo convertir com.ms.wfc.data.dsl.<NombreClase>.iid
No se pudo convertir com.ms.wfc.data.dsl._COAUTHIDENTITY._COAUTHIDENTITY
No se pudo convertir com.ms.wfc.data.dsl._COAUTHINFO._COAUTHINFO
No se pudo convertir com.ms.wfc.data.dsl._COSERVERINFO._COSERVERINFO
No se pudo convertir com.ms.wfc.data.dsl._RemotableHandle._RemotableHandle
No se pudo convertir com.ms.wfc.data.dsl.tagMULTI_QI
No se pudo convertir com.ms.wfc.data.EventHandlerList.clear
No se pudo convertir com.ms.wfc.data.EventHandlerList.getList
No se pudo convertir com.ms.wfc.data.EventsListener
No se pudo convertir com.ms.wfc.data.Field.getDataTimestamp
No se pudo convertir com.ms.wfc.data.Field.getDispatch
No se pudo convertir com.ms.wfc.data.Field.getGuid
No se pudo convertir com.ms.wfc.data.Field.getInt
No se pudo convertir com.ms.wfc.data.Field.getObject
No se pudo convertir com.ms.wfc.data.Field.getTime
No se pudo convertir com.ms.wfc.data.Field.getTimestamp
No se pudo convertir com.ms.wfc.data.Field.setDataDate
No se pudo convertir com.ms.wfc.data.Field.setDispatch
No se pudo convertir com.ms.wfc.data.Field.setGuid
No se pudo convertir com.ms.wfc.data.Field.setTime
No se pudo convertir com.ms.wfc.data.Field.setTimestamp
No se pudo convertir com.ms.wfc.data.IDataFormat
No se pudo convertir com.ms.wfc.data.IDataFormat.Editor
No se pudo convertir com.ms.wfc.data.IDataSource.addDataSourceListener
No se pudo convertir com.ms.wfc.data.IDataSource.getDataMember
No se pudo convertir com.ms.wfc.data.IDataSource.getDataMemberCount
No se pudo convertir com.ms.wfc.data.IDataSource.getDataMemberName
No se pudo convertir com.ms.wfc.data.IDataSource.iid
No se pudo convertir com.ms.wfc.data.IDataSource.removeDataSourceListener
No se pudo convertir com.ms.wfc.data.IDataSourceListener
No se pudo convertir com.ms.wfc.data.IMarshal.iid
No se pudo convertir com.ms.wfc.data.IPersist.iid
No se pudo convertir com.ms.wfc.data.IPersistStream.GetSizeMax
No se pudo convertir com.ms.wfc.data.IpersistStream.iid
No se pudo convertir com.ms.wfc.data.IPersistStream.Load
No se pudo convertir com.ms.wfc.data.NumberDataFormat
No se pudo convertir com.ms.wfc.data.ObjectProxy.call
No se pudo convertir com.ms.wfc.data.rds.<NombreClase>.clsid
No se pudo convertir com.ms.wfc.data.rds.<NombreClase>.iid
No se pudo convertir com.ms.wfc.data.Recordset.addDataSourceListener
No se pudo convertir com.ms.wfc.data.Recordset.addNew
No se pudo convertir com.ms.wfc.data.Recordset.addOnEndOfRecordset
No se pudo convertir com.ms.wfc.data.Recordset.addOnFetchComplete
No se pudo convertir com.ms.wfc.data.Recordset.addOnFetchProgress
No se pudo convertir com.ms.wfc.data.Recordset.addOnFieldChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.addOnMoveComplete
No se pudo convertir com.ms.wfc.data.Recordset.addOnRecordChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.addOnRecordsetChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.addOnWillChangeField
No se pudo convertir com.ms.wfc.data.Recordset.addOnWillChangeRecord
No se pudo convertir com.ms.wfc.data.Recordset.addOnWillChangeRecordset
No se pudo convertir com.ms.wfc.data.Recordset.addOnWillMove
No se pudo convertir com.ms.wfc.data.Recordset.DisconnectObject
No se pudo convertir com.ms.wfc.data.Recordset.GetClassID
No se pudo convertir com.ms.wfc.data.Recordset.getCommand
No se pudo convertir com.ms.wfc.data.Recordset.getDataMember
No se pudo convertir com.ms.wfc.data.Recordset.getDataMemberCount
No se pudo convertir com.ms.wfc.data.Recordset.getDataMemberName
No se pudo convertir com.ms.wfc.data.Recordset.GetMarshalSizeMax
No se pudo convertir com.ms.wfc.data.Recordset.getRecordset
No se pudo convertir com.ms.wfc.data.Recordset.getRows
No se pudo convertir com.ms.wfc.data.Recordset.GetSizeMax
No se pudo convertir com.ms.wfc.data.Recordset.GetUnmarshalClass
No se pudo convertir com.ms.wfc.data.Recordset.IsDirty
No se pudo convertir com.ms.wfc.data.Recordset.Load
No se pudo convertir com.ms.wfc.data.Recordset.MarshalInterface
No se pudo convertir com.ms.wfc.data.Recordset.move
No se pudo convertir com.ms.wfc.data.Recordset.nextRecordset
No se pudo convertir com.ms.wfc.data.Recordset.open
No se pudo convertir com.ms.wfc.data.Recordset.open(Object)
No se pudo convertir com.ms.wfc.data.Recordset.Recordset(IDataSource)
No se pudo convertir com.ms.wfc.data.Recordset.Recordset(IDataSource, String)
No se pudo convertir com.ms.wfc.data.Recordset.Recordset(Object)
No se pudo convertir com.ms.wfc.data.Recordset.release
No se pudo convertir com.ms.wfc.data.Recordset.ReleaseMarshalData
No se pudo convertir com.ms.wfc.data.Recordset.removeDataSourceListener
No se pudo convertir com.ms.wfc.data.Recordset.removeOnEndOfRecordset
No se pudo convertir com.ms.wfc.data.Recordset.removeOnFetchComplete
No se pudo convertir com.ms.wfc.data.Recordset.removeOnFetchProgress
No se pudo convertir com.ms.wfc.data.Recordset.removeOnFieldChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.removeOnMoveComplete
No se pudo convertir com.ms.wfc.data.Recordset.removeOnRecordChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.removeOnRecordsetChangeComplete
No se pudo convertir com.ms.wfc.data.Recordset.removeOnWillChangeField
No se pudo convertir com.ms.wfc.data.Recordset.removeOnWillChangeRecord
No se pudo convertir com.ms.wfc.data.Recordset.removeOnWillChangeRecordset
No se pudo convertir com.ms.wfc.data.Recordset.removeOnWillMove
No se pudo convertir com.ms.wfc.data.Recordset.setCommand
No se pudo convertir com.ms.wfc.data.Recordset.UnmarshalInterface
No se pudo convertir com.ms.wfc.data.RecordsetEvent
No se pudo convertir com.ms.wfc.data.RecordsetEventHandler
No se pudo convertir com.ms.wfc.data.StringManager.getString
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.data.adodb


No se pudo convertir com.ms.wfc.data.adodb.<NombreClase>.clsid
No se pudo convertir com.ms.wfc.data.adodb.<NombreClase>.iid
No se pudo convertir com.ms.wfc.data.adodb._Command.setActiveConnection
No se pudo convertir com.ms.wfc.data.adodb._Connection.setConnectionString
No se pudo convertir com.ms.wfc.data.adodb._Recordset.getCollect
No se pudo convertir com.ms.wfc.data.adodb._Recordset.setCollect
No se pudo convertir com.ms.wfc.data.adodb.Command.setActiveConnection
No se pudo convertir com.ms.wfc.data.adodb.Connection.setConnectionString
No se pudo convertir com.ms.wfc.data.adodb.Recordset.getCollect
No se pudo convertir com.ms.wfc.data.adodb.Recordset.setCollect
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.data.ui


No se pudo convertir com.ms.wfc.data.ui.Column.getAllowSizing
No se pudo convertir com.ms.wfc.data.ui.Column.getBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.getDataFormat
No se pudo convertir com.ms.wfc.data.ui.Column.getDataType
No se pudo convertir com.ms.wfc.data.ui.Column.getFont
No se pudo convertir com.ms.wfc.data.ui.Column.getForeColor
No se pudo convertir com.ms.wfc.data.ui.Column.getSelectedBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.getSelectedForeColor
No se pudo convertir com.ms.wfc.data.ui.Column.getVisible
No se pudo convertir com.ms.wfc.data.ui.Column.getWriteAllowed
No se pudo convertir com.ms.wfc.data.ui.Column.setAlignment
No se pudo convertir com.ms.wfc.data.ui.Column.setAllowSizing
No se pudo convertir com.ms.wfc.data.ui.Column.setBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.setDataFormat
No se pudo convertir com.ms.wfc.data.ui.Column.setFont
No se pudo convertir com.ms.wfc.data.ui.Column.setForeColor
No se pudo convertir com.ms.wfc.data.ui.Column.setIndex
No se pudo convertir com.ms.wfc.data.ui.Column.setSelectedBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.setSelectedForeColor
No se pudo convertir com.ms.wfc.data.ui.Column.setValue
No se pudo convertir com.ms.wfc.data.ui.Column.setVisible
No se pudo convertir com.ms.wfc.data.ui.Column.shouldPersistBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.shouldPersistFont
No se pudo convertir com.ms.wfc.data.ui.Column.shouldPersistForeColor
No se pudo convertir com.ms.wfc.data.ui.Column.shouldPersistSelectedBackColor
No se pudo convertir com.ms.wfc.data.ui.Column.shouldPersistSelectedForeColor
No se pudo convertir com.ms.wfc.data.ui.ColumnEditingEvent
No se pudo convertir com.ms.wfc.data.ui.ColumnEditingEventHandler
No se pudo convertir com.ms.wfc.data.ui.ColumnEvent
No se pudo convertir com.ms.wfc.data.ui.ColumnEventHandler
No se pudo convertir com.ms.wfc.data.ui.ColumnResizeEvent
No se pudo convertir com.ms.wfc.data.ui.ColumnResizeEventHandler
No se pudo convertir com.ms.wfc.data.ui.ColumnsEditor
No se pudo convertir com.ms.wfc.data.ui.ColumnsEditorDialog
No se pudo convertir com.ms.wfc.data.ui.ColumnUpdatingEvent
No se pudo convertir com.ms.wfc.data.ui.ColumnUpdatingEventHandler
No se pudo convertir com.ms.wfc.data.ui.ConnectionStringEditor
No se pudo convertir com.ms.wfc.data.ui.DataBinder
No se pudo convertir com.ms.wfc.data.ui.DataBinder.Customizer
No se pudo convertir com.ms.wfc.data.ui.DataBinder.GeneralPage
No se pudo convertir com.ms.wfc.data.ui.DataBinding.bindTarget
No se pudo convertir com.ms.wfc.data.ui.DataBinding.CallbackType
No se pudo convertir com.ms.wfc.data.ui.DataBinding.commitChange
No se pudo convertir com.ms.wfc.data.ui.DataBinding.DataBinding
No se pudo convertir com.ms.wfc.data.ui.DataBinding.FalseArgument
No se pudo convertir com.ms.wfc.data.ui.DataBinding.getConstructorArgs
No se pudo convertir com.ms.wfc.data.ui.DataBinding.getDataFormat
No se pudo convertir com.ms.wfc.data.ui.DataBinding.getFieldName
No se pudo convertir com.ms.wfc.data.ui.DataBinding.getPropertyValue
No se pudo convertir com.ms.wfc.data.ui.DataBinding.getTarget
No se pudo convertir com.ms.wfc.data.ui.DataBinding.m_propertyChange
No se pudo convertir com.ms.wfc.data.ui.DataBinding.onChanged
No se pudo convertir com.ms.wfc.data.ui.DataBinding.onChanging
No se pudo convertir com.ms.wfc.data.ui.DataBinding.onTargetDispose
No se pudo convertir com.ms.wfc.data.ui.DataBinding.propertyChange
No se pudo convertir com.ms.wfc.data.ui.DataBinding.refreshPropertyValue
No se pudo convertir com.ms.wfc.data.ui.DataBinding.setDataFormat
No se pudo convertir com.ms.wfc.data.ui.DataBinding.setFieldName
No se pudo convertir com.ms.wfc.data.ui.DataBinding.setPropertyValue
No se pudo convertir com.ms.wfc.data.ui.DataBinding.setTarget
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addColumn
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnColumnEdited
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnColumnEditing
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnColumnResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnColumnUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnColumnUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnDeleted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnDeleting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnError
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnHeaderClick
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnInserted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnInserting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnPositionChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnRowResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnScroll
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnSelChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.addOnUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.Customizer
No se pudo convertir com.ms.wfc.data.ui.DataGrid.DataGrid
No se pudo convertir com.ms.wfc.data.ui.DataGrid.DataGridErrorDialog
No se pudo convertir com.ms.wfc.data.ui.DataGrid.fireErrorEvent
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getAllowAddNew
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getAllowArrows
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getAllowDelete
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getAllowRowSizing
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getAllowUpdate
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getCurrentRow
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getCurrentRowModified
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getDisplayIndex
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getDynamicColumns
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getEnterAction
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getFirstRow
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getHeaderLineCount
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getRowHeight
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getScrollbars
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getSelectedColumns
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getSelectedRows
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getShowPhantom
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getTabAction
No se pudo convertir com.ms.wfc.data.ui.DataGrid.getWrapCellPointer
No se pudo convertir com.ms.wfc.data.ui.DataGrid.makeCurrentCellVisible
No se pudo convertir com.ms.wfc.data.ui.DataGrid.MIN_COLUMN_WIDTH
No se pudo convertir com.ms.wfc.data.ui.DataGrid.MIN_ROW_HEIGHT
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onColumnEdited
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onColumnEditing
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onColumnResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onColumnUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onColumnUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onDeleted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onDeleting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onError
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onHeaderClick
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onInserted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onInserting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onPositionChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onRowResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onScroll
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onSelChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.onUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.rebind
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnColumnEdited
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnColumnEditing
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnColumnResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnColumnUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnColumnUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnDeleted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnDeleting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnError
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnHeaderClick
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnInserted
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnInserting
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnPositionChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnRowResize
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnScroll
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnSelChange
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnUpdated
No se pudo convertir com.ms.wfc.data.ui.DataGrid.removeOnUpdating
No se pudo convertir com.ms.wfc.data.ui.DataGrid.rowBookmark
No se pudo convertir com.ms.wfc.data.ui.DataGrid.rowTop
No se pudo convertir com.ms.wfc.data.ui.DataGrid.scroll
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setAllowAddNew
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setAllowArrows
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setAllowDelete
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setAllowRowSizing
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setAllowUpdate
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setCurrentRow
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setDynamicColumns
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setEnterAction
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setFirstRow
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setHeaderLineCount
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setLeftColumn
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setRowHeight
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setScrollbars
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setSelectedColumns
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setSelectedRows
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setTabAction
No se pudo convertir com.ms.wfc.data.ui.DataGrid.setWrapCellPointer
No se pudo convertir com.ms.wfc.data.ui.DataMemberEditor
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.Customizer
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.getDataMember
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.moveFirst
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.moveLast
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.moveNext
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.movePrevious
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.propertyChanged
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.setDataMember
No se pudo convertir com.ms.wfc.data.ui.DataNavigator.setDataSource
No se pudo convertir com.ms.wfc.data.ui.DataSource.addDataSourceListener
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnBeginTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnCommitTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnConnectComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnDisconnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnEndOfRecordset
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnExecuteComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnFetchComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnFetchProgress
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnFieldChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnInfoMessage
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnMoveComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnRecordChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnRecordsetChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnRollbackTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillChangeField
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillChangeRecord
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillChangeRecordset
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillConnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillExecute
No se pudo convertir com.ms.wfc.data.ui.DataSource.addOnWillMove
No se pudo convertir com.ms.wfc.data.ui.DataSource.dataMemberAdded
No se pudo convertir com.ms.wfc.data.ui.DataSource.dataMemberChanged
No se pudo convertir com.ms.wfc.data.ui.DataSource.dataMemberRemoved
No se pudo convertir com.ms.wfc.data.ui.DataSource.DataSource
No se pudo convertir com.ms.wfc.data.ui.DataSource.getAsyncConnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.getAsyncExecute
No se pudo convertir com.ms.wfc.data.ui.DataSource.getAsyncFetch
No se pudo convertir com.ms.wfc.data.ui.DataSource.getCacheSize
No se pudo convertir com.ms.wfc.data.ui.DataSource.getCursorLocation
No se pudo convertir com.ms.wfc.data.ui.DataSource.getCursorType
No se pudo convertir com.ms.wfc.data.ui.DataSource.getDataMember
No se pudo convertir com.ms.wfc.data.ui.DataSource.getDataMemberCount
No se pudo convertir com.ms.wfc.data.ui.DataSource.getDataMemberName
No se pudo convertir com.ms.wfc.data.ui.DataSource.getDesignTimeData
No se pudo convertir com.ms.wfc.data.ui.DataSource.getIsolationLevel
No se pudo convertir com.ms.wfc.data.ui.DataSource.getLockType
No se pudo convertir com.ms.wfc.data.ui.DataSource.getMaxRecords
No se pudo convertir com.ms.wfc.data.ui.DataSource.getMode
No se pudo convertir com.ms.wfc.data.ui.DataSource.getParentDataSource
No se pudo convertir com.ms.wfc.data.ui.DataSource.getParentFieldName
No se pudo convertir com.ms.wfc.data.ui.DataSource.getPassword
No se pudo convertir com.ms.wfc.data.ui.DataSource.getPrepared
No se pudo convertir com.ms.wfc.data.ui.DataSource.getRecordset
No se pudo convertir com.ms.wfc.data.ui.DataSource.getSort
No se pudo convertir com.ms.wfc.data.ui.DataSource.getStayInSync
No se pudo convertir com.ms.wfc.data.ui.DataSource.getUserId
No se pudo convertir com.ms.wfc.data.ui.DataSource.isChildDataSource
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeDataSourceListener
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnBeginTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnCommitTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnConnectComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnDisconnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnEndOfRecordset
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnExecuteComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnFetchComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnFetchProgress
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnFieldChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnInfoMessage
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnMoveComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnRecordChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnRecordsetChangeComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnRollbackTransComplete
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillChangeField
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillChangeRecord
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillChangeRecordset
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillConnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillExecute
No se pudo convertir com.ms.wfc.data.ui.DataSource.removeOnWillMove
No se pudo convertir com.ms.wfc.data.ui.DataSource.setAsyncConnect
No se pudo convertir com.ms.wfc.data.ui.DataSource.setAsyncExecute
No se pudo convertir com.ms.wfc.data.ui.DataSource.setAsyncFetch
No se pudo convertir com.ms.wfc.data.ui.DataSource.setCacheSize
No se pudo convertir com.ms.wfc.data.ui.DataSource.setConnectionString
No se pudo convertir com.ms.wfc.data.ui.DataSource.setConnectionTimeout
No se pudo convertir com.ms.wfc.data.ui.DataSource.setCursorLocation
No se pudo convertir com.ms.wfc.data.ui.DataSource.setCursorType
No se pudo convertir com.ms.wfc.data.ui.DataSource.setDesignTimeData
No se pudo convertir com.ms.wfc.data.ui.DataSource.setFilter
No se pudo convertir com.ms.wfc.data.ui.DataSource.setIsolationLevel
No se pudo convertir com.ms.wfc.data.ui.DataSource.setLockType
No se pudo convertir com.ms.wfc.data.ui.DataSource.setMaxRecords
No se pudo convertir com.ms.wfc.data.ui.DataSource.setMode
No se pudo convertir com.ms.wfc.data.ui.DataSource.setParentDataSource
No se pudo convertir com.ms.wfc.data.ui.DataSource.setParentFieldName
No se pudo convertir com.ms.wfc.data.ui.DataSource.setPassword
No se pudo convertir com.ms.wfc.data.ui.DataSource.setPrepared
No se pudo convertir com.ms.wfc.data.ui.DataSource.setSort
No se pudo convertir com.ms.wfc.data.ui.DataSource.setStayInSync
No se pudo convertir com.ms.wfc.data.ui.DataSource.setUserId
No se pudo convertir com.ms.wfc.data.ui.DataSource.unrealize
No se pudo convertir com.ms.wfc.data.ui.EnterAction
No se pudo convertir com.ms.wfc.data.ui.ErrorEvent
No se pudo convertir com.ms.wfc.data.ui.ErrorEventHandler
No se pudo convertir com.ms.wfc.data.ui.FieldNameEditor
No se pudo convertir com.ms.wfc.data.ui.GridLineStyle.GridLineStyle
No se pudo convertir com.ms.wfc.data.ui.GridLineStyle.RAISED3D
No se pudo convertir com.ms.wfc.data.ui.GridLineStyle.SUNKEN3D
No se pudo convertir com.ms.wfc.data.ui.PositionChangeEvent.lastColumn
No se pudo convertir com.ms.wfc.data.ui.PositionChangeEvent.lastRow
No se pudo convertir com.ms.wfc.data.ui.PositionChangeEvent.PositionChangeEvent
No se pudo convertir com.ms.wfc.data.ui.PositionChangeEventHandler.PositionChangeEventHandler
No se pudo convertir com.ms.wfc.data.ui.PropertyNameEditor
No se pudo convertir com.ms.wfc.data.ui.RecordsetProvider
No se pudo convertir com.ms.wfc.data.ui.TabAction
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.io


No se pudo convertir com.ms.wfc.io.BufferedStream.getStream
No se pudo convertir com.ms.wfc.io.BufferedStream.readCore
No se pudo convertir com.ms.wfc.io.BufferedStream.readStringCharsAnsi
No se pudo convertir com.ms.wfc.io.BufferedStream.readStringNull
No se pudo convertir com.ms.wfc.io.BufferedStream.readStringNullAnsi
No se pudo convertir com.ms.wfc.io.BufferedStream.writeCore
No se pudo convertir com.ms.wfc.io.CodePage.ANSI
No se pudo convertir com.ms.wfc.io.CodePage.CodePage
No se pudo convertir com.ms.wfc.io.CodePage.MAC
No se pudo convertir com.ms.wfc.io.CodePage.OEM
No se pudo convertir com.ms.wfc.io.DataStream.comStream
No se pudo convertir com.ms.wfc.io.DataStream.DataStream
No se pudo convertir com.ms.wfc.io.DataStream.fromComStream
No se pudo convertir com.ms.wfc.io.DataStream.getComStream
No se pudo convertir com.ms.wfc.io.DataStream.readCore
No se pudo convertir com.ms.wfc.io.DataStream.readStringNull
No se pudo convertir com.ms.wfc.io.DataStream.readStringNullAnsi
No se pudo convertir com.ms.wfc.io.DataStream.readUTF
No se pudo convertir com.ms.wfc.io.DataStream.toComStream
No se pudo convertir com.ms.wfc.io.DataStream.writeCore
No se pudo convertir com.ms.wfc.io.DataStream.writeStringChars
No se pudo convertir com.ms.wfc.io.DataStream.writeStringCharsAnsi
No se pudo convertir com.ms.wfc.io.DataStream.writeStringNull
No se pudo convertir com.ms.wfc.io.DataStream.writeStringNullAnsi
No se pudo convertir com.ms.wfc.io.DataStream.writeUTF
No se pudo convertir com.ms.wfc.io.DataStreamFromComStream
No se pudo convertir com.ms.wfc.io.File.createDirectory
No se pudo convertir com.ms.wfc.io.File.File
No se pudo convertir com.ms.wfc.io.File.getDirectory
No se pudo convertir com.ms.wfc.io.File.getFiles
No se pudo convertir com.ms.wfc.io.File.getName
No se pudo convertir com.ms.wfc.io.File.handle
No se pudo convertir com.ms.wfc.io.File.openStandardError
No se pudo convertir com.ms.wfc.io.File.openStandardInput
No se pudo convertir com.ms.wfc.io.File.openStandardOutput
No se pudo convertir com.ms.wfc.io.File.readCore
No se pudo convertir com.ms.wfc.io.File.writeCore
No se pudo convertir com.ms.wfc.io.FileEnumerator.close
No se pudo convertir com.ms.wfc.io.FileEnumerator.FileEnumerator
No se pudo convertir com.ms.wfc.io.FileEnumerator.finalize
No se pudo convertir com.ms.wfc.io.FileEnumerator.getAttributes
No se pudo convertir com.ms.wfc.io.IDataStream.getComStream
No se pudo convertir com.ms.wfc.io.FileEnumerator.getSize
No se pudo convertir com.ms.wfc.io.IDataStream.readStringNull
No se pudo convertir com.ms.wfc.io.IDataStream.readStringNullAnsi
No se pudo convertir com.ms.wfc.io.IDataStream.readUTF
No se pudo convertir com.ms.wfc.io.IDataStream.writeStringChars
No se pudo convertir com.ms.wfc.io.IDataStream.writeStringCharsAnsi
No se pudo convertir com.ms.wfc.io.IDataStream.writeStringNull
No se pudo convertir com.ms.wfc.io.IDataStream.writeStringNullAnsi
No se pudo convertir com.ms.wfc.io.IDataStream.writeUTF
No se pudo convertir com.ms.wfc.io.IDataStreamProvider
No se pudo convertir com.ms.wfc.io.MemoryStream.MemoryStream
No se pudo convertir com.ms.wfc.io.MemoryStream.readCore
No se pudo convertir com.ms.wfc.io.MemoryStream.readStringCharsAnsi
No se pudo convertir com.ms.wfc.io.MemoryStream.readStringNull
No se pudo convertir com.ms.wfc.io.MemoryStream.readStringNullAnsi
No se pudo convertir com.ms.wfc.io.MemoryStream.writeCore
No se pudo convertir com.ms.wfc.io.MemoryStream.writeTo
No se pudo convertir com.ms.wfc.io.Reader.Reader
No se pudo convertir com.ms.wfc.io.TextReader.TextReader(ByteStream)
No se pudo convertir com.ms.wfc.io.TextReader.TextReader(ByteStream, int)
No se pudo convertir com.ms.wfc.io.TextReader.TextReader(ByteStream, int, int)
No se pudo convertir com.ms.wfc.io.WinIOException.getErrorCode
No se pudo convertir com.ms.wfc.io.WinIOException.WinIOException
No se pudo convertir com.ms.wfc.io.Writer.Writer
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.ole32


No se pudo convertir com.ms.wfc.ole32.DBBINDING.pTypeInfo
No se pudo convertir com.ms.wfc.ole32.DBCOLUMNINFO.pTypeInfo
No se pudo convertir com.ms.wfc.ole32.IEnumFORMATETC.iid
No se pudo convertir com.ms.wfc.ole32.IEnumSTATDATA.iid
No se pudo convertir com.ms.wfc.ole32.ILockBytes.iid
No se pudo convertir com.ms.wfc.ole32.IMalloc.iid
No se pudo convertir com.ms.wfc.ole32.IOleDataFormat.iid
No se pudo convertir com.ms.wfc.ole32.IOleDataObject.iid
No se pudo convertir com.ms.wfc.ole32.IOleDataObjectWithIStream.iid
No se pudo convertir com.ms.wfc.ole32.IOleDropSource.iid
No se pudo convertir com.ms.wfc.ole32.IOleDropTarget.iid
No se pudo convertir com.ms.wfc.ole32.IPersist.iid
No se pudo convertir com.ms.wfc.ole32.IPersistStream.iid
No se pudo convertir com.ms.wfc.ole32.IPicture.iid
No se pudo convertir com.ms.wfc.ole32.IStorage.iid
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.ui


No se pudo convertir com.ms.wfc.ui.AnchorEditor.editValue
No se pudo convertir com.ms.wfc.ui.AnchorEditor.getConstantName
No se pudo convertir com.ms.wfc.ui.AnchorEditor.getTextFromValue
No se pudo convertir com.ms.wfc.ui.Animation
No se pudo convertir com.ms.wfc.ui.AnimationFileNameEditor
No se pudo convertir com.ms.wfc.ui.AutoSizeEvent
No se pudo convertir com.ms.wfc.ui.AutoSizeEventHandler
No se pudo convertir com.ms.wfc.ui.AxHost.AboutBoxDelegate
No se pudo convertir com.ms.wfc.ui.AxHost.AxPropertyInfo
No se pudo convertir com.ms.wfc.ui.AxHost.begin
No se pudo convertir com.ms.wfc.ui.AxHost.DispidAttribute
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnClick
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnDblClick
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnKeyDown
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnKeyPress
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnKeyUp
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnMouseDown
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnMouseMove
No se pudo convertir com.ms.wfc.ui.AxHost.fireOnMouseUp
No se pudo convertir com.ms.wfc.ui.AxHost.Flags
No se pudo convertir com.ms.wfc.ui.AxHost.getAmbientProperty
No se pudo convertir com.ms.wfc.ui.AxHost.getClientAttributes
No se pudo convertir com.ms.wfc.ui.AxHost.getColorFromOleColor
No se pudo convertir com.ms.wfc.ui.AxHost.getFontFromIFont
No se pudo convertir com.ms.wfc.ui.AxHost.getFontFromIFontDisp
No se pudo convertir com.ms.wfc.ui.AxHost.getIFontDispFromFont
No se pudo convertir com.ms.wfc.ui.AxHost.getIFontFromFont
No se pudo convertir com.ms.wfc.ui.AxHost.getIPictureDispFromPicture
No se pudo convertir com.ms.wfc.ui.AxHost.getIPictureFromPicture
No se pudo convertir com.ms.wfc.ui.AxHost.getOleColorFromColor
No se pudo convertir com.ms.wfc.ui.AxHost.getPictureFromIPicture
No se pudo convertir com.ms.wfc.ui.AxHost.getPictureFromIPictureDisp
No se pudo convertir com.ms.wfc.ui.AxHost.propertyChanged
No se pudo convertir com.ms.wfc.ui.AxHost.setAboutBoxDelegate
No se pudo convertir com.ms.wfc.ui.AxHost.setTopLevel
No se pudo convertir com.ms.wfc.ui.AxHost.shouldPersistContainingForm
No se pudo convertir com.ms.wfc.ui.AxHost.State.save
No se pudo convertir com.ms.wfc.ui.AxHost.State.State
No se pudo convertir com.ms.wfc.ui.AxPersist
No se pudo convertir com.ms.wfc.ui.Bitmap.Bitmap
No se puede convertir com.ms.wfc.ui.Bitmap.Bitmap(Bitmap, Bitmap)
No se puede convertir com.ms.wfc.ui.Bitmap.Bitmap(int)
No se puede convertir com.ms.wfc.ui.Bitmap.Bitmap(int, int, int, int, short[])
No se puede convertir com.ms.wfc.ui.Bitmap.Bitmap(IPicture)
No se puede convertir com.ms.wfc.ui.Bitmap.Bitmap(Palette)
No se pudo convertir com.ms.wfc.ui.Bitmap.copyHandle
No se pudo convertir com.ms.wfc.ui.Bitmap.destroyHandle
No se pudo convertir com.ms.wfc.ui.Bitmap.drawStretchTo
No se pudo convertir com.ms.wfc.ui.Bitmap.drawTo
No se pudo convertir com.ms.wfc.ui.Bitmap.getColorMask
No se pudo convertir com.ms.wfc.ui.Bitmap.getGraphics
No se pudo convertir com.ms.wfc.ui.Bitmap.getHandle
No se pudo convertir com.ms.wfc.ui.Bitmap.getMonochromeMask
No se pudo convertir com.ms.wfc.ui.Bitmap.getPICTDESC
No se pudo convertir com.ms.wfc.ui.Bitmap.getTransparent
No se pudo convertir com.ms.wfc.ui.Bitmap.getTransparentColor
No se pudo convertir com.ms.wfc.ui.Bitmap.initialize
No se puede convertir com.ms.wfc.ui.Brush.Brush(Bitmap)
No se puede convertir com.ms.wfc.ui.Brush.Brush(int)
No se pudo convertir com.ms.wfc.ui.Brush.copyHandle
No se pudo convertir com.ms.wfc.ui.Brush.destroyHandle
No se pudo convertir com.ms.wfc.ui.Brush.getHandle
No se pudo convertir com.ms.wfc.ui.Brush.HALFTONE
No se pudo convertir com.ms.wfc.ui.BrushStyle.HOLLOW
No se pudo convertir com.ms.wfc.ui.BrushStyle.PATTERN
No se pudo convertir com.ms.wfc.ui.Button.propertyChanged
No se pudo convertir com.ms.wfc.ui.CheckBox.getGroupValue
No se pudo convertir com.ms.wfc.ui.CheckBox.setGroupValue
No se pudo convertir com.ms.wfc.ui.CheckBox.setTextAlign
No se pudo convertir com.ms.wfc.ui.CheckedListBox.propertyChanged
No se pudo convertir com.ms.wfc.ui.Color.Color
No se pudo convertir com.ms.wfc.ui.Color.Editor.ColorPicker
No se pudo convertir com.ms.wfc.ui.Color.Editor.ColorPicker.Palette
No se pudo convertir com.ms.wfc.ui.Color.Editor.ColorPicker.Palette.CustomColorDialog
No se pudo convertir com.ms.wfc.ui.Color.fromCMYK
No se pudo convertir com.ms.wfc.ui.Color.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.Color.toString
No se pudo convertir com.ms.wfc.ui.ColumnClickEventHandler.ColumnClickEventHandler
No se pudo convertir com.ms.wfc.ui.ComboBox.propertyChanged
No se pudo convertir com.ms.wfc.ui.ContentAlignment.toTextFormat
No se pudo convertir com.ms.wfc.ui.Control.getTopLevel
No se pudo convertir com.ms.wfc.ui.Control.getVisible
No se pudo convertir com.ms.wfc.ui.Control.invokeAsync
No se pudo convertir com.ms.wfc.ui.Control.PROP_BACKCOLOR
No se pudo convertir com.ms.wfc.ui.Control.PROP_CURSOR
No se pudo convertir com.ms.wfc.ui.Control.PROP_ENABLED
No se pudo convertir com.ms.wfc.ui.Control.PROP_FONT
No se pudo convertir com.ms.wfc.ui.Control.PROP_FORECOLOR
No se pudo convertir com.ms.wfc.ui.Control.PROP_LOCATION
No se pudo convertir com.ms.wfc.ui.Control.PROP_PARENTBACKCOLOR
No se pudo convertir com.ms.wfc.ui.Control.PROP_PARENTFONT
No se pudo convertir com.ms.wfc.ui.Control.PROP_PARENTFORECOLOR
No se pudo convertir com.ms.wfc.ui.Control.PROP_SIZE
No se pudo convertir com.ms.wfc.ui.Control.PROP_TEXT
No se pudo convertir com.ms.wfc.ui.Control.PROP_VISIBLE
No se pudo convertir com.ms.wfc.ui.Control.propertyChanged
No se pudo convertir com.ms.wfc.ui.Control.sendMessage
No se pudo convertir com.ms.wfc.ui.Control.setTabIndex
No se pudo convertir com.ms.wfc.ui.Control.setTopLevel
No se pudo convertir com.ms.wfc.ui.Control.STYLE_ACCEPTSCHILDREN
No se pudo convertir com.ms.wfc.ui.CoordinateSystem
No se pudo convertir com.ms.wfc.ui.Cursor.Cursor
No se pudo convertir com.ms.wfc.ui.Cursor.destroyHandle
No se pudo convertir com.ms.wfc.ui.Cursor.getPICTDESC
No se pudo convertir com.ms.wfc.ui.Cursor.initialize
No se pudo convertir com.ms.wfc.ui.DateBoldEventHandler.DateBoldEventHandler
No se pudo convertir com.ms.wfc.ui.DateRangeEventHandler.DateRangeEventHandler
No se pudo convertir com.ms.wfc.ui.DateTimeFormatEvent
No se pudo convertir com.ms.wfc.ui.DateTimeFormatEventHandler
No se pudo convertir com.ms.wfc.ui.DateTimeFormatQueryEvent
No se pudo convertir com.ms.wfc.ui.DateTimeFormatQueryEventHandler
No se pudo convertir com.ms.wfc.ui.DateTimePicker.addOnFormat
No se pudo convertir com.ms.wfc.ui.DateTimePicker.addOnFormatQuery
No se pudo convertir com.ms.wfc.ui.DateTimePicker.addOnUserString
No se pudo convertir com.ms.wfc.ui.DateTimePicker.getAllowUserString
No se pudo convertir com.ms.wfc.ui.DateTimePicker.getMaxDate
No se pudo convertir com.ms.wfc.ui.DateTimePicker.getMinDate
No se pudo convertir com.ms.wfc.ui.DateTimePicker.onFormat
No se pudo convertir com.ms.wfc.ui.DateTimePicker.onFormatQuery
No se pudo convertir com.ms.wfc.ui.DateTimePicker.onUserString
No se pudo convertir com.ms.wfc.ui.DateTimePicker.removeOnFormat
No se pudo convertir com.ms.wfc.ui.DateTimePicker.removeOnFormatQuery
No se pudo convertir com.ms.wfc.ui.DateTimePicker.removeOnUserString
No se pudo convertir com.ms.wfc.ui.DateTimePicker.setAllowUserString
No se pudo convertir com.ms.wfc.ui.DateTimeUserStringEvent
No se pudo convertir com.ms.wfc.ui.DateTimeUserStringEventHandler
No se pudo convertir com.ms.wfc.ui.DateTimeWmKeyDownEvent.DateTimeWmKeyDownEvent
No se pudo convertir com.ms.wfc.ui.DateTimeWmKeyDownEvent.format
No se pudo convertir com.ms.wfc.ui.DateTimeWmKeyDownEvent.time
com.ms.wfc.ui.DateTimeWmKeyDownEventHandler.DateTimeWmKeyDownEventHandler No se pudo convertir
No se pudo convertir com.ms.wfc.ui.Dimensions.Editor
No se pudo convertir com.ms.wfc.ui.Dimensions.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.Dimensions.save
No se pudo convertir com.ms.wfc.ui.DockEditor.editValue
No se pudo convertir com.ms.wfc.ui.DockEditor.getConstantName
No se pudo convertir com.ms.wfc.ui.DockEditor.getTextFromValue
No se pudo convertir com.ms.wfc.ui.DocumentReadyEvent
No se pudo convertir com.ms.wfc.ui.DocumentReadyEventHandler
No se pudo convertir com.ms.wfc.ui.DocumentReadyEventHandler.DocumentReadyEventHandler
No se pudo convertir com.ms.wfc.ui.DragEventHandler.DragEventHandler
No se pudo convertir com.ms.wfc.ui.DrawItemEventHandler.DrawItemEventHandler
No se pudo convertir com.ms.wfc.ui.Edit.propertyChanged
No se pudo convertir com.ms.wfc.ui.Edit.setTextAlign
No se pudo convertir com.ms.wfc.ui.Edit.undo
No se pudo convertir com.ms.wfc.ui.Editor.createExtensionsString
No se pudo convertir com.ms.wfc.ui.Editor.createFilterEntry
No se pudo convertir com.ms.wfc.ui.Editor.getExtensions
No se pudo convertir com.ms.wfc.ui.Editor.getFileDialogDescription
No se pudo convertir com.ms.wfc.ui.Editor.loadFromStream
No se pudo convertir com.ms.wfc.ui.EraseBackgroundEvent
No se pudo convertir com.ms.wfc.ui.FileDialog.promptFileCreate
No se pudo convertir com.ms.wfc.ui.FileDialog.promptFileNotFound
No se pudo convertir com.ms.wfc.ui.FileDialog.promptFileOverwrite
No se pudo convertir com.ms.wfc.ui.FloodFillType
No se pudo convertir com.ms.wfc.ui.Font.ANSI_VAR
No se pudo convertir com.ms.wfc.ui.Font.destroyHandle
No se pudo convertir com.ms.wfc.ui.Font.DEVICE_DEFAULT
No se pudo convertir com.ms.wfc.ui.Font.equalsBase
No se pudo convertir com.ms.wfc.ui.Font.Font
No se pudo convertir com.ms.wfc.ui.Font.getCharacterSet
No se pudo convertir com.ms.wfc.ui.Font.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.Font.getFamily
No se pudo convertir com.ms.wfc.ui.Font.getFontMetrics
No se pudo convertir com.ms.wfc.ui.Font.getOrientation
No se pudo convertir com.ms.wfc.ui.Font.getPitch
No se pudo convertir com.ms.wfc.ui.Font.getStock
No se pudo convertir com.ms.wfc.ui.Font.OEM_FIXED
No se pudo convertir com.ms.wfc.ui.Font.save
No se pudo convertir com.ms.wfc.ui.Font.SYSTEM
No se pudo convertir com.ms.wfc.ui.Font.SYSTEM_FIXED
No se pudo convertir com.ms.wfc.ui.FontDescriptor
No se pudo convertir com.ms.wfc.ui.FontDevice
No se pudo convertir com.ms.wfc.ui.FontDialog.getFontDevice
No se pudo convertir com.ms.wfc.ui.FontDialog.getPrinterDC
No se pudo convertir com.ms.wfc.ui.FontDialog.getScalableOnly
No se pudo convertir com.ms.wfc.ui.FontDialog.getTrueTypeOnly
No se pudo convertir com.ms.wfc.ui.FontDialog.getWysiwyg
No se pudo convertir com.ms.wfc.ui.FontDialog.hookProc
No se pudo convertir com.ms.wfc.ui.FontDialog.setFontDevice
No se pudo convertir com.ms.wfc.ui.FontDialog.setPrinterDC
No se pudo convertir com.ms.wfc.ui.FontDialog.setScalableOnly
No se pudo convertir com.ms.wfc.ui.FontDialog.setTrueTypeOnly
No se pudo convertir com.ms.wfc.ui.FontDialog.setWysiwyg
No se pudo convertir com.ms.wfc.ui.FontFamily
No se pudo convertir com.ms.wfc.ui.FontMetrics
No se pudo convertir com.ms.wfc.ui.FontMetrics.ascent
No se pudo convertir com.ms.wfc.ui.FontMetrics.charSet
No se pudo convertir com.ms.wfc.ui.FontMetrics.descent
No se pudo convertir com.ms.wfc.ui.FontMetrics.FontMetrics
No se pudo convertir com.ms.wfc.ui.FontMetrics.height
No se pudo convertir com.ms.wfc.ui.FontPitch
No se pudo convertir com.ms.wfc.ui.FontSize.CELLHEIGHT
No se pudo convertir com.ms.wfc.ui.FontSize.CENTIMETERS
No se pudo convertir com.ms.wfc.ui.FontSize.CHARACTERHEIGHT
No se pudo convertir com.ms.wfc.ui.FontSize.EM
No se pudo convertir com.ms.wfc.ui.FontSize.EX
No se pudo convertir com.ms.wfc.ui.FontType
No se pudo convertir com.ms.wfc.ui.FontWeight.EXTRALIGHT
No se pudo convertir com.ms.wfc.ui.FontWeight.LIGHT
No se pudo convertir com.ms.wfc.ui.FontWeight.THIN
No se pudo convertir com.ms.wfc.ui.Form.checkCloseDialog
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_AUTOSCALING
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_AUTOSCROLLING
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_BORDERSTYLE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_CONTROLBOX
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_HELPBUTTON
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_HSCROLLVISIBLE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_KEYPREVIEW
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_MAXIMIZEBOX
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_MINIMIZEBOX
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_PALETTEMODE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_SETCLIENTSIZE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_SHOWWINDOWONCREATE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_STARTPOS
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_TASKBAR
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_TOPMOST
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_USERHASSCROLLED
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_VSCROLLVISIBLE
No se pudo convertir com.ms.wfc.ui.Form.FORMSTATE_WINDOWSTATE
No se pudo convertir com.ms.wfc.ui.Form.getFormState
No se pudo convertir com.ms.wfc.ui.Form.getPalette
No se pudo convertir com.ms.wfc.ui.Form.getPaletteMode
No se pudo convertir com.ms.wfc.ui.Form.getPaletteSource
No se pudo convertir com.ms.wfc.ui.Form.hasFormState
No se pudo convertir com.ms.wfc.ui.Form.notifyPaletteChange
No se pudo convertir com.ms.wfc.ui.Form.onMDIChildActivate
No se pudo convertir com.ms.wfc.ui.Form.onNewPalette
No se pudo convertir com.ms.wfc.ui.Form.propertyChanged
No se pudo convertir com.ms.wfc.ui.Form.setAutoScaleBaseSize
No se pudo convertir com.ms.wfc.ui.Form.setBorderStyle
No se pudo convertir com.ms.wfc.ui.Form.setControlBox
No se pudo convertir com.ms.wfc.ui.Form.setFormState
No se pudo convertir com.ms.wfc.ui.Form.setMaximizeBox
No se pudo convertir com.ms.wfc.ui.Form.setMinimizeBox
No se pudo convertir com.ms.wfc.ui.Form.setNewControls
No se pudo convertir com.ms.wfc.ui.Form.setPaletteMode
No se pudo convertir com.ms.wfc.ui.Form.setPaletteSource
No se pudo convertir com.ms.wfc.ui.Form.setShowInTaskbar
No se pudo convertir com.ms.wfc.ui.Form.setStartPosition
No se pudo convertir com.ms.wfc.ui.FormPaletteMode
No se pudo convertir com.ms.wfc.ui.GiveFeedbackEventHandler.GiveFeedbackEventHandler
No se pudo convertir com.ms.wfc.ui.Graphics.drawArc
No se pudo convertir com.ms.wfc.ui.Graphics.drawChord
No se pudo convertir com.ms.wfc.ui.Graphics.drawPie
No se pudo convertir com.ms.wfc.ui.Graphics.drawString
No se pudo convertir com.ms.wfc.ui.Graphics.floodFill
No se pudo convertir com.ms.wfc.ui.Graphics.getCoordinateSystem
No se pudo convertir com.ms.wfc.ui.Graphics.getDeviceOrigin
No se pudo convertir com.ms.wfc.ui.Graphics.getDevicePoint
No se pudo convertir com.ms.wfc.ui.Graphics.getDeviceScale
No se pudo convertir com.ms.wfc.ui.Graphics.getFontDescriptors
No se pudo convertir com.ms.wfc.ui.Graphics.getHandle
No se pudo convertir com.ms.wfc.ui.Graphics.getLogicalPoint
No se pudo convertir com.ms.wfc.ui.Graphics.getLogicalSizeX
No se pudo convertir com.ms.wfc.ui.Graphics.getLogicalSizeY
No se pudo convertir com.ms.wfc.ui.Graphics.getOpaque
No se pudo convertir com.ms.wfc.ui.Graphics.getPageOrigin
No se pudo convertir com.ms.wfc.ui.Graphics.getPageScale
No se pudo convertir com.ms.wfc.ui.Graphics.getPhysicalSizeX
No se pudo convertir com.ms.wfc.ui.Graphics.getPhysicalSizeY
No se pudo convertir com.ms.wfc.ui.Graphics.getPixel
No se pudo convertir com.ms.wfc.ui.Graphics.getTextSize
No se pudo convertir com.ms.wfc.ui.Graphics.getTextSpace
No se pudo convertir com.ms.wfc.ui.Graphics.Graphics
No se pudo convertir com.ms.wfc.ui.Graphics.invert
No se pudo convertir com.ms.wfc.ui.Graphics.renderPalette
No se pudo convertir com.ms.wfc.ui.Graphics.scroll
No se pudo convertir com.ms.wfc.ui.Graphics.setCoordinateOrigin
No se pudo convertir com.ms.wfc.ui.Graphics.setCoordinateScale
No se pudo convertir com.ms.wfc.ui.Graphics.setCoordinateSystem
No se pudo convertir com.ms.wfc.ui.Graphics.setHandle
No se pudo convertir com.ms.wfc.ui.Graphics.setOpaque
No se pudo convertir com.ms.wfc.ui.Graphics.setPixel
No se pudo convertir com.ms.wfc.ui.Graphics.setTextSpace
No se pudo convertir com.ms.wfc.ui.Help.Help
No se pudo convertir com.ms.wfc.ui.HelpEvent.component
No se pudo convertir com.ms.wfc.ui.HelpEvent.contextId
No se pudo convertir com.ms.wfc.ui.HelpEvent.contextType
No se pudo convertir com.ms.wfc.ui.HelpEvent.controlId
No se pudo convertir com.ms.wfc.ui.HelpEvent.HelpEvent(int, int, IComonent, int, Punto)
No se pudo convertir com.ms.wfc.ui.HelpEvent.HelpEvent(Objeto, int, int, IComonent, int, Punto)
No se pudo convertir com.ms.wfc.ui.HelpEventHandler.HelpEventHandler
No se pudo convertir com.ms.wfc.ui.HelpFileFileNameEditor
No se pudo convertir com.ms.wfc.ui.HelpProvider.shouldPersistShowHelp
No se pudo convertir com.ms.wfc.ui.HTMLControl
No se pudo convertir com.ms.wfc.ui.HTMLControl.add
No se pudo convertir com.ms.wfc.ui.HTMLControl.addOnDocumentReady
No se pudo convertir com.ms.wfc.ui.HTMLControl.getAmbientProperty
No se pudo convertir com.ms.wfc.ui.HTMLControl.HTMLControl
No se pudo convertir com.ms.wfc.ui.HTMLControl.onDocumentReady
No se pudo convertir com.ms.wfc.ui.HTMLControl.propertyChanged
No se pudo convertir com.ms.wfc.ui.HTMLControl.removeOnDocumentReady
No se pudo convertir com.ms.wfc.ui.HTMLControl.setBoundElements
No se pudo convertir com.ms.wfc.ui.HTMLControl.setNewHTMLElements
No se pudo convertir com.ms.wfc.ui.HTMLControl.setURL
No se pudo convertir com.ms.wfc.ui.IActiveXCustomPropertyDialog
No se pudo convertir com.ms.wfc.ui.Icon.getPICTDESC
No se pudo convertir com.ms.wfc.ui.Icon.Icon
No se pudo convertir com.ms.wfc.ui.Icon.initialize
No se pudo convertir com.ms.wfc.ui.Icon.loadPicture
No se pudo convertir com.ms.wfc.ui.IHandleHook
No se pudo convertir com.ms.wfc.ui.Image.copyHandle
No se pudo convertir com.ms.wfc.ui.Image.dirty
No se pudo convertir com.ms.wfc.ui.Image.drawStretchTo
No se pudo convertir com.ms.wfc.ui.Image.drawTo
No se pudo convertir com.ms.wfc.ui.Image.getExtension
No se pudo convertir com.ms.wfc.ui.Image.getHandle
No se pudo convertir com.ms.wfc.ui.Image.getPICTDESC
No se pudo convertir com.ms.wfc.ui.Image.getPicture
No se pudo convertir com.ms.wfc.ui.Image.Image
No se pudo convertir com.ms.wfc.ui.Image.initialize
No se pudo convertir com.ms.wfc.ui.Image.loadImage
No se pudo convertir com.ms.wfc.ui.Image.loadPicture
No se pudo convertir com.ms.wfc.ui.Image.PictureList
No se pudo convertir com.ms.wfc.ui.ImageIndexEditor
No se pudo convertir com.ms.wfc.ui.ImageList.createHandle
No se pudo convertir com.ms.wfc.ui.ImageList.destroyHandle
No se pudo convertir com.ms.wfc.ui.ImageList.getBackColor
No se pudo convertir com.ms.wfc.ui.ImageList.getIcon
No se pudo convertir com.ms.wfc.ui.ImageList.getMaskColor
No se pudo convertir com.ms.wfc.ui.ImageList.getUseMask
No se pudo convertir com.ms.wfc.ui.ImageList.ImageList
No se pudo convertir com.ms.wfc.ui.ImageList.recreateHandle
No se pudo convertir com.ms.wfc.ui.ImageList.SetBackColor
No se pudo convertir com.ms.wfc.ui.ImageList.setImages
No se pudo convertir com.ms.wfc.ui.ImageList.setMaskColor
No se pudo convertir com.ms.wfc.ui.ImageList.setUseMask
No se pudo convertir com.ms.wfc.ui.ImageListStreamer.getExtension
No se pudo convertir com.ms.wfc.ui.ImageListStreamer.ImageListStreamer
No se pudo convertir com.ms.wfc.ui.ImageListStreamer.save
No se pudo convertir com.ms.wfc.ui.InputLangChangeEventHandler.InputLangChangeEventHandler
No se pudo convertir com.ms.wfc.ui.InputLangChangeRequestEvent.InputLangChangeRequestEvent
No se pudo convertir com.ms.wfc.ui.InputLangChangeRequestEventHandler.InputLangChangeRequestEventHandler
No se pudo convertir com.ms.wfc.ui.ISelectionService.setSelectionStyle
No se pudo convertir com.ms.wfc.ui.ItemCheckEventHandler.ItemCheckEventHandler
No se pudo convertir com.ms.wfc.ui.ItemDragEventHandler.ItemDragEventHandler
No se pudo convertir com.ms.wfc.ui.KeyEvent.KeyEvent
No se pudo convertir com.ms.wfc.ui.KeyEventHandler.KeyEventHandler
No se pudo convertir com.ms.wfc.ui.KeyPressEvent.KeyPressEvent
No se pudo convertir com.ms.wfc.ui.KeyPressEventHandler.KeyPressEventHandler
No se pudo convertir com.ms.wfc.ui.Label.propertyChanged
No se pudo convertir com.ms.wfc.ui.Label.setTextAlign
No se pudo convertir com.ms.wfc.ui.LabelEditEventHandler.LabelEditEventHandler
No se pudo convertir com.ms.wfc.ui.LayoutEventHandler.LayoutEventHandler
No se pudo convertir com.ms.wfc.ui.ListItem.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.ListItem.ListItem
No se pudo convertir com.ms.wfc.ui.ListItem.ListItem(Secuencia)
No se pudo convertir com.ms.wfc.ui.ListItem.ListItem(Cadena, int, Cadena[])
No se pudo convertir com.ms.wfc.ui.ListItem.ListItem(Cadena, Cadena[])
No se pudo convertir com.ms.wfc.ui.ListItem.save
No se pudo convertir com.ms.wfc.ui.ListItem.setSubItem
No se pudo convertir com.ms.wfc.ui.MDIWindowDialog
No se pudo convertir com.ms.wfc.ui.MeasureItemEventHandler.MeasureItemEventHandler
No se pudo convertir com.ms.wfc.ui.Menu.Menu
No se pudo convertir com.ms.wfc.ui.Menu.mergeMenu
No se pudo convertir com.ms.wfc.ui.MenuItem.setChecked
No se pudo convertir com.ms.wfc.ui.Metafile.copyHandle
No se pudo convertir com.ms.wfc.ui.Metafile.destroyHandle
No se pudo convertir com.ms.wfc.ui.Metafile.drawStretchTo
No se pudo convertir com.ms.wfc.ui.Metafile.drawTo
No se pudo convertir com.ms.wfc.ui.Metafile.getHandle
No se pudo convertir com.ms.wfc.ui.Metafile.getPICTDESC
No se pudo convertir com.ms.wfc.ui.Metafile.getRenderedSize
No se pudo convertir com.ms.wfc.ui.Metafile.initialize
No se pudo convertir com.ms.wfc.ui.Metafile.Metafile
No se pudo convertir com.ms.wfc.ui.MonthCalendar.propertyChanged
No se pudo convertir com.ms.wfc.ui.MouseEvent.MouseEvent
No se pudo convertir com.ms.wfc.ui.MouseEventHandler.MouseEventHandler
No se pudo convertir com.ms.wfc.ui.NodeLabelEditEventHandler.NodeLabelEditEventHandler
No se pudo convertir com.ms.wfc.ui.PaintEvent.graphics
No se pudo convertir com.ms.wfc.ui.PaintEventHandler.PaintEventHandler
No se pudo convertir com.ms.wfc.ui.Palette
No se pudo convertir com.ms.wfc.ui.Palette.clone
No se pudo convertir com.ms.wfc.ui.Palette.copyHandle
No se pudo convertir com.ms.wfc.ui.Palette.destroyHandle
No se pudo convertir com.ms.wfc.ui.Palette.dispose
No se pudo convertir com.ms.wfc.ui.Palette.equals
No se pudo convertir com.ms.wfc.ui.Palette.finalize
No se pudo convertir com.ms.wfc.ui.Palette.getHalftonePalette
No se pudo convertir com.ms.wfc.ui.Palette.getHandle
No se pudo convertir com.ms.wfc.ui.Palette.getPaletteSupported
No se pudo convertir com.ms.wfc.ui.Palette.Palette
No se pudo convertir com.ms.wfc.ui.Pen.copyHandle
No se pudo convertir com.ms.wfc.ui.Pen.destroyHandle
No se pudo convertir com.ms.wfc.ui.Pen.getHandle
No se pudo convertir com.ms.wfc.ui.Pen.Pen
No se pudo convertir com.ms.wfc.ui.PenEntry
No se pudo convertir com.ms.wfc.ui.PenStyle.INSIDEFRAME
No se pudo convertir com.ms.wfc.ui.PenStyle.NULL
No se pudo convertir com.ms.wfc.ui.PictureBox.setImage
No se pudo convertir com.ms.wfc.ui.Point.Editor
No se pudo convertir com.ms.wfc.ui.Point.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.Point.Point
No se pudo convertir com.ms.wfc.ui.Point.save
No se pudo convertir com.ms.wfc.ui.PopulatedMenusEditor
No se pudo convertir com.ms.wfc.ui.ProgressBar.addOnValueChanged
No se pudo convertir com.ms.wfc.ui.ProgressBar.removeOnValueChanged
No se pudo convertir com.ms.wfc.ui.QueryContinueDragEventHandler.QueryContinueDragEventHandler
No se pudo convertir com.ms.wfc.ui.RadioButton.setTextAlign
No se pudo convertir com.ms.wfc.ui.Radix
No se pudo convertir com.ms.wfc.ui.RasterOp
No se pudo convertir com.ms.wfc.ui.ReadyStateEvent
No se pudo convertir com.ms.wfc.ui.ReadyStateEventHandler
No se pudo convertir com.ms.wfc.ui.Rebar.addBand
No se pudo convertir com.ms.wfc.ui.Rebar.addOnAutoSize
No se pudo convertir com.ms.wfc.ui.Rebar.addOnHeightChange
No se pudo convertir com.ms.wfc.ui.Rebar.addOnLayoutChange
No se pudo convertir com.ms.wfc.ui.Rebar.applyAutoSize
No se pudo convertir com.ms.wfc.ui.Rebar.getBandBorders
No se pudo convertir com.ms.wfc.ui.Rebar.getBands
No se pudo convertir com.ms.wfc.ui.Rebar.getDoubleClickToggle
No se pudo convertir com.ms.wfc.ui.Rebar.getFixedOrder
No se pudo convertir com.ms.wfc.ui.Rebar.getOrientation
No se pudo convertir com.ms.wfc.ui.Rebar.onAutoSize
No se pudo convertir com.ms.wfc.ui.Rebar.onHeightChange
No se pudo convertir com.ms.wfc.ui.Rebar.onLayoutChange
No se pudo convertir com.ms.wfc.ui.Rebar.removeAllBands
No se pudo convertir com.ms.wfc.ui.Rebar.removeBand
No se pudo convertir com.ms.wfc.ui.Rebar.removeOnAutoSize
No se pudo convertir com.ms.wfc.ui.Rebar.removeOnHeightChange
No se pudo convertir com.ms.wfc.ui.Rebar.removeOnLayoutChange
No se pudo convertir com.ms.wfc.ui.Rebar.setBandBorders
No se pudo convertir com.ms.wfc.ui.Rebar.setBands
No se pudo convertir com.ms.wfc.ui.Rebar.setComponentSite
No se pudo convertir com.ms.wfc.ui.Rebar.setDoubleClickToggle
No se pudo convertir com.ms.wfc.ui.Rebar.setFixedOrder
No se pudo convertir com.ms.wfc.ui.Rebar.setNewControls
No se pudo convertir com.ms.wfc.ui.Rebar.setOrientation
No se pudo convertir com.ms.wfc.ui.RebarBand.getAllowVariableHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.getAllowVertical
No se pudo convertir com.ms.wfc.ui.RebarBand.getBandBreak
No se pudo convertir com.ms.wfc.ui.RebarBand.getChildControl
No se pudo convertir com.ms.wfc.ui.RebarBand.getChildEdge
No se pudo convertir com.ms.wfc.ui.RebarBand.getFixedBitmap
No se pudo convertir com.ms.wfc.ui.RebarBand.getGrowBy
No se pudo convertir com.ms.wfc.ui.RebarBand.getHeaderWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.getIdealWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.getImageIndex
No se pudo convertir com.ms.wfc.ui.RebarBand.getIndex
No se pudo convertir com.ms.wfc.ui.RebarBand.getMaxInitialHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.getMinChildHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.getMinChildWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.getVisibleGripper
No se pudo convertir com.ms.wfc.ui.RebarBand.maximize
No se pudo convertir com.ms.wfc.ui.RebarBand.minimize
No se pudo convertir com.ms.wfc.ui.RebarBand.setAllowVariableHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.setAllowVertical
No se pudo convertir com.ms.wfc.ui.RebarBand.setBandBreak
No se pudo convertir com.ms.wfc.ui.RebarBand.setChildControl
No se pudo convertir com.ms.wfc.ui.RebarBand.setChildEdge
No se pudo convertir com.ms.wfc.ui.RebarBand.setFixedBitmap
No se pudo convertir com.ms.wfc.ui.RebarBand.setGrowBy
No se pudo convertir com.ms.wfc.ui.RebarBand.setHeaderWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.setIdealWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.setImageIndex
No se pudo convertir com.ms.wfc.ui.RebarBand.setIndex
No se pudo convertir com.ms.wfc.ui.RebarBand.setMaxInitialHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.setMinChildHeight
No se pudo convertir com.ms.wfc.ui.RebarBand.setMinChildWidth
No se pudo convertir com.ms.wfc.ui.RebarBand.setVisibleGripper
No se pudo convertir com.ms.wfc.ui.RebarBand.updateStyle
No se pudo convertir com.ms.wfc.ui.Rectangle.Editor.Editor
No se pudo convertir com.ms.wfc.ui.Rectangle.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.Rectangle.Rectangle
No se pudo convertir com.ms.wfc.ui.Rectangle.save
No se pudo convertir com.ms.wfc.ui.Rectangle.setBounds
No se pudo convertir com.ms.wfc.ui.Rectangle.toRECT
No se pudo convertir com.ms.wfc.ui.Region.copyHandle
No se pudo convertir com.ms.wfc.ui.Region.createPolygonal
No se pudo convertir com.ms.wfc.ui.Region.destroyHandle
No se pudo convertir com.ms.wfc.ui.Region.getHandle
No se pudo convertir com.ms.wfc.ui.RequestResizeEventHandler.RequestResizeEventHandler
No se pudo convertir com.ms.wfc.ui.RichEdit.DLL_RICHEDIT
No se pudo convertir com.ms.wfc.ui.RichEdit.getDelimiter
No se pudo convertir com.ms.wfc.ui.RichEdit.getFollowPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.getIMEColor
No se pudo convertir com.ms.wfc.ui.RichEdit.getIMEOptions
No se pudo convertir com.ms.wfc.ui.RichEdit.getLeadPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnHScroll
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnIMEChange
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnProtected
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnRequestResize
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnSelChange
No se pudo convertir com.ms.wfc.ui.RichEdit.getOnVScroll
No se pudo convertir com.ms.wfc.ui.RichEdit.getWordBreak
No se pudo convertir com.ms.wfc.ui.RichEdit.getWordPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.moveInsertionPoint
No se pudo convertir com.ms.wfc.ui.RichEdit.RICHEDIT_CLASS10A
No se pudo convertir com.ms.wfc.ui.RichEdit.RICHEDIT_CLASSA
No se pudo convertir com.ms.wfc.ui.RichEdit.RICHEDIT_CLASSW
No se pudo convertir com.ms.wfc.ui.RichEdit.RICHEDIT_DLL10
No se pudo convertir com.ms.wfc.ui.RichEdit.RICHEDIT_DLL20
No se pudo convertir com.ms.wfc.ui.RichEdit.setFollowPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.setIMEColor
No se pudo convertir com.ms.wfc.ui.RichEdit.setIMEOptions
No se pudo convertir com.ms.wfc.ui.RichEdit.setLeadPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.setWordBreak
No se pudo convertir com.ms.wfc.ui.RichEdit.setWordPunctuation
No se pudo convertir com.ms.wfc.ui.RichEdit.span
No se pudo convertir com.ms.wfc.ui.RichEdit.WC_RICHEDIT
No se pudo convertir com.ms.wfc.ui.RichEditIMEColor
No se pudo convertir com.ms.wfc.ui.RichEditIMEOptions
No se pudo convertir com.ms.wfc.ui.SameParentReferenceEditor
No se pudo convertir com.ms.wfc.ui.SaveFileDialog.runFileDialog
No se pudo convertir com.ms.wfc.ui.SaveFileDialog.setCreatePrompt
No se pudo convertir com.ms.wfc.ui.Screen.MonitorEnumProc
No se pudo convertir com.ms.wfc.ui.Screen.MONITORINFO
No se pudo convertir com.ms.wfc.ui.Screen.MONITORINFOEX
No se pudo convertir com.ms.wfc.ui.ScrollBar.propertyChanged
No se pudo convertir com.ms.wfc.ui.ScrollEvent.ScrollEvent
No se pudo convertir com.ms.wfc.ui.ScrollEventHandler.ScrollEventHandler
No se pudo convertir com.ms.wfc.ui.SelectionChangedEventHandler.SelectionChangedEventHandler
No se pudo convertir com.ms.wfc.ui.SelectionRange.Editor
No se pudo convertir com.ms.wfc.ui.SelectionRange.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.SelectionStyle
No se pudo convertir com.ms.wfc.ui.Shortcut.Editor
No se pudo convertir com.ms.wfc.ui.Splitter.postFilterMessage
No se pudo convertir com.ms.wfc.ui.SplitterEventHandler.SplitterEventHandler
No se pudo convertir com.ms.wfc.ui.State.save
No se pudo convertir com.ms.wfc.ui.State.State
No se pudo convertir com.ms.wfc.ui.StatusBarDrawItemEventHandler.StatusBarDrawItemEventHandler
No se pudo convertir com.ms.wfc.ui.StatusBarPanelClickEventHandler.StatusBarPanelClickEventHandler
No se pudo convertir com.ms.wfc.ui.TabBase.getTCITEM
No se pudo convertir com.ms.wfc.ui.TabBase.propertyChanged
No se pudo convertir com.ms.wfc.ui.TabBase.setSelectedIndex
No se pudo convertir com.ms.wfc.ui.TabStrip.insertTab
No se pudo convertir com.ms.wfc.ui.TextFormat.BOTTOM
No se pudo convertir com.ms.wfc.ui.TextFormat.EDITCONTROL
No se pudo convertir com.ms.wfc.ui.TextFormat.ENDELLIPSIS
No se pudo convertir com.ms.wfc.ui.TextFormat.EXPANDTABS
No se pudo convertir com.ms.wfc.ui.TextFormat.HORIZONTALCENTER
No se pudo convertir com.ms.wfc.ui.TextFormat.LEFT
No se pudo convertir com.ms.wfc.ui.TextFormat.NOPREFIX
No se pudo convertir com.ms.wfc.ui.TextFormat.PATHELLIPSIS
No se pudo convertir com.ms.wfc.ui.TextFormat.RIGHT
No se pudo convertir com.ms.wfc.ui.TextFormat.RIGHTTOLEFT
No se pudo convertir com.ms.wfc.ui.TextFormat.SINGLELINE
No se pudo convertir com.ms.wfc.ui.TextFormat.TextFormat
No se pudo convertir com.ms.wfc.ui.TextFormat.TOP
No se pudo convertir com.ms.wfc.ui.TextFormat.valid
No se pudo convertir com.ms.wfc.ui.TextFormat.VERTICALCENTER
No se pudo convertir com.ms.wfc.ui.TextFormat.WORDBREAK
No se pudo convertir com.ms.wfc.ui.ToolBar.propertyChanged
No se pudo convertir com.ms.wfc.ui.ToolBarTextAlign.RIGHT
No se pudo convertir com.ms.wfc.ui.ToolBarTextAlign.UNDERNEATH
No se pudo convertir com.ms.wfc.ui.ToolTip.shouldPersistAutomaticDelay
No se pudo convertir com.ms.wfc.ui.ToolTip.shouldPersistAutoPopDelay
No se pudo convertir com.ms.wfc.ui.ToolTip.shouldPersistInitialDelay
No se pudo convertir com.ms.wfc.ui.ToolTip.shouldPersistReshowDelay
No se pudo convertir com.ms.wfc.ui.TrackBar.propertyChanged
No se pudo convertir com.ms.wfc.ui.TreeNode.getConstructorArgs
No se pudo convertir com.ms.wfc.ui.TreeNode.save
No se pudo convertir com.ms.wfc.ui.TreeNode.TreeNode
No se pudo convertir com.ms.wfc.ui.TreeNodesEditDialog
No se pudo convertir com.ms.wfc.ui.TreeNodesEditor
No se pudo convertir com.ms.wfc.ui.TreeView.shouldPersistIndent
No se pudo convertir com.ms.wfc.ui.TreeViewCancelEventHandler.TreeViewCancelEventHandler
No se pudo convertir com.ms.wfc.ui.TreeViewEventHandler.TreeViewEventHandler
No se pudo convertir com.ms.wfc.ui.UpDown.getAcceleration
No se pudo convertir com.ms.wfc.ui.UpDown.getAutoBuddy
No se pudo convertir com.ms.wfc.ui.UpDown.getAutoSize
No se pudo convertir com.ms.wfc.ui.UpDown.getBuddyControl
No se pudo convertir com.ms.wfc.ui.UpDown.getHorizontal
No se pudo convertir com.ms.wfc.ui.UpDown.getModifyBuddy
No se pudo convertir com.ms.wfc.ui.UpDown.getRadix
No se pudo convertir com.ms.wfc.ui.UpDown.getWrap
No se pudo convertir com.ms.wfc.ui.UpDown.onCreateHandle
No se pudo convertir com.ms.wfc.ui.UpDown.setAcceleration
No se pudo convertir com.ms.wfc.ui.UpDown.setAutoBuddy
No se pudo convertir com.ms.wfc.ui.UpDown.setAutoSize
No se pudo convertir com.ms.wfc.ui.UpDown.setBuddyControl
No se pudo convertir com.ms.wfc.ui.UpDown.setHorizontal
No se pudo convertir com.ms.wfc.ui.UpDown.setModifyBuddy
No se pudo convertir com.ms.wfc.ui.UpDown.setRadix
No se pudo convertir com.ms.wfc.ui.UpDown.setWrap
No se pudo convertir com.ms.wfc.ui.UpDown.shouldPersistBuddyControl
No se pudo convertir com.ms.wfc.ui.UpDownAcceleration
No se pudo convertir com.ms.wfc.ui.UpDownAcceleration.Editor
No se pudo convertir com.ms.wfc.ui.UpDownAlignment.MANUAL
No se pudo convertir com.ms.wfc.ui.UpDownChangedEvent.delta
No se pudo convertir com.ms.wfc.ui.UpDownChangedEvent.value
No se pudo convertir com.ms.wfc.ui.UpDownChangedEventHandler.UpDownChangedEventHandler
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.util


No se pudo convertir com.ms.wfc.util.ArrayEnumerator.hasMoreItems
No se pudo convertir com.ms.wfc.util.Debug.addOnDisplayAssert
No se pudo convertir com.ms.wfc.util.Debug.addOnDisplayMessage
No se pudo convertir com.ms.wfc.util.Debug.Debug
No se pudo convertir com.ms.wfc.util.Debug.displaySwitches
No se pudo convertir com.ms.wfc.util.Debug.getSwitchListText
No se pudo convertir com.ms.wfc.util.Debug.printEnumIf
No se pudo convertir com.ms.wfc.util.Debug.printExceptionIf
No se pudo convertir com.ms.wfc.util.Debug.printIf
No se pudo convertir com.ms.wfc.util.Debug.printlnIf
No se pudo convertir com.ms.wfc.util.Debug.printObjectIf
No se pudo convertir com.ms.wfc.util.Debug.printSwitchList
No se pudo convertir com.ms.wfc.util.Debug.printStackTraceIf
No se pudo convertir com.ms.wfc.util.Debug.removeOnDisplayAssert
No se pudo convertir com.ms.wfc.util.Debug.removeOnDisplayMessage
No se pudo convertir com.ms.wfc.util.DebugMessageEventHandler
No se pudo convertir com.ms.wfc.util.HandleCollector
No se pudo convertir com.ms.wfc.util.HashTable.addSlot
No se pudo convertir com.ms.wfc.util.HashTable.buckets
No se pudo convertir com.ms.wfc.util.HashTable.findItem
No se pudo convertir com.ms.wfc.util.HashTable.free
No se pudo convertir com.ms.wfc.util.HashTable.getKeys
No se pudo convertir com.ms.wfc.util.HashTable.getValues
No se pudo convertir com.ms.wfc.util.HashTable.growHashTable
No se pudo convertir com.ms.wfc.util.HashTable.HashTable
No se pudo convertir com.ms.wfc.util.HashTable.hashValues
No se pudo convertir com.ms.wfc.util.HashTable.iMax
No se pudo convertir com.ms.wfc.util.HashTable.keys
No se pudo convertir com.ms.wfc.util.HashTable.maxAverageDepth
No se pudo convertir com.ms.wfc.util.HashTable.rehash
No se pudo convertir com.ms.wfc.util.HashTable.removeSlot
No se pudo convertir com.ms.wfc.util.HashTable.removeValue
No se pudo convertir com.ms.wfc.util.HashTable.sizes
No se pudo convertir com.ms.wfc.util.HashTable.values
No se pudo convertir com.ms.wfc.util.IEnumerator.hasMoreItems
No se pudo convertir com.ms.wfc.util.IEnumerator.nextItem
No se pudo convertir com.ms.wfc.util.List.capInc
No se pudo convertir com.ms.wfc.util.List.clone
No se pudo convertir com.ms.wfc.util.List.getVersion
No se pudo convertir com.ms.wfc.util.List.version
No se pudo convertir com.ms.wfc.util.NumberFormat
No se pudo convertir com.ms.wfc.util.Root.checkLeaks
No se pudo convertir com.ms.wfc.util.Root.get
No se pudo convertir com.ms.wfc.util.StringSorter.compare
No se pudo convertir com.ms.wfc.util.StringSorter.DESCENDING
No se pudo convertir com.ms.wfc.util.StringSorter.sort
No se puede convertir com.ms.wfc.util.StringSorter.sort(Locale, String,.Object, int, int, int)
No se pudo convertir com.ms.wfc.util.Utils.getJavaIdentifier
No se pudo convertir com.ms.wfc.util.Utils.getPrimitiveWord
No se pudo convertir com.ms.wfc.util.Utils.getReservedWord
No se pudo convertir com.ms.wfc.util.Utils.validateIdentifier
No se pudo convertir com.ms.wfc.util.Value.format
No se pudo convertir com.ms.wfc.util.Value.formatCurrency
No se pudo convertir com.ms.wfc.util.Value.formatNumber
No se pudo convertir com.ms.wfc.util.Value.SysFreeString
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.wfc.win32


No se pudo convertir com.ms.wfc.win32.CharBuffer
No se pudo convertir com.ms.wfc.win32.Windows.ACCELERATORHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.BeginPaint
No se pudo convertir com.ms.wfc.win32.Windows.CloseEnhMetaFile
No se pudo convertir com.ms.wfc.win32.Windows.CloseHandle
No se pudo convertir com.ms.wfc.win32.Windows.CopyEnhMetaFile
No se pudo convertir com.ms.wfc.win32.Windows.CopyImage
No se pudo convertir com.ms.wfc.win32.Windows.CreateAcceleratorTable
No se pudo convertir com.ms.wfc.win32.Windows.CreateBitmap
No se pudo convertir com.ms.wfc.win32.Windows.CreateBitmap(int, int, int, int, int[])
No se pudo convertir com.ms.wfc.win32.Windows.CreateBitmap(int, int, int, int, short[])
No se pudo convertir com.ms.wfc.win32.Windows.CreateBrushIndirect
No se pudo convertir com.ms.wfc.win32.Windows.CreateCompatibleBitmap
No se pudo convertir com.ms.wfc.win32.Windows.CreateCompatibleDC
No se pudo convertir com.ms.wfc.win32.Windows.CreateDC
No se pudo convertir com.ms.wfc.win32.Windows.CreateDIBitmap
No se pudo convertir com.ms.wfc.win32.Windows.CreateEllipticRgn
No se pudo convertir com.ms.wfc.win32.Windows.CreateEllipticRgnIndirect
No se pudo convertir com.ms.wfc.win32.Windows.CreateEnhMetaFile
No se pudo convertir com.ms.wfc.win32.Windows.CreateFile
No se pudo convertir com.ms.wfc.win32.Windows.CreateFont
No se pudo convertir com.ms.wfc.win32.Windows.CreateFontIndirect
No se pudo convertir com.ms.wfc.win32.Windows.CreateHalftonePalette
No se pudo convertir com.ms.wfc.win32.Windows.CreateHatchBrush
No se pudo convertir com.ms.wfc.win32.Windows.CreateIC
No se pudo convertir com.ms.wfc.win32.Windows.CreateILockBytesOnHGlobal
No se pudo convertir com.ms.wfc.win32.Windows.CreateMappedBitmap
No se pudo convertir com.ms.wfc.win32.Windows.CreateMenu
No se pudo convertir com.ms.wfc.win32.Windows.CreatePalette
No se pudo convertir com.ms.wfc.win32.Windows.CreatePatternBrush
No se pudo convertir com.ms.wfc.win32.Windows.CreatePen
No se pudo convertir com.ms.wfc.win32.Windows.CreatePenIndirect
No se pudo convertir com.ms.wfc.win32.Windows.CreatePolygonRgn
No se pudo convertir com.ms.wfc.win32.Windows.CreatePolyPolygonRgn
No se pudo convertir com.ms.wfc.win32.Windows.CreatePopupMenu
No se pudo convertir com.ms.wfc.win32.Windows.CreateProcess
No se pudo convertir com.ms.wfc.win32.Windows.CreateRectRgn
No se pudo convertir com.ms.wfc.win32.Windows.CreateRectRgnIndirect
No se pudo convertir com.ms.wfc.win32.Windows.CreateRoundRectRgn
No se pudo convertir com.ms.wfc.win32.Windows.CreateSolidBrush
No se pudo convertir com.ms.wfc.win32.Windows.CreateWindowEx
No se pudo convertir com.ms.wfc.win32.Windows.CURSORHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.DeleteDC
No se pudo convertir com.ms.wfc.win32.Windows.DeleteEnhMetaFile
No se pudo convertir com.ms.wfc.win32.Windows.DeleteObject
No se pudo convertir com.ms.wfc.win32.Windows.DestroyAcceleratorTable
No se pudo convertir com.ms.wfc.win32.Windows.DestroyCursor
No se pudo convertir com.ms.wfc.win32.Windows.DestroyIcon
No se pudo convertir com.ms.wfc.win32.Windows.DestroyMenu
No se pudo convertir com.ms.wfc.win32.Windows.DestroyWindow
No se pudo convertir com.ms.wfc.win32.Windows.DoDragDrop
No se pudo convertir com.ms.wfc.win32.Windows.DrawState
No se pudo convertir com.ms.wfc.win32.Windows.DuplicateHandle
No se pudo convertir com.ms.wfc.win32.Windows.EMFHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.EndPaint
No se pudo convertir com.ms.wfc.win32.Windows.EnumObjects
No se pudo convertir com.ms.wfc.win32.Windows.EnumThreadWindows
No se pudo convertir com.ms.wfc.win32.Windows.FindClose
No se pudo convertir com.ms.wfc.win32.Windows.FindFirstFile
No se pudo convertir com.ms.wfc.win32.Windows.FINDHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.GDIHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.GetDC
No se pudo convertir com.ms.wfc.win32.Windows.GetDCEx
No se pudo convertir com.ms.wfc.win32.Windows.GetEnhMetaFile
No se pudo convertir com.ms.wfc.win32.Windows.GetHGlobalFromILockBytes
No se pudo convertir com.ms.wfc.win32.Windows.GetWindowDC
No se pudo convertir com.ms.wfc.win32.Windows.HDCHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.ICONHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.InvalidateRect
No se pudo convertir com.ms.wfc.win32.Windows.KERNELHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.MENUHANDLE
No se pudo convertir com.ms.wfc.win32.Windows.OleCreatePictureIndirect
No se pudo convertir com.ms.wfc.win32.Windows.PathToRegion
No se pudo convertir com.ms.wfc.win32.Windows.RegisterDragDrop
No se pudo convertir com.ms.wfc.win32.Windows.ReleaseDC
No se pudo convertir com.ms.wfc.win32.Windows.SetEnhMetaFileBits
No se pudo convertir com.ms.wfc.win32.Windows.SetMetaFileBitsEx
No se pudo convertir com.ms.wfc.win32.Windows.SetWindowRgn
No se pudo convertir com.ms.wfc.win32.Windows.SetWinMetaFileBits
No se pudo convertir com.ms.wfc.win32.Windows.StgCreateDocfileOnILockBytes
No se pudo convertir com.ms.wfc.win32.Windows.StgOpenStorageOnILockBytes
No se pudo convertir com.ms.wfc.win32.Windows.WINDOWHANDLE
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.ms.win32


No se pudo convertir com.ms.win32.Kernel32.CreateFiber
No se pudo convertir com.ms.win32.Ole32.CoCreateInstanceEx
No se pudo convertir com.ms.win32.Ole32.CoGetInstanceFromFile
No se pudo convertir com.ms.win32.Ole32.CoGetInstanceFromIStorage
No se pudo convertir com.ms.win32.Ole32.CreateILockBytesOnHGlobal
No se pudo convertir com.ms.win32.Ole32.GetHGlobalFromILockBytes
No se pudo convertir com.ms.win32.Ole32.StgCreateDocfile
No se pudo convertir com.ms.win32.Ole32.StgCreateStorageEx
No se pudo convertir com.ms.win32.Ole32.StgOpenLayoutDocfile
No se pudo convertir com.ms.win32.Ole32.StgOpenStorage
No se pudo convertir com.ms.win32.Spoolss.EnumPrinters
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de com.sun.image.codec


No se pudo convertir com.sun.image.codec.jpeg.ImageFormatException
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.createJPEGDecoder
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(BufferedImage)
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(int,int)
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(JPEGDecodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(JPEGEncodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(Raster, int)
No se pudo convertir com.sun.image.codec.jpeg.JPEGDecodeParam
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.addMarkerData
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setACHuffmanComponentMapping
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setACHuffmanTable
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setDCHuffmanComponentMapping
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setDCHuffmanTable
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setDensityUnit
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setHorizontalSubsampling
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setImageInfoValid
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setMarkerData
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setQTable
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setQTableComponentMapping
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setQuality
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setRestartInterval
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setTableInfoValid
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setVerticalSubsampling
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setXDensity
No se pudo convertir com.sun.image.codec.jpeg.JPEGEncodeParam.setYDensity
No se pudo convertir com.sun.image.codec.jpeg.JPEGHuffmanTable
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageDecoder
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageDecoder.decodeAsBufferedImage
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageDecoder.decodeAsRaster
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageDecoder.getInputStream
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageDecoder.getJPEGDecodeParam
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.encode(BufferedImage)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.encode(BufferedImage, JPEGEncodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.encode(Raster)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.encode(Raster, JPEGEncodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultColorId
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultJPEGEncodeParam(JPEGDecodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultJPEGEncodeParam(JPEGEncodeParam)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultJPEGEncodeParam(JPEGEncodeParam, BufferedImage)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultJPEGEncodeParam(JPEGEncodeParam, int, int)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getDefaultJPEGEncodeParam(JPEGEncodeParam, Raster,int)
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getJPEGEncodeParam
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.getOutputStream
No se pudo convertir com.sun.image.codec.jpeg.JPEGImageEncoder.setJPEGEncodeParam
No se pudo convertir com.sun.image.codec.jpeg.JPEGQTable
No se pudo convertir com.sun.image.codec.jpeg.TruncatedFileException
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.applet


No se pudo convertir java.applet.Applet
No se pudo convertir java.applet.Applet.destroy
No se pudo convertir java.applet.Applet.getAccessibleContext
No se pudo convertir java.applet.Applet.getAppletContext
No se pudo convertir java.applet.Applet.getAppletInfo
No se pudo convertir java.applet.Applet.getAudioClip
No se pudo convertir java.applet.Applet.getCodeBase
No se pudo convertir java.applet.Applet.getDocumentBase
No se pudo convertir java.applet.Applet.getImage
No se pudo convertir java.applet.Applet.getLocale
No se pudo convertir java.applet.Applet.getParameter
No se pudo convertir java.applet.Applet.getParameterInfo
No se pudo convertir java.applet.Applet.init
No se pudo convertir java.applet.Applet.isActive
No se pudo convertir java.applet.Applet.newAudioClip
No se pudo convertir java.applet.Applet.play
No se pudo convertir java.applet.Applet.resize
No se pudo convertir java.applet.Applet.setStub
No se pudo convertir java.applet.Applet.showStatus
No se pudo convertir java.applet.Applet.start
No se pudo convertir java.applet.Applet.stop
No se pudo convertir java.applet.AppletContext
No se pudo convertir java.applet.AppletStub
No se pudo convertir java.applet.AudioClip
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt


No se pudo convertir java.awt.<NombreClase>.add*Listener
No se pudo convertir java.awt.<NombreClase>.addNotify
No se pudo convertir java.awt.<NombreClase>.getPeer
No se pudo convertir java.awt.<NombreClase>.print*
No se pudo convertir java.awt.<NombreClase>.processActionEvent
No se pudo convertir java.awt.<NombreClase>.processEvent
No se pudo convertir java.awt.<NombreClase>.processItemEvent
No se pudo convertir java.awt.<NombreClase>.remove*Listener
No se pudo convertir java.awt.<NombreClase>.removeNotify
No se pudo convertir java.awt.ActiveEvent
No se pudo convertir java.awt.Adjustable
No se pudo convertir java.awt.AlphaComposite
No se pudo convertir java.awt.AWTError
No se pudo convertir java.awt.AWTEvent
No se pudo convertir java.awt.AWTEvent.<TipoEvento>
No se pudo convertir java.awt.AWTEvent.AWTEvent
No se pudo convertir java.awt.AWTEvent.consume
No se pudo convertir java.awt.AWTEvent.consumed
No se pudo convertir java.awt.AWTEvent.getID
No se pudo convertir java.awt.AWTEvent.id
No se pudo convertir java.awt.AWTEvent.isConsumed
No se pudo convertir java.awt.AWTEventMulticaster
No se pudo convertir java.awt.AWTPermission.AWTPermission
No se pudo convertir java.awt.BasicStroke.BasicStroke
No se pudo convertir java.awt.BasicStroke.createStrokedShape
No se pudo convertir java.awt.BorderLayout
No se pudo convertir java.awt.Button.getActionCommand
No se pudo convertir java.awt.Button.getListeners
No se pudo convertir java.awt.Button.setActionCommand
No se pudo convertir java.awt.Canvas
No se pudo convertir java.awt.Canvas.Canvas
No se pudo convertir java.awt.Canvas.paint
No se pudo convertir java.awt.CardLayout
No se pudo convertir java.awt.Checkbox.getListeners
No se pudo convertir java.awt.CheckboxGroup.getCurrent
No se pudo convertir java.awt.CheckboxGroup.getSelectedCheckbox
No se pudo convertir java.awt.CheckboxMenuItem.getAccessibleContext
No se pudo convertir java.awt.CheckboxMenuItem.getListeners
No se pudo convertir java.awt.Choice
No se pudo convertir java.awt.Choice.getListeners
No se pudo convertir java.awt.Choice.getSelectedIndex
No se pudo convertir java.awt.Choice.getSelectedItem
No se pudo convertir java.awt.Color.Color(ColorSpace, float[], float)
No se pudo convertir java.awt.Color.Color(float, float, float, float)
No se pudo convertir java.awt.Color.Color(int)
No se pudo convertir java.awt.Color.Color(int, boolean)
No se pudo convertir java.awt.Color.Color(int, int, int,int)
No se pudo convertir java.awt.Color.createContext
No se pudo convertir java.awt.Color.decode
No se pudo convertir java.awt.Color.getColor
No se pudo convertir java.awt.Color.getColorComponents(ColorSpace, float[])
No se pudo convertir java.awt.Color.getColorComponents(float[])
No se pudo convertir java.awt.Color.getColorSpace
No se pudo convertir java.awt.Color.getComponents(ColorSpace, float[])
No se pudo convertir java.awt.Color.getComponents(float[])
No se pudo convertir java.awt.Color.getHSBColor
No se pudo convertir java.awt.Color.getRGBColorComponents
No se pudo convertir java.awt.Color.getRGBComponents
No se pudo convertir java.awt.Color.getTransparency
No se pudo convertir java.awt.Color.HSBtoRGB
No se pudo convertir java.awt.Color.RGBtoHSB
No se pudo convertir java.awt.Component.action
No se pudo convertir java.awt.Component.addHierarchyBoundsListener
No se pudo convertir java.awt.Component.addHierarchyListener
No se pudo convertir java.awt.Component.addInputMethodListener
No se pudo convertir java.awt.Component.addPropertyChangeListener
No se pudo convertir java.awt.Component.BOTTOM_ALIGNMENT
No se pudo convertir java.awt.Component.CENTER_ALIGNMENT
No se pudo convertir java.awt.Component.checkImage
No se pudo convertir java.awt.Component.coalesceEvents
No se puedo convertir java.awt.Component.createImage(ImageProducer)
No se pudo convertir java.awt.Component.createImage(int, int)
No se pudo convertir java.awt.Component.deliverEvent
No se pudo convertir java.awt.Component.disable
No se pudo convertir java.awt.Component.disableEvents
No se pudo convertir java.awt.Component.dispatchEvent
No se pudo convertir java.awt.Component.enableEvents
No se pudo convertir java.awt.Component.enableInputMethods
No se pudo convertir java.awt.Component.firePropertyChange
No se pudo convertir java.awt.Component.getAlignmentX
No se pudo convertir java.awt.Component.getAlignmentY
No se pudo convertir java.awt.Component.getColorModel
No se pudo convertir java.awt.Component.getDropTarget
No se pudo convertir java.awt.Component.getGraphicsConfiguration
No se pudo convertir java.awt.Component.getInputContext
No se pudo convertir java.awt.Component.getInputMethodRequests
No se pudo convertir java.awt.Component.getListeners
No se pudo convertir java.awt.Component.getLocale
No se pudo convertir java.awt.Component.getMaximumSize
No se pudo convertir java.awt.Component.getMinimumSize
No se pudo convertir java.awt.Component.getPreferredSize
No se pudo convertir java.awt.Component.getSize
No se pudo convertir java.awt.Component.getToolkit
No se pudo convertir java.awt.Component.getTreeLock
No se pudo convertir java.awt.Component.handleEvent
No se pudo convertir java.awt.Component.hasFocus
No se pudo convertir java.awt.Component.imageUpdate
No se pudo convertir java.awt.Component.isDisplayable
No se pudo convertir java.awt.Component.isDoubleBuffered
No se pudo convertir java.awt.Component.isLightweight
No se pudo convertir java.awt.Component.isOpaque
No se pudo convertir java.awt.Component.isValid
No se pudo convertir java.awt.Component.isVisible
No se pudo convertir java.awt.Component.keyDown
No se pudo convertir java.awt.Component.keyUp
No se pudo convertir java.awt.Component.LEFT_ALIGNMENT
No se pudo convertir java.awt.Component.lostFocus
No se pudo convertir java.awt.Component.minimumSize
No se pudo convertir java.awt.Component.mouseDown
No se pudo convertir java.awt.Component.mouseDrag
No se pudo convertir java.awt.Component.mouseEnter
No se pudo convertir java.awt.Component.mouseExit
No se pudo convertir java.awt.Component.mouseMove
No se pudo convertir java.awt.Component.mouseUp
No se pudo convertir java.awt.Component.move
No se pudo convertir java.awt.Component.nextFocus
No se pudo convertir java.awt.Component.paint
No se pudo convertir java.awt.Component.paintAll
No se pudo convertir java.awt.Component.postEvent
No se pudo convertir java.awt.Component.preferredSize
No se pudo convertir java.awt.Component.prepareImage
No se pudo convertir java.awt.Component.process*Event
No se pudo convertir java.awt.Component.remove
No se pudo convertir java.awt.Component.removeInputMethodListener
No se pudo convertir java.awt.Component.removePropertyChangeListener
No se pudo convertir java.awt.Component.repaint
No se pudo convertir java.awt.Component.repaint(int, int, int, int)
No se pudo convertir java.awt.Component.repaint(long)
No se pudo convertir java.awt.Component.repaint(long, int, int, int, int)
No se pudo convertir java.awt.Component.RIGHT_ALIGNMENT
No se pudo convertir java.awt.Component.setBounds
No se pudo convertir java.awt.Component.setComponentOrientation
No se pudo convertir java.awt.Component.setDropTarget
No se pudo convertir java.awt.Component.setEnabled
No se pudo convertir java.awt.Component.setLocale
No se pudo convertir java.awt.Component.setLocation
No se pudo convertir java.awt.Component.setSize
No se pudo convertir java.awt.Component.setVisible
No se pudo convertir java.awt.Component.TOP_ALIGNMENT
No se pudo convertir java.awt.Component.transferFocus
No se pudo convertir java.awt.Component.validate
No se pudo convertir java.awt.ComponentOrientation.getOrientation(Locale)
No se pudo convertir java.awt.ComponentOrientation.getOrientation(ResourceBundle)
No se pudo convertir java.awt.ComponentOrientation.isHorizontal
No se pudo convertir java.awt.Composite
No se pudo convertir java.awt.CompositeContext
No se pudo convertir java.awt.Container.add(Component)
No se pudo convertir java.awt.Container.add(Component, int)
No se pudo convertir java.awt.Container.add(Component, Object)
No se pudo convertir java.awt.Container.add(Component, Object, int)
No se pudo convertir java.awt.Container.add(String, Component)
No se pudo convertir java.awt.Container.deliverEvent
No se pudo convertir java.awt.Container.getComponent
No se pudo convertir java.awt.Container.getComponentAt(int, int)
No se pudo convertir java.awt.Container.getComponentAt(Point)
No se pudo convertir java.awt.Container.getLayout
No se pudo convertir java.awt.Container.getListeners
No se pudo convertir java.awt.Container.paint*
No se pudo convertir java.awt.Container.processContainerEvent
No se pudo convertir java.awt.Container.setLayout
No se pudo convertir java.awt.Container.validate
No se pudo convertir java.awt.Container.validateTree
No se pudo convertir java.awt.Cursor.Cursor
No se pudo convertir java.awt.Cursor.CUSTOM_CURSOR
No se pudo convertir java.awt.Cursor.getName
No se pudo convertir java.awt.Cursor.getSystemCustomCursor
No se pudo convertir java.awt.Cursor.name
No se pudo convertir java.awt.Cursor.predefined
No se pudo convertir java.awt.Dialog.Dialog
No se pudo convertir java.awt.Dialog.hide
No se pudo convertir java.awt.Dialog.setModal
No se pudo convertir java.awt.Dialog.show
No se pudo convertir java.awt.Dimension.setSize
No se pudo convertir java.awt.Dimension.toString
No se pudo convertir java.awt.Event
No se pudo convertir java.awt.EventQueue
No se pudo convertir java.awt.FileDialog.*FilenameFilter
No se pudo convertir java.awt.FileDialog.FileDialog(Frame)
No se pudo convertir java.awt.FileDialog.FileDialog(Frame, String)
No se pudo convertir java.awt.FileDialog.FileDialog(Frame, String, int)
No se pudo convertir java.awt.FileDialog.getFile
No se pudo convertir java.awt.FileDialog.setMode
No se pudo convertir java.awt.FlowLayout
No se pudo convertir java.awt.FlowLayout.addLayoutComponent
No se pudo convertir java.awt.FlowLayout.FlowLayout
No se pudo convertir java.awt.FlowLayout.FlowLayout(int)
No se pudo convertir java.awt.FlowLayout.FlowLayout(int, int, int)
No se pudo convertir java.awt.FlowLayout.getAlignment
No se pudo convertir java.awt.FlowLayout.getHgap
No se pudo convertir java.awt.FlowLayout.getVgap
No se pudo convertir java.awt.FlowLayout.layoutContainer
No se pudo convertir java.awt.FlowLayout.minimumLayoutSize
No se pudo convertir java.awt.FlowLayout.preferredLayoutSize
No se pudo convertir java.awt.FlowLayout.removeLayoutComponent
No se pudo convertir java.awt.FlowLayout.setAlignment
No se pudo convertir java.awt.FlowLayout.setHgap
No se pudo convertir java.awt.FlowLayout.setVgap
No se pudo convertir java.awt.FlowLayout.toString
No se pudo convertir java.awt.Font.canDisplay
No se pudo convertir java.awt.Font.canDisplayUpTo
No se pudo convertir java.awt.Font.CENTER_BASELINE
No se pudo convertir java.awt.Font.createFont
No se pudo convertir java.awt.Font.createGlyphVector
No se pudo convertir java.awt.Font.deriveFont(AffineTransform)
No se pudo convertir java.awt.Font.deriveFont(int, AffineTransform)
No se pudo convertir java.awt.Font.deriveFont(Map)
No se pudo convertir java.awt.Font.Font
No se pudo convertir java.awt.Font.getAttributes
No se pudo convertir java.awt.Font.getAvailableAttributes
No se pudo convertir java.awt.Font.getBaselineFor
No se pudo convertir java.awt.Font.getFont
No se pudo convertir java.awt.Font.getFont(Map)
No se pudo convertir java.awt.Font.getItalicAngle
No se pudo convertir java.awt.Font.getLineMetrics
No se pudo convertir java.awt.Font.getLineMetrics(CharacterIterator, int, int, FontRenderContext)
No se pudo convertir java.awt.Font.getMaxCharBounds
No se pudo convertir java.awt.Font.getMissingGlyphCode
No se pudo convertir java.awt.Font.getNumGlyphs
No se pudo convertir java.awt.Font.getPSName
No se pudo convertir java.awt.Font.getStringBounds(char[], int, int, FontRenderContext)
No se pudo convertir java.awt.Font.getStringBounds(CharacterIterator, int, int, FontRenderContext)
No se pudo convertir java.awt.Font.getStringBounds(String, FontRenderContext)
No se pudo convertir java.awt.Font.getStringBounds(String, int, int, FontRenderContext)
No se pudo convertir java.awt.Font.getTransform
No se pudo convertir java.awt.Font.HANGING_BASELINE
No se pudo convertir java.awt.Font.hasUniformLineMetrics
No se pudo convertir java.awt.Font.PLAIN
No se pudo convertir java.awt.Font.ROMAN_BASELINE
No se pudo convertir java.awt.Font.TRUETYPE_FONT
No se pudo convertir java.awt.FontMetrics.*Width
No se pudo convertir java.awt.FontMetrics.FontMetrics
No se pudo convertir java.awt.FontMetrics.getLeading
No se pudo convertir java.awt.FontMetrics.getLineMetrics
No se pudo convertir java.awt.FontMetrics.getMaxAdvance
No se pudo convertir java.awt.FontMetrics.getMaxCharBounds
No se pudo convertir java.awt.FontMetrics.getStringBounds(char[], int, int, Graphics)
No se pudo convertir java.awt.FontMetrics.getStringBounds(CharacterIterator, int, int, Graphics)
No se pudo convertir java.awt.FontMetrics.getStringBounds(String, Graphics)
No se pudo convertir java.awt.FontMetrics.getStringBounds(String, int, int, Graphics)
No se pudo convertir java.awt.FontMetrics.getWidths
No se pudo convertir java.awt.FontMetrics.hasUniformLineMetrics
No se pudo convertir java.awt.Frame
No se pudo convertir java.awt.Frame.Frame(GraphicsConfiguration)
No se pudo convertir java.awt.Frame.Frame(String, GraphicsConfiguration)
No se pudo convertir java.awt.Frame.getCursorType
No se pudo convertir java.awt.Frame.getFrames
No se pudo convertir java.awt.Frame.getIconImage
No se pudo convertir java.awt.Frame.setIconImage
No se pudo convertir java.awt.Frame.setState
No se pudo convertir java.awt.GradientPaint.createContext
No se pudo convertir java.awt.GradientPaint.getTransparency
No se pudo convertir java.awt.GradientPaint.GradientPaint
No se pudo convertir java.awt.GradientPaint.isCyclic
No se pudo convertir java.awt.Graphics.copyArea
No se pudo convertir java.awt.Graphics.drawBytes
No se pudo convertir java.awt.Graphics.drawChars
No se pudo convertir java.awt.Graphics.drawRoundRect
No se pudo convertir java.awt.Graphics.drawString
No se pudo convertir java.awt.Graphics.drawString(AttributedCharacterIterator, int, int)
No se pudo convertir java.awt.Graphics.drawString(int, int)
No se pudo convertir java.awt.Graphics.fill3DRect
No se pudo convertir java.awt.Graphics.fillRoundRect
No se pudo convertir java.awt.Graphics.finalize
No se pudo convertir java.awt.Graphics.getClip
No se pudo convertir java.awt.Graphics.setClip
No se pudo convertir java.awt.Graphics.setPaintMode
No se pudo convertir java.awt.Graphics.setXORMode
No se pudo convertir java.awt.Graphics2D.addRenderingHints
No se pudo convertir java.awt.Graphics2D.clip
No se pudo convertir java.awt.Graphics2D.draw
No se pudo convertir java.awt.Graphics2D.drawGlyphVector
No se pudo convertir java.awt.Graphics2D.drawImage
No se pudo convertir java.awt.Graphics2D.drawRenderableImage
No se pudo convertir java.awt.Graphics2D.drawRenderedImage
No se pudo convertir java.awt.Graphics2D.drawString
No se pudo convertir java.awt.Graphics2D.fill
No se pudo convertir java.awt.Graphics2D.fill3DRect
No se pudo convertir java.awt.Graphics2D.getComposite
No se pudo convertir java.awt.Graphics2D.getDeviceConfiguration
No se pudo convertir java.awt.Graphics2D.getPaint
No se pudo convertir java.awt.Graphics2D.getRenderingHint
No se pudo convertir java.awt.Graphics2D.getRenderingHints
No se pudo convertir java.awt.Graphics2D.getStroke
No se pudo convertir java.awt.Graphics2D.Graphics2D
No se pudo convertir java.awt.Graphics2D.hit
No se pudo convertir java.awt.Graphics2D.rotate
No se pudo convertir java.awt.Graphics2D.setComposite
No se pudo convertir java.awt.Graphics2D.setPaint
No se pudo convertir java.awt.Graphics2D.setRenderingHint
No se pudo convertir java.awt.Graphics2D.setRenderingHints
No se pudo convertir java.awt.Graphics2D.setStroke
No se pudo convertir java.awt.Graphics2D.shear
No se pudo convertir java.awt.Graphics2D.transform
No se pudo convertir java.awt.GraphicsConfigTemplate
No se pudo convertir java.awt.GraphicsConfiguration
No se pudo convertir java.awt.GraphicsDevice
No se pudo convertir java.awt.GraphicsEnvironment
No se pudo convertir java.awt.GraphicsEnvironment.getAllFonts
No se pudo convertir java.awt.GraphicsEnvironment.getAvailableFontFamilyNames
No se pudo convertir java.awt.GraphicsEnvironment.getAvailableFontFamilyNames(Locale)
No se pudo convertir java.awt.GraphicsEnvironment.getDefaultScreenDevice
No se pudo convertir java.awt.GraphicsEnvironment.getScreenDevices
No se pudo convertir java.awt.GridBagConstraints
No se pudo convertir java.awt.GridBagLayout
No se pudo convertir java.awt.GridLayout
No se pudo convertir java.awt.GridLayout.addLayoutComponent
No se pudo convertir java.awt.GridLayout.GridLayout
No se pudo convertir java.awt.GridLayout.GridLayout(int, int)
No se pudo convertir java.awt.GridLayout.GridLayout(int, int, int, int)
No se pudo convertir java.awt.GridLayout.layoutContainer
No se pudo convertir java.awt.GridLayout.minimumLayoutSize
No se pudo convertir java.awt.GridLayout.preferredLayoutSize
No se pudo convertir java.awt.GridLayout.removeLayoutComponent
No se pudo convertir java.awt.Image.getProperty
No se pudo convertir java.awt.Image.SCALE_<Algoritmo>
No se pudo convertir java.awt.Image.UndefinedProperty
No se pudo convertir java.awt.ItemSelectable
No se pudo convertir java.awt.JobAttributes.DestinationType
No se pudo convertir java.awt.JobAttributes.DialogType
No se pudo convertir java.awt.JobAttributes.getDefaultSelection
No se pudo convertir java.awt.JobAttributes.getDestination
No se pudo convertir java.awt.JobAttributes.getDialog
No se pudo convertir java.awt.JobAttributes.getFileName
No se pudo convertir java.awt.JobAttributes.getMultipleDocumentHandling
No se pudo convertir java.awt.JobAttributes.getPageRanges
No se pudo convertir java.awt.JobAttributes.getSides
No se pudo convertir java.awt.JobAttributes.JobAttributes
No se pudo convertir java.awt.JobAttributes.MultipleDocumentHandlingType
No se pudo convertir java.awt.JobAttributes.setDefaultSelection
No se pudo convertir java.awt.JobAttributes.setDestination
No se pudo convertir java.awt.JobAttributes.setDialog
No se pudo convertir java.awt.JobAttributes.setFileName
No se pudo convertir java.awt.JobAttributes.setMultipleDocumentHandling
No se pudo convertir java.awt.JobAttributes.setMultipleDocumentHandlingToDefault
No se pudo convertir java.awt.JobAttributes.setPageRanges
No se pudo convertir java.awt.JobAttributes.setSides
No se pudo convertir java.awt.JobAttributes.setSidesToDefault
No se pudo convertir java.awt.Label.setAlignment
No se pudo convertir java.awt.LayoutManager
No se pudo convertir java.awt.LayoutManager2
No se pudo convertir java.awt.List.delItems
No se pudo convertir java.awt.List.getListeners
No se pudo convertir java.awt.MediaTracker
No se pudo convertir java.awt.Menu.getAccessibleContext
No se pudo convertir java.awt.Menu.isTearOff
No se pudo convertir java.awt.MenuBar.deleteShortcut
No se pudo convertir java.awt.MenuBar.getAccessibleContext
No se pudo convertir java.awt.MenuBar.getHelpMenu
No se pudo convertir java.awt.MenuBar.getShortcutMenuItem
No se pudo convertir java.awt.MenuBar.setHelpMenu
No se pudo convertir java.awt.MenuBar.shortcuts
No se pudo convertir java.awt.MenuComponent.dispatchEvent
No se pudo convertir java.awt.MenuComponent.getAccessibleContext
No se pudo convertir java.awt.MenuComponent.getTreeLock
No se pudo convertir java.awt.MenuComponent.MenuComponent
No se pudo convertir java.awt.MenuComponent.postEvent
No se pudo convertir java.awt.MenuComponent.setFont
No se pudo convertir java.awt.MenuContainer.postEvent
No se pudo convertir java.awt.MenuItem.disableEvents
No se pudo convertir java.awt.MenuItem.enableEvents
No se pudo convertir java.awt.MenuItem.getAccessibleContext
No se pudo convertir java.awt.MenuItem.getActionCommand
No se pudo convertir java.awt.MenuItem.getListeners
No se pudo convertir java.awt.MenuItem.setActionCommand
No se pudo convertir java.awt.MenuShortcut.MenuShortcut
No se pudo convertir java.awt.MenuShortcut.usesShiftModifier
No se pudo convertir java.awt.PageAttributes.getOrigin
No se pudo convertir java.awt.PageAttributes.MediaType.<TipoPapel>
No se pudo convertir java.awt.PageAttributes.PageAttributes
No se pudo convertir java.awt.PageAttributes.setMedia
No se pudo convertir java.awt.PageAttributes.setMediaToDefault
No se pudo convertir java.awt.PageAttributes.setOrigin
No se pudo convertir java.awt.PageAttributes.setPrinterResolution(int)
No se pudo convertir java.awt.PageAttributes.setPrinterResolution(int[])
No se pudo convertir java.awt.PageAttributes.setPrintQuality(int)
No se pudo convertir java.awt.PageAttributes.setPrintQuality(PageAttributesPrintQualityType)
No se pudo convertir java.awt.Paint.createContext
No se pudo convertir java.awt.PaintContext
No se pudo convertir java.awt.Panel.Panel
No se pudo convertir java.awt.Point.getX
No se pudo convertir java.awt.Point.getY
No se pudo convertir java.awt.Point.setLocation
No se pudo convertir java.awt.Polygon.addPoint
No se pudo convertir java.awt.Polygon.bounds
No se pudo convertir java.awt.Polygon.contains(double, double)
No se pudo convertir java.awt.Polygon.contains(double, double, double, double)
No se pudo convertir java.awt.Polygon.contains(Rectangle2D)
No se pudo convertir java.awt.Polygon.getPathIterator
No se pudo convertir java.awt.Polygon.intersects(double, double, double, double)
No se pudo convertir java.awt.Polygon.intersects(Rectangle2D)
No se pudo convertir java.awt.Polygon.npoints
No se pudo convertir java.awt.Polygon.Polygon
No se pudo convertir java.awt.PopupMenu.getAccessibleContext
No se pudo convertir java.awt.PopupMenu.show
No se pudo convertir java.awt.PrintGraphics
No se pudo convertir java.awt.PrintJob
No se pudo convertir java.awt.Rectangle.outcode
No se pudo convertir java.awt.Rectangle.setRect
No se pudo convertir java.awt.RenderingHints.<ValorPropiedad>
No se pudo convertir java.awt.RenderingHints.add
No se pudo convertir java.awt.RenderingHints.Key
No se pudo convertir java.awt.RenderingHints.putAll
No se pudo convertir java.awt.RenderingHints.RenderingHints
No se pudo convertir java.awt.Robot
No se pudo convertir java.awt.Scrollbar
No se pudo convertir java.awt.Scrollbar.addAdjustmentListener
No se pudo convertir java.awt.Scrollbar.getListeners
No se pudo convertir java.awt.Scrollbar.getVisible
No se pudo convertir java.awt.Scrollbar.getVisibleAmount
No se pudo convertir java.awt.Scrollbar.paramString
No se pudo convertir java.awt.Scrollbar.processAdjustmentEvent
No se pudo convertir java.awt.Scrollbar.Scrollbar
No se pudo convertir java.awt.Scrollbar.Scrollbar
No se pudo convertir java.awt.Scrollbar.setOrientation
No se pudo convertir java.awt.Scrollbar.setVisibleAmount
No se pudo convertir java.awt.ScrollPane.get*Adjustable
No se pudo convertir java.awt.ScrollPane.printComponents
No se pudo convertir java.awt.ScrollPane.ScrollPane
No se pudo convertir java.awt.ScrollPane.setLayout
No se pudo convertir java.awt.Shape
No se pudo convertir java.awt.Shape.contains(double,double)
No se pudo convertir java.awt.Shape.contains(double, double, double, double)
No se pudo convertir java.awt.Shape.contains(Rectangle2D)
No se pudo convertir java.awt.Shape.getPathIterator
No se pudo convertir java.awt.Shape.intersects(double,double,double,double)
No se pudo convertir java.awt.Shape.intersects(Rectangle2D)
No se pudo convertir java.awt.Stroke
No se pudo convertir java.awt.Stroke.createStrokedShape
No se pudo convertir java.awt.SystemColor.createContext
No se pudo convertir java.awt.SystemColor.NUM_COLORS
No se pudo convertir java.awt.SystemColor.TEXT
No se pudo convertir java.awt.SystemColor.TEXT_HIGHLIGHT
No se pudo convertir java.awt.SystemColor.TEXT_HIGHLIGHT_TEXT
No se pudo convertir java.awt.SystemColor.TEXT_INACTIVE_TEXT
No se pudo convertir java.awt.SystemColor.TEXT_TEXT
No se pudo convertir java.awt.SystemColor.textHighlight
No se pudo convertir java.awt.SystemColor.textHighlightText
No se pudo convertir java.awt.SystemColor.textInactiveText
No se pudo convertir java.awt.SystemColor.textText
No se pudo convertir java.awt.TextArea.*Columns
No se pudo convertir java.awt.TextArea.*Rows
No se pudo convertir java.awt.TextComponent.enableInputMethods
No se pudo convertir java.awt.TextComponent.getBackground
No se pudo convertir java.awt.TextComponent.getListeners
No se pudo convertir java.awt.TextComponent.processTextEvent
No se pudo convertir java.awt.TextComponent.setText
No se pudo convertir java.awt.TextComponent.textListener
No se pudo convertir java.awt.TextField.*Columns
No se pudo convertir java.awt.TextField.getColumns
No se pudo convertir java.awt.TextField.getListeners
No se pudo convertir java.awt.TextField.getPreferredSize
No se pudo convertir java.awt.TextField.preferredSize
No se pudo convertir java.awt.TextField.setColumns
No se pudo convertir java.awt.TextField.TextField
No se pudo convertir java.awt.TexturePaint.createContext
No se pudo convertir java.awt.TexturePaint.getAnchorRect
No se pudo convertir java.awt.TexturePaint.getTransparency
No se pudo convertir java.awt.Toolkit
No se pudo convertir java.awt.Transparency
No se pudo convertir java.awt.Window.applyResourceBundle
No se pudo convertir java.awt.Window.getGraphicsConfiguration
No se pudo convertir java.awt.Window.getInputContext
No se pudo convertir java.awt.Window.getListeners
No se pudo convertir java.awt.Window.getToolkit
No se pudo convertir java.awt.Window.getWarningString
No se pudo convertir java.awt.Window.pack
No se pudo convertir java.awt.Window.postEvent
No se pudo convertir java.awt.Window.processWindowEvent
No se pudo convertir java.awt.Window.Window
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.color


No se pudo convertir java.awt.color.ColorSpace
No se pudo convertir java.awt.color.ICC_ColorSpace
No se pudo convertir java.awt.color.ICC_Profile
No se pudo convertir java.awt.color.ICC_ProfileGray
No se pudo convertir java.awt.color.ICC_ProfileRGB
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Java.awt.datatransfer


No se pudo convertir java.awt.datatransfer.Clipboard.Clipboard
No se pudo convertir java.awt.datatransfer.Clipboard.contents
No se pudo convertir java.awt.datatransfer.Clipboard.getName
No se pudo convertir java.awt.datatransfer.Clipboard.owner
No se pudo convertir java.awt.datatransfer.ClipboardOwner
No se pudo convertir java.awt.datatransfer.DataFlavor.clone
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(clase, cadena)
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(DataFlavor)
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(cadena)
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(cadena, cadena)
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(cadena, cadena, ClassLoader)
No se pudo convertir java.awt.datatransfer.DataFlavor.DataFlavor(cadena, cadena, MimeTypeParameterList, clase, j)
No se pudo convertir java.awt.datatransfer.DataFlavor.equals
No se pudo convertir java.awt.datatransfer.DataFlavor.getDefaultRepresentationClass
No se pudo convertir java.awt.datatransfer.DataFlavor.getDefaultRepresentationClassAsString
No se pudo convertir java.awt.datatransfer.DataFlavor.getHumanPresentableName
No se pudo convertir java.awt.datatransfer.DataFlavor.getMimeType
No se pudo convertir java.awt.datatransfer.DataFlavor.getParameter
No se pudo convertir java.awt.datatransfer.DataFlavor.getPrimaryType
No se pudo convertir java.awt.datatransfer.DataFlavor.getReaderForText
No se pudo convertir java.awt.datatransfer.DataFlavor.getRepresentationClass
No se pudo convertir java.awt.datatransfer.DataFlavor.getSubType
No se pudo convertir java.awt.datatransfer.DataFlavor.isFlavorJavaFileListType
No se pudo convertir java.awt.datatransfer.DataFlavor.isFlavorRemoteObjectType
No se pudo convertir java.awt.datatransfer.DataFlavor.isMimeTypeEqual
No se pudo convertir java.awt.datatransfer.DataFlavor.isMimeTypeSerializedObject
No se pudo convertir java.awt.datatransfer.DataFlavor.isRepresentationClassInputStream
No se pudo convertir java.awt.datatransfer.DataFlavor.isRepresentationClassRemote
No se pudo convertir java.awt.datatransfer.DataFlavor.isRepresentationClassSerializable
No se pudo convertir java.awt.datatransfer.DataFlavor.javaFileListFlavor
No se pudo convertir java.awt.datatransfer.DataFlavor.javaJVMLocalObjectMimeType
No se pudo convertir java.awt.datatransfer.DataFlavor.javaRemoteObjectMimeType
No se pudo convertir java.awt.datatransfer.DataFlavor.normalizeMimeType
No se pudo convertir java.awt.datatransfer.DataFlavor.normalizeMimeTypeParameter
No se pudo convertir java.awt.datatransfer.DataFlavor.readExternal
No se pudo convertir java.awt.datatransfer.DataFlavor.selectBestTextFlavor
No se pudo convertir java.awt.datatransfer.DataFlavor.setHumanPresentableName
No se pudo convertir java.awt.datatransfer.DataFlavor.tryToLoadClass
No se pudo convertir java.awt.datatransfer.DataFlavor.writeExternal
No se pudo convertir java.awt.datatransfer.FlavorMap
No se pudo convertir java.awt.datatransfer.StringSelection.getTransferDataFlavors
No se pudo convertir java.awt.datatransfer.StringSelection.isDataFlavorSupported
No se pudo convertir java.awt.datatransfer.StringSelection.lostOwnership
No se pudo convertir java.awt.datatransfer.SystemFlavorMap
No se pudo convertir java.awt.datatransfer.Transferable.getTransferDataFlavors
No se pudo convertir java.awt.datatransfer.Transferable.isDataFlavorSupported
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.dnd


No se pudo convertir java.awt.dnd.Autoscroll
No se pudo convertir java.awt.dnd.DragGestureEvent.DragGestureEvent
No se pudo convertir java.awt.dnd.DragGestureEvent.getDragAction
No se pudo convertir java.awt.dnd.DragGestureEvent.getDragSource
No se pudo convertir java.awt.dnd.DragGestureEvent.getSourceAsDragGestureRecognizer
No se pudo convertir java.awt.dnd.DragGestureEvent.getTriggerEvent
No se pudo convertir java.awt.dnd.DragGestureEvent.iterator
No se pudo convertir java.awt.dnd.DragGestureEvent.toArray
No se pudo convertir java.awt.dnd.DragGestureRecognizer
No se pudo convertir java.awt.dnd.DragSource.createDragSourceContext
No se pudo convertir java.awt.dnd.DragSource.DefaultCopyDrop
No se pudo convertir java.awt.dnd.DragSource.DefaultCopyNoDrop
No se pudo convertir java.awt.dnd.DragSource.DefaultLinkDrop
No se pudo convertir java.awt.dnd.DragSource.DefaultLinkNoDrop
No se pudo convertir java.awt.dnd.DragSource.DefaultMoveDrop
No se pudo convertir java.awt.dnd.DragSource.DefaultMoveNoDrop
No se pudo convertir java.awt.dnd.DragSource.DragSource
No se pudo convertir java.awt.dnd.DragSource.getDefaultDragSource
No se pudo convertir java.awt.dnd.DragSource.getFlavorMap
No se pudo convertir java.awt.dnd.DragSource.isDragImageSupported
No se pudo convertir java.awt.dnd.DragSourceContext
No se pudo convertir java.awt.dnd.DragSourceDragEvent.DragSourceDragEvent
No se pudo convertir java.awt.dnd.DragSourceDropEvent.DragSourceDropEvent
No se pudo convertir java.awt.dnd.DragSourceDropEvent.getDropSuccess
No se pudo convertir java.awt.dnd.DragSourceEvent.DragSourceEvent
No se pudo convertir java.awt.dnd.DragSourceEvent.getDragSourceContext
No se pudo convertir java.awt.dnd.DragSourceListener.dropActionChanged
No se pudo convertir java.awt.dnd.DropTarget
No se pudo convertir java.awt.dnd.DropTarget.setComponent
No se pudo convertir java.awt.dnd.DropTargetContext
No se pudo convertir java.awt.dnd.DropTargetDragEvent.DropTargetDragEvent
No se pudo convertir java.awt.dnd.DropTargetDragEvent.getCurrentDataFlavors
No se pudo convertir java.awt.dnd.DropTargetDragEvent.getCurrentDataFlavorsAsList
No se pudo convertir java.awt.dnd.DropTargetDragEvent.isDataFlavorSupported
No se pudo convertir java.awt.dnd.DropTargetDragEvent.rejectDrag
No se pudo convertir ava.awt.dnd.DropTargetDropEvent.dropComplete
No se pudo convertir java.awt.dnd.DropTargetDropEvent.DropTargetDropEvent(DropTargetContext, Point, int, int)
No se pudo convertir java.awt.dnd.DropTargetDropEvent.DropTargetDropEvent(DropTargetContext, Point, int, int, boolean)
No se pudo convertir java.awt.dnd.DropTargetDropEvent.getCurrentDataFlavors
No se pudo convertir java.awt.dnd.DropTargetDropEvent.getCurrentDataFlavorsAsList
No se pudo convertir java.awt.dnd.DropTargetDropEvent.isDataFlavorSupported
No se pudo convertir java.awt.dnd.DropTargetDropEvent.isLocalTransfer
No se pudo convertir java.awt.dnd.DropTargetDropEvent.rejectDrop
No se pudo convertir java.awt.dnd.DropTargetEvent
No se pudo convertir java.awt.dnd.InvalidDnDOperationException
No se pudo convertir java.awt.dnd.MouseDragGestureRecognizer
No se pudo convertir java.awt.dnd.peer.DragSourceContextPeer
No se pudo convertir java.awt.dnd.peer.DropTargetContextPeer
No se pudo convertir java.awt.dnd.peer.DropTargetPeer
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Java.awt.event


No se pudo convertir java.awt.event.<NombreClase>.<TipoEvento>_FIRST
No se pudo convertir java.awt.event.<NombreClase>.<TipoEvento>_LAST
No se pudo convertir java.awt.event.ActionEvent.<NombreClave>_MASK
No se pudo convertir java.awt.event.ActionEvent.ACTION_PERFORMED
No se pudo convertir java.awt.event.ActionEvent.getActionCommand
No se pudo convertir java.awt.event.AWTEventListener
No se pudo convertir java.awt.event.ComponentEvent.COMPONENT_<TipoEvento>
No se pudo convertir java.awt.event.FocusEvent.FOCUS_<TipoEvento>
No se pudo convertir java.awt.event.FocusEvent.isTemporary
No se pudo convertir java.awt.event.HierarchyBoundsAdapter
No se pudo convertir java.awt.event.HierarchyBoundsListener
No se pudo convertir java.awt.event.HierarchyEvent
No se pudo convertir java.awt.event.HierarchyListener
No se pudo convertir java.awt.event.InputEvent
No se pudo convertir java.awt.event.InputMethodEvent
No se pudo convertir java.awt.event.InputMethodListener
No se pudo convertir java.awt.event.InvocationEvent
No se pudo convertir java.awt.event.ItemEvent.<TipoEvento>
No se pudo convertir java.awt.event.ItemEvent.getStateChange
No se pudo convertir java.awt.event.KeyEvent.<ClaveVirtual>
No se pudo convertir java.awt.event.KeyEvent.CHAR_UNDEFINED
No se pudo convertir java.awt.event.KeyEvent.getKeyChar
No se pudo convertir java.awt.event.KeyEvent.getKeyCode
No se pudo convertir java.awt.event.KeyEvent.getKeyModifiersText
No se pudo convertir java.awt.event.KeyEvent.getKeyText
No se pudo convertir java.awt.event.KeyEvent.isActionKey
No se pudo convertir java.awt.event.KeyEvent.KEY_<TipoEvento>
No se pudo convertir java.awt.event.KeyEvent.setKeyChar
No se pudo convertir java.awt.event.KeyEvent.setKeyCode
No se pudo convertir java.awt.event.KeyEvent.setModifiers
No se pudo convertir java.awt.event.KeyEvent.setSource
No se pudo convertir java.awt.event.KeyEvent.VK.<ClaveVirtual>
No se pudo convertir java.awt.event.KeyEvent.VK_<NombreCarácter>
No se pudo convertir java.awt.event.MouseEvent.getClickCount
No se pudo convertir java.awt.event.MouseEvent.getPoint
No se pudo convertir java.awt.event.MouseEvent.getX
No se pudo convertir java.awt.event.MouseEvent.getY
No se pudo convertir java.awt.event.MouseEvent.isPopupTrigger
No se pudo convertir java.awt.event.MouseEvent.MOUSE_<TipoEvento>
No se pudo convertir java.awt.event.MouseEvent.translatePoint
No se pudo convertir java.awt.event.PaintEvent.<TipoEvento>
No se pudo convertir java.awt.event.PaintEvent.setUpdateRect
No se pudo convertir java.awt.event.TextEvent.TEXT_VALUE_CHANGED
No se pudo convertir java.awt.event.WindowEvent.WINDOW_<TipoEvento>
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.font


No se pudo convertir java.awt.font.FontRenderContext
No se pudo convertir java.awt.font.FontRenderContext.FontRenderContext
No se pudo convertir java.awt.font.FontRenderContext.getTransform
No se pudo convertir java.awt.font.FontRenderContext.isAntiAliased
No se pudo convertir java.awt.font.FontRenderContext.usesFractionalMetrics
No se pudo convertir java.awt.font.GlyphJustificationInfo
No se pudo convertir java.awt.font.GlyphMetrics
No se pudo convertir java.awt.font.GlyphVector
No se pudo convertir java.awt.font.GraphicAttribute
No se pudo convertir java.awt.font.GraphicAttribute.<NombreAtributo>
No se pudo convertir java.awt.font.GraphicAttribute.draw
No se pudo convertir java.awt.font.GraphicAttribute.getAdvance
No se pudo convertir java.awt.font.GraphicAttribute.getAlignment
No se pudo convertir java.awt.font.GraphicAttribute.getAscent
No se pudo convertir java.awt.font.GraphicAttribute.getBounds
No se pudo convertir java.awt.font.GraphicAttribute.getDescent
No se pudo convertir java.awt.font.GraphicAttribute.getJustificationInfo
No se pudo convertir java.awt.font.GraphicAttribute.GraphicAttribute
No se pudo convertir java.awt.font.ImageGraphicAttribute
No se pudo convertir java.awt.font.ImageGraphicAttribute.draw
No se pudo convertir java.awt.font.ImageGraphicAttribute.equals
No se pudo convertir java.awt.font.ImageGraphicAttribute.getAdvance
No se pudo convertir java.awt.font.ImageGraphicAttribute.getAscent
No se pudo convertir java.awt.font.ImageGraphicAttribute.getBounds
No se pudo convertir java.awt.font.ImageGraphicAttribute.getDescent
No se pudo convertir java.awt.font.ImageGraphicAttribute.hashCode
No se pudo convertir java.awt.font.ImageGraphicAttribute.ImageGraphicAttribute
No se pudo convertir java.awt.font.LineBreakMeasurer
No se pudo convertir java.awt.font.LineBreakMeasurer.deleteChar
No se pudo convertir java.awt.font.LineBreakMeasurer.getPosition
No se pudo convertir java.awt.font.LineBreakMeasurer.insertChar
No se pudo convertir java.awt.font.LineBreakMeasurer.LineBreakMeasurer
No se pudo convertir java.awt.font.LineBreakMeasurer.nextLayout
No se pudo convertir java.awt.font.LineBreakMeasurer.nextOffset
No se pudo convertir java.awt.font.LineBreakMeasurer.setPosition
No se pudo convertir java.awt.font.LineMetrics
No se pudo convertir java.awt.font.LineMetrics.getAscent
No se pudo convertir java.awt.font.LineMetrics.getBaselineIndex
No se pudo convertir java.awt.font.LineMetrics.getBaselineOffsets
No se pudo convertir java.awt.font.LineMetrics.getDescent
No se pudo convertir java.awt.font.LineMetrics.getHeight
No se pudo convertir java.awt.font.LineMetrics.getLeading
No se pudo convertir java.awt.font.LineMetrics.getNumChars
No se pudo convertir java.awt.font.LineMetrics.getStrikethroughOffset
No se pudo convertir java.awt.font.LineMetrics.getStrikethroughThickness
No se pudo convertir java.awt.font.LineMetrics.getUnderlineOffset
No se pudo convertir java.awt.font.LineMetrics.getUnderlineThickness
No se pudo convertir java.awt.font.LineMetrics.LineMetrics
No se pudo convertir java.awt.font.MultipleMaster
No se pudo convertir java.awt.font.OpenType
No se pudo convertir java.awt.font.OpenType.<TipoEtiqueta>
No se pudo convertir java.awt.font.OpenType.getFontTable(int)
No se pudo convertir java.awt.font.OpenType.getFontTable(int, int, int)
No se pudo convertir java.awt.font.OpenType.getFontTable(String)
No se pudo convertir java.awt.font.OpenType.getFontTable(String, int, int)
No se pudo convertir java.awt.font.OpenType.getFontTableSize
No se pudo convertir java.awt.font.OpenType.getVersion
No se pudo convertir java.awt.font.ShapeGraphicAttribute
No se pudo convertir java.awt.font.ShapeGraphicAttribute.draw
No se pudo convertir java.awt.font.ShapeGraphicAttribute.equals
No se pudo convertir java.awt.font.ShapeGraphicAttribute.FILL
No se pudo convertir java.awt.font.ShapeGraphicAttribute.getAdvance
No se pudo convertir java.awt.font.ShapeGraphicAttribute.getAscent
No se pudo convertir java.awt.font.ShapeGraphicAttribute.getBounds
No se pudo convertir java.awt.font.ShapeGraphicAttribute.getDescent
No se pudo convertir java.awt.font.ShapeGraphicAttribute.hashCode
No se pudo convertir java.awt.font.ShapeGraphicAttribute.ShapeGraphicAttribute
No se pudo convertir java.awt.font.ShapeGraphicAttribute.STROKE
No se pudo convertir java.awt.font.TextAttribute
No se pudo convertir java.awt.font.TextHitInfo
No se pudo convertir java.awt.font.TextHitInfo.afterOffset
No se pudo convertir java.awt.font.TextHitInfo.beforeOffset
No se pudo convertir java.awt.font.TextHitInfo.equals
No se pudo convertir java.awt.font.TextHitInfo.getCharIndex
No se pudo convertir java.awt.font.TextHitInfo.getInsertionIndex
No se pudo convertir java.awt.font.TextHitInfo.getOffsetHit
No se pudo convertir java.awt.font.TextHitInfo.getOtherHit
No se pudo convertir java.awt.font.TextHitInfo.hashCode
No se pudo convertir java.awt.font.TextHitInfo.isLeadingEdge
No se pudo convertir java.awt.font.TextHitInfo.leading
No se pudo convertir java.awt.font.TextHitInfo.toString
No se pudo convertir java.awt.font.TextHitInfo.trailing
No se pudo convertir java.awt.font.TextLayout
No se pudo convertir java.awt.font.TextLayout.CaretPolicy
No se pudo convertir java.awt.font.TextLayout.CaretPolicy.CaretPolicy
No se pudo convertir java.awt.font.TextLayout.CaretPolicy.getStrongCaret
No se pudo convertir java.awt.font.TextLayout.clone
No se pudo convertir java.awt.font.TextLayout.DEFAULT_CARET_POLICY
No se pudo convertir java.awt.font.TextLayout.draw
No se pudo convertir java.awt.font.TextLayout.equals
No se pudo convertir java.awt.font.TextLayout.getAdvance
No se pudo convertir java.awt.font.TextLayout.getAscent
No se pudo convertir java.awt.font.TextLayout.getBaseline
No se pudo convertir java.awt.font.TextLayout.getBaselineOffsets
No se pudo convertir java.awt.font.TextLayout.getBlackBoxBounds
No se pudo convertir java.awt.font.TextLayout.getBounds
No se pudo convertir java.awt.font.TextLayout.getCaretInfo
No se pudo convertir java.awt.font.TextLayout.getCaretShape
No se pudo convertir java.awt.font.TextLayout.getCaretShapes
No se pudo convertir java.awt.font.TextLayout.getCharacterCount
No se pudo convertir java.awt.font.TextLayout.getCharacterLevel
No se pudo convertir java.awt.font.TextLayout.getDescent
No se pudo convertir java.awt.font.TextLayout.getJustifiedLayout
No se pudo convertir java.awt.font.TextLayout.getLeading
No se pudo convertir java.awt.font.TextLayout.getLogicalHighlightShape
No se pudo convertir java.awt.font.TextLayout.getLogicalRangesForVisualSelection
No se pudo convertir java.awt.font.TextLayout.getNextLeftHit
No se pudo convertir java.awt.font.TextLayout.getNextRightHit
No se pudo convertir java.awt.font.TextLayout.getOutline
No se pudo convertir java.awt.font.TextLayout.getVisibleAdvance
No se pudo convertir java.awt.font.TextLayout.getVisualHighlightShape
No se pudo convertir java.awt.font.TextLayout.getVisualOtherHit
No se pudo convertir java.awt.font.TextLayout.handleJustify
No se pudo convertir java.awt.font.TextLayout.hashCode
No se pudo convertir java.awt.font.TextLayout.hitTestChar
No se pudo convertir java.awt.font.TextLayout.isLeftToRight
No se pudo convertir java.awt.font.TextLayout.isVertical
No se pudo convertir java.awt.font.TextLayout.TextLayout
No se pudo convertir java.awt.font.TextLayout.toString
No se pudo convertir java.awt.font.TextMeasurer
No se pudo convertir java.awt.font.TransformAttribute
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.geom


No se pudo convertir java.awt.geom.AffineTransform.<Tipo>
No se pudo convertir java.awt.geom.AffineTransform.clone
No se pudo convertir java.awt.geom.AffineTransform.concatenate
No se pudo convertir java.awt.geom.AffineTransform.createTransformedShape
No se pudo convertir java.awt.geom.AffineTransform.deltaTransform(double[], int, double[], int, int)
No se pudo convertir java.awt.geom.AffineTransform.deltaTransform(Point2D, Point2D)
No se pudo convertir java.awt.geom.AffineTransform.getType
No se pudo convertir java.awt.geom.AffineTransform.inverseTransform(double[], int, double[], int, int)
No se pudo convertir java.awt.geom.AffineTransform.inverseTransform(Point2D, Point2D)
No se pudo convertir java.awt.geom.AffineTransform.preConcatenate
No se pudo convertir java.awt.geom.AffineTransform.setTransform(AffineTransform)
N se puedo convertir java.awt.geom.AffineTransform.setTransform(double, double, double, double, double, double)
No se pudo convertir java.awt.geom.AffineTransform.transform
No se pudo convertir java.awt.geom.Arc2D.Arc2D
No se pudo convertir java.awt.geom.Arc2D.containsAngle
No se pudo convertir java.awt.geom.Arc2D.Double.Double
No se pudo convertir java.awt.geom.Arc2D.Double.extent
No se pudo convertir java.awt.geom.Arc2D.Double.getAngleExtent
No se pudo convertir java.awt.geom.Arc2D.Double.getAngleStart
No se pudo convertir java.awt.geom.Arc2D.Double.getHeight
No se pudo convertir java.awt.geom.Arc2D.Double.getWidth
No se pudo convertir java.awt.geom.Arc2D.Double.getX
No se pudo convertir java.awt.geom.Arc2D.Double.getY
No se pudo convertir java.awt.geom.Arc2D.Double.height
No se pudo convertir java.awt.geom.Arc2D.Double.makeBounds
No se pudo convertir java.awt.geom.Arc2D.Double.setAngleExtent
No se pudo convertir java.awt.geom.Arc2D.Double.setAngleStart
No se pudo convertir java.awt.geom.Arc2D.Double.start
No se pudo convertir java.awt.geom.Arc2D.Double.width
No se pudo convertir java.awt.geom.Arc2D.Double.x
No se pudo convertir java.awt.geom.Arc2D.Double.y
No se pudo convertir java.awt.geom.Arc2D.Float.extent
No se pudo convertir java.awt.geom.Arc2D.Float.Float
No se pudo convertir java.awt.geom.Arc2D.Float.getAngleExtent
No se pudo convertir java.awt.geom.Arc2D.Float.getAngleStart
No se pudo convertir java.awt.geom.Arc2D.Float.getHeight
No se pudo convertir java.awt.geom.Arc2D.Float.getWidth
No se pudo convertir java.awt.geom.Arc2D.Float.getX
No se pudo convertir java.awt.geom.Arc2D.Float.getY
No se pudo convertir java.awt.geom.Arc2D.Float.height
No se pudo convertir java.awt.geom.Arc2D.Float.makeBounds
No se pudo convertir java.awt.geom.Arc2D.Float.setAngleExtent
No se pudo convertir java.awt.geom.Arc2D.Float.setAngleStart
No se pudo convertir java.awt.geom.Arc2D.Float.start
No se pudo convertir java.awt.geom.Arc2D.Float.width
No se pudo convertir java.awt.geom.Arc2D.Float.x
No se pudo convertir java.awt.geom.Arc2D.Float.y
No se pudo convertir java.awt.geom.Arc2D.getAngleExtent
No se pudo convertir java.awt.geom.Arc2D.getAngleStart
No se pudo convertir java.awt.geom.Arc2D.getArcType
No se pudo convertir java.awt.geom.Arc2D.makeBounds
No se pudo convertir java.awt.geom.Arc2D.setAngleExtent
No se pudo convertir java.awt.geom.Arc2D.setAngles(double, double, double, double)
No se pudo convertir java.awt.geom.Arc2D.setAngles(Point2D)
No se pudo convertir java.awt.geom.Arc2D.setAngleStart(double)
No se pudo convertir java.awt.geom.Arc2D.setAngleStart(Point2D)
No se pudo convertir java.awt.geom.Arc2D.setArcByCenter
No se pudo convertir java.awt.geom.Arc2D.setArcByTangent
No se pudo convertir java.awt.geom.Arc2D.setArcType
No se pudo convertir java.awt.geom.Arc2D.setFrame
No se pudo convertir java.awt.geom.Area.add
No se pudo convertir java.awt.geom.Area.clone
No se pudo convertir java.awt.geom.Area.contains
No se pudo convertir java.awt.geom.Area.equals
No se pudo convertir java.awt.geom.Area.exclusiveOr
No se pudo convertir java.awt.geom.Area.getBounds
No se pudo convertir java.awt.geom.Area.getBounds2D
No se pudo convertir java.awt.geom.Area.getPathIterator
No se pudo convertir java.awt.geom.Area.intersects
No se pudo convertir java.awt.geom.Area.isEmpty
No se pudo convertir java.awt.geom.Area.isPolygonal
No se pudo convertir java.awt.geom.Area.isRectangular
No se pudo convertir java.awt.geom.Area.isSingular
No se pudo convertir java.awt.geom.Area.subtract
No se pudo convertir java.awt.geom.CubicCurve2D.contains
No se pudo convertir java.awt.geom.CubicCurve2D.CubicCurve2D
No se pudo convertir java.awt.geom.CubicCurve2D.Double.Double
No se pudo convertir java.awt.geom.CubicCurve2D.Float.Float
No se pudo convertir java.awt.geom.CubicCurve2D.getBounds
No se pudo convertir java.awt.geom.CubicCurve2D.getFlatness
No se pudo convertir java.awt.geom.CubicCurve2D.getFlatnessSq
No se pudo convertir java.awt.geom.CubicCurve2D.getPathIterator
No se pudo convertir java.awt.geom.CubicCurve2D.solveCubic(double[])
No se pudo convertir java.awt.geom.CubicCurve2D.solveCubic(double[], double[])
No se pudo convertir java.awt.geom.CubicCurve2D.subdivide
No se pudo convertir java.awt.geom.Dimension2D.clone
No se pudo convertir java.awt.geom.Dimension2D.Dimension2D
No se pudo convertir java.awt.geom.Ellipse2D.Double.Double
No se pudo convertir java.awt.geom.Ellipse2D.Ellipse2D
No se pudo convertir java.awt.geom.Ellipse2D.Float.Float
No se pudo convertir java.awt.geom.FlatteningPathIterator
No se pudo convertir java.awt.geom.GeneralPath.append
No se pudo convertir java.awt.geom.GeneralPath.GeneralPath
No se pudo convertir java.awt.geom.GeneralPath.GeneralPath(int)
No se pudo convertir java.awt.geom.GeneralPath.GeneralPath(int, int)
No se pudo convertir java.awt.geom.GeneralPath.GeneralPath(Shape)
No se pudo convertir java.awt.geom.GeneralPath.getBounds
No se pudo convertir java.awt.geom.GeneralPath.getBounds2D
No se pudo convertir java.awt.geom.GeneralPath.getCurrentPoint
No se pudo convertir java.awt.geom.GeneralPath.getPathIterator
No se pudo convertir java.awt.geom.GeneralPath.moveTo
No se pudo convertir java.awt.geom.GeneralPath.quadTo
No se pudo convertir java.awt.geom.Line2D.Double.Double(double, double, double, double)
No se pudo convertir java.awt.geom.Line2D.Double.Double (Point2D, Point2D)
No se pudo convertir java.awt.geom.Line2D.Float.Float(float, float, float, float)
No se pudo convertir java.awt.geom.Line2D.Float.Float(Point2D, Point2D)
No se pudo convertir java.awt.geom.Line2D.getBounds
No se pudo convertir java.awt.geom.Line2D.getPathIterator
No se pudo convertir java.awt.geom.Line2D.intersectsLine
No se pudo convertir java.awt.geom.Line2D.Line2D
No se pudo convertir java.awt.geom.Line2D.linesIntersect
No se pudo convertir java.awt.geom.Line2D.ptLineDist
No se pudo convertir java.awt.geom.Line2D.ptLineDistSq
No se pudo convertir java.awt.geom.Line2D.ptSegDist
No se pudo convertir java.awt.geom.Line2D.ptSegDistSq
No se pudo convertir java.awt.geom.Line2D.relativeCCW
No se pudo convertir java.awt.geom.PathIterator
No se pudo convertir java.awt.geom.PathIterator.<TipoSegmento>
No se pudo convertir java.awt.geom.PathIterator.currentSegment
No se pudo convertir java.awt.geom.PathIterator.getWindingRule
No se pudo convertir java.awt.geom.PathIterator.isDone
No se pudo convertir java.awt.geom.PathIterator.next
No se pudo convertir java.awt.geom.Point2D.Point2D
No se pudo convertir java.awt.geom.QuadCurve2D
No se pudo convertir java.awt.geom.QuadCurve2D.Double
No se pudo convertir java.awt.geom.QuadCurve2D.Float
No se pudo convertir java.awt.geom.Rectangle2D.<Posición>
No se pudo convertir java.awt.geom.Rectangle2D.add
No se pudo convertir java.awt.geom.Rectangle2D.createIntersection
No se pudo convertir java.awt.geom.Rectangle2D.Double.createIntersection
No se pudo convertir java.awt.geom.Rectangle2D.Double.outcode
No se pudo convertir java.awt.geom.Rectangle2D.Float.createIntersection
No se pudo convertir java.awt.geom.Rectangle2D.Float.outcode
No se pudo convertir java.awt.geom.Rectangle2D.getPathIterator
No se pudo convertir java.awt.geom.Rectangle2D.intersect
No se pudo convertir java.awt.geom.Rectangle2D.intersectsLine
No se pudo convertir java.awt.geom.Rectangle2D.outcode
No se pudo convertir java.awt.geom.Rectangle2D.Rectangle2D
No se pudo convertir java.awt.geom.RectangularShape.clone
No se pudo convertir java.awt.geom.RectangularShape.getBounds
No se pudo convertir java.awt.geom.RectangularShape.getPathIterator
No se pudo convertir java.awt.geom.RectangularShape.setFrame(double, double, double, double)
No se pudo convertir java.awt.geom.RectangularShape.setFrame(Point2D, Dimension2D)
No se pudo convertir java.awt.geom.RectangularShape.setFrame(Rectangle2D)
No se pudo convertir java.awt.geom.RectangularShape.setFrameFromCenter
No se pudo convertir java.awt.geom.RectangularShape.setFrameFromDiagonal(double, double, double, double)
No se pudo convertir java.awt.geom.RectangularShape.setFrameFromDiagonal(Point2D, Point2D)
No se pudo convertir java.awt.geom.RoundRectangle2D.Double
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.archeight
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.arcwidth
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.getArcHeight
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.getArcWidth
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.height
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.setRoundRect
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.width
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.x
No se pudo convertir java.awt.geom.RoundRectangle2D.Double.y
No se pudo convertir java.awt.geom.RoundRectangle2D.Float
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.archeight
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.arcwidth
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.getArcHeight
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.getArcWidth
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.height
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.setRoundRect
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.width
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.x
No se pudo convertir java.awt.geom.RoundRectangle2D.Float.y
No se pudo convertir java.awt.geom.RoundRectangle2D.getArcHeight
No se pudo convertir java.awt.geom.RoundRectangle2D.getArcWidth
No se pudo convertir java.awt.geom.RoundRectangle2D.RoundRectangle2D
No se pudo convertir java.awt.geom.RoundRectangle2D.setFrame
No se pudo convertir java.awt.geom.RoundRectangle2D.setRoundRect
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.im


No se pudo convertir java.awt.im.InputContext
No se pudo convertir java.awt.im.InputMethodHighlight
No se pudo convertir java.awt.im.InputMethodRequests
No se pudo convertir java.awt.im.InputSubset
No se pudo convertir java.awt.im.spi.InputMethod
No se pudo convertir java.awt.im.spi.InputMethodContext
No se pudo convertir java.awt.im.spi.InputMethodDescriptor
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.image


No se pudo convertir java.awt.image.<NombreClase>.*Consumer
No se pudo convertir java.awt.image.<NombreClase>.*TopDownLeftRight*
No se pudo convertir java.awt.image.<NombreClase>.imageComplete
No se pudo convertir java.awt.image.<NombreClase>.setHints
No se pudo convertir java.awt.image.<NombreClase>.setPixels
No se pudo convertir java.awt.image.<NombreClase>.setProperties
No se pudo convertir java.awt.image.AffineTransformOp
No se pudo convertir java.awt.image.BandCombineOp
No se pudo convertir java.awt.image.BandedSampleModel
No se pudo convertir java.awt.image.BandedSampleModel.BandedSampleModel
No se pudo convertir java.awt.image.BandedSampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.BandedSampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.BandedSampleModel.getDataElements
No se pudo convertir java.awt.image.BandedSampleModel.getPixel
No se pudo convertir java.awt.image.BandedSampleModel.getPixels
No se pudo convertir java.awt.image.BandedSampleModel.getSample
No se pudo convertir java.awt.image.BandedSampleModel.getSampleDouble
No se pudo convertir java.awt.image.BandedSampleModel.getSampleFloat
No se pudo convertir java.awt.image.BandedSampleModel.getSamples
No se pudo convertir java.awt.image.BandedSampleModel.setDataElements
No se pudo convertir java.awt.image.BandedSampleModel.setSample
No se pudo convertir java.awt.image.BandedSampleModel.setSamples
No se pudo convertir java.awt.image.BufferedImage.addTileObserver
No se pudo convertir java.awt.image.BufferedImage.BufferedImage (ColorModel, Raster, Hashtable)
No se pudo convertir java.awt.image.BufferedImage.BufferedImage(int, int, int)
No se pudo convertir java.awt.image.BufferedImage.BufferedImage(int, int, int, ColorModel)
No se pudo convertir java.awt.image.BufferedImage.coerceData
No se pudo convertir java.awt.image.BufferedImage.copyData
No se pudo convertir java.awt.image.BufferedImage.getAlphaRaster
No se pudo convertir java.awt.image.BufferedImage.getColorModel
No se pudo convertir java.awt.image.BufferedImage.getHeight
No se pudo convertir java.awt.image.BufferedImage.getMinTileX
No se pudo convertir java.awt.image.BufferedImage.getMinTileY
No se pudo convertir java.awt.image.BufferedImage.getNumXTiles
No se pudo convertir java.awt.image.BufferedImage.getNumYTiles
No se pudo convertir java.awt.image.BufferedImage.getProperty
No se pudo convertir java.awt.image.BufferedImage.getPropertyNames
No se pudo convertir java.awt.image.BufferedImage.getRGB
No se pudo convertir java.awt.image.BufferedImage.getSources
No se pudo convertir java.awt.image.BufferedImage.getTile
No se pudo convertir java.awt.image.BufferedImage.getTileGridXOffset
No se pudo convertir java.awt.image.BufferedImage.getTileGridYOffset
No se pudo convertir java.awt.image.BufferedImage.getTileHeight
No se pudo convertir java.awt.image.BufferedImage.getTileWidth
No se pudo convertir java.awt.image.BufferedImage.getWidth
No se pudo convertir java.awt.image.BufferedImage.getWritableTile
No se pudo convertir java.awt.image.BufferedImage.getWritableTileIndices
No se pudo convertir java.awt.image.BufferedImage.hasTileWriters
No se pudo convertir java.awt.image.BufferedImage.isAlphaPremultiplied
No se pudo convertir java.awt.image.BufferedImage.isTileWritable
No se pudo convertir java.awt.image.BufferedImage.releaseWritableTile
No se pudo convertir java.awt.image.BufferedImage.removeTileObserver
No se pudo convertir java.awt.image.BufferedImage.setRGB
No se pudo convertir java.awt.image.BufferedImage.TYPE_BYTE_BINARY
No se pudo convertir java.awt.image.BufferedImage.TYPE_BYTE_GRAY
No se pudo convertir java.awt.image.BufferedImageFilter
No se pudo convertir java.awt.image.BufferedImageOp
No se pudo convertir java.awt.image.ByteLookupTable
No se pudo convertir java.awt.image.ColorConvertOp
No se pudo convertir java.awt.image.ConvolveOp
No se pudo convertir java.awt.image.ColorModel.coerceData
No se pudo convertir java.awt.image.ColorModel.ColorModel
No se pudo convertir java.awt.image.ColorModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.ColorModel.createCompatibleWritableRaster
No se pudo convertir java.awt.image.ColorModel.finalize
No se pudo convertir java.awt.image.ColorModel.getAlpha
No se pudo convertir java.awt.image.ColorModel.getAlphaRaster
No se pudo convertir java.awt.image.ColorModel.getBlue
No se pudo convertir java.awt.image.ColorModel.getColorSpace
No se pudo convertir java.awt.image.ColorModel.getComponents(int, int[], int)
No se pudo convertir java.awt.image.ColorModel.getComponents(object, int[], int)
No se pudo convertir java.awt.image.ColorModel.getComponentSize
No se pudo convertir java.awt.image.ColorModel.getComponentSize(int)
No se pudo convertir java.awt.image.ColorModel.getDataElement
No se pudo convertir java.awt.image.ColorModel.getDataElements(int, Object)
No se pudo convertir java.awt.image.ColorModel.getDataElements(int[], int, Object)
No se pudo convertir java.awt.image.ColorModel.getGreen
No se pudo convertir java.awt.image.ColorModel.getNormalizedComponents
No se pudo convertir java.awt.image.ColorModel.getNumColorComponents
No se pudo convertir java.awt.image.ColorModel.getNumComponents
No se pudo convertir java.awt.image.ColorModel.getRed
No se pudo convertir java.awt.image.ColorModel.getRGB
No se pudo convertir java.awt.image.ColorModel.getTransferType
No se pudo convertir java.awt.image.ColorModel.getTransparency
No se pudo convertir java.awt.image.ColorModel.getUnnormalizedComponents
No se pudo convertir java.awt.image.ComponentColorModel.coerceData
No se pudo convertir java.awt.image.ComponentColorModel.ComponentColorModel
No se pudo convertir java.awt.image.ComponentColorModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.ComponentColorModel.createCompatibleWritableRaster
No se pudo convertir java.awt.image.ComponentColorModel.getAlpha
No se pudo convertir java.awt.image.ComponentColorModel.getAlphaRaster
No se pudo convertir java.awt.image.ComponentColorModel.getBlue
No se pudo convertir java.awt.image.ComponentColorModel.getComponents
No se pudo convertir java.awt.image.ComponentColorModel.getDataElement
No se pudo convertir java.awt.image.ComponentColorModel.getDataElements(int[], int)
No se pudo convertir java.awt.image.ComponentColorModel.getDataElements(int, Object)
No se pudo convertir java.awt.image.ComponentColorModel.getGreen
No se pudo convertir java.awt.image.ComponentColorModel.getRed
No se pudo convertir java.awt.image.ComponentColorModel.getRGB
No se pudo convertir java.awt.image.ColorModel.isAlphaPremultiplied
No se pudo convertir java.awt.image.ColorModel.isCompatibleRaster
No se pudo convertir java.awt.image.ColorModel.isCompatibleSampleModel
No se pudo convertir java.awt.image.ColorModel.transferType
No se pudo convertir java.awt.image.ComponentColorModel.isCompatibleRaster
No se pudo convertir java.awt.image.ComponentColorModel.isCompatibleSampleModel
No se pudo convertir java.awt.image.ComponentSampleModel
No se pudo convertir java.awt.image.ComponentSampleModel.bandOffsets
No se pudo convertir java.awt.image.ComponentSampleModel.bankIndices
No se pudo convertir java.awt.image.ComponentSampleModel.ComponentSampleModel
No se pudo convertir java.awt.image.ComponentSampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.ComponentSampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.ComponentSampleModel.getBandOffsets
No se pudo convertir java.awt.image.ComponentSampleModel.getBankIndices
No se pudo convertir java.awt.image.ComponentSampleModel.getDataElements
No se pudo convertir java.awt.image.ComponentSampleModel.getNumDataElements
No se pudo convertir java.awt.image.ComponentSampleModel.getOffset(int, int)
No se pudo convertir java.awt.image.ComponentSampleModel.getOffset(int, int, int)
No se pudo convertir java.awt.image.ComponentSampleModel.getPixel
No se pudo convertir java.awt.image.ComponentSampleModel.getPixels
No se pudo convertir java.awt.image.ComponentSampleModel.getSample
No se pudo convertir java.awt.image.ComponentSampleModel.getSampleDouble
No se pudo convertir java.awt.image.ComponentSampleModel.getSampleFloat
No se pudo convertir java.awt.image.ComponentSampleModel.getSamples
No se pudo convertir java.awt.image.ComponentSampleModel.getSampleSize
No se pudo convertir java.awt.image.ComponentSampleModel.numBands
No se pudo convertir java.awt.image.ComponentSampleModel.numBanks
No se pudo convertir java.awt.image.ComponentSampleModel.pixelStride
No se pudo convertir java.awt.image.ComponentSampleModel.scanlineStride
No se pudo convertir java.awt.image.ComponentSampleModel.setDataElements
No se pudo convertir java.awt.image.ComponentSampleModel.setSample
No se pudo convertir java.awt.image.ComponentSampleModel.setSamples
No se pudo convertir java.awt.image.DataBuffer.<TipoDatos>
No se pudo convertir java.awt.image.DataBuffer.DataBuffer(int, int, int, int)
No se pudo convertir java.awt.image.DataBuffer.DataBuffer(int, int, int, int[])
No se pudo convertir java.awt.image.DataBuffer.dataType
No se pudo convertir java.awt.image.DataBuffer.getDataType
No se pudo convertir java.awt.image.DataBuffer.getDataTypeSize
No se pudo convertir java.awt.image.DataBuffer.getElem
No se pudo convertir java.awt.image.DataBuffer.getElemDouble
No se pudo convertir java.awt.image.DataBuffer.getElemFloat
No se pudo convertir java.awt.image.DataBuffer.getOffset
No se pudo convertir java.awt.image.DataBuffer.getOffsets
No se pudo convertir java.awt.image.DataBuffer.offset
No se pudo convertir java.awt.image.DataBuffer.offsets
No se pudo convertir java.awt.image.DataBuffer.setElem
No se pudo convertir java.awt.image.DataBuffer.setElemDouble
No se pudo convertir java.awt.image.DataBuffer.setElemFloat
No se pudo convertir java.awt.image.DataBufferByte.DataBufferByte
No se pudo convertir java.awt.image.DataBufferByte.getBankData
No se pudo convertir java.awt.image.DataBufferInt.DataBufferInt
No se pudo convertir java.awt.image.DataBufferInt.getBankData
No se pudo convertir java.awt.image.DataBufferShort.DataBufferShort
No se pudo convertir java.awt.image.DataBufferShort.getBankData
No se pudo convertir java.awt.image.DataBufferUShort.DataBufferUShort
No se pudo convertir java.awt.image.DataBufferUShort.getBankData
No se pudo convertir java.awt.image.DirectColorModel.coerceData
No se pudo convertir java.awt.image.DirectColorModel.createCompatibleWritableRaster
No se pudo convertir java.awt.image.DirectColorModel.DirectColorModel(ColorSpace, int, int, int, int, int, boolean, int)
No se pudo convertir java.awt.image.DirectColorModel.DirectColorModel(int, int, int, int)
No se pudo convertir java.awt.image.DirectColorModel.DirectColorModel(int, int, int, int, int)
No se pudo convertir java.awt.image.DirectColorModel.getAlpha
No se pudo convertir java.awt.image.DirectColorModel.getBlue
No se pudo convertir java.awt.image.DirectColorModel.getComponents
No se pudo convertir java.awt.image.DirectColorModel.getDataElement
No se pudo convertir java.awt.image.DirectColorModel.getDataElements(int, Object)
No se pudo convertir java.awt.image.DirectColorModel.getDataElements(int[], int)
No se pudo convertir java.awt.image.DirectColorModel.getGreen
No se pudo convertir java.awt.image.DirectColorModel.getRed
No se pudo convertir java.awt.image.DirectColorModel.getRGB
No se pudo convertir java.awt.image.DirectColorModel.isCompatibleRaster
No se pudo convertir java.awt.image.FilteredImageSource.startProduction
No se pudo convertir java.awt.image.ImageConsumer
No se pudo convertir java.awt.image.ImageFilter.setColorModel
No se pudo convertir java.awt.image.ImageObserver
No se pudo convertir java.awt.image.ImageProducer.startProduction
No se pudo convertir java.awt.image.ImagingOpException
No se pudo convertir java.awt.image.IndexColorModel.convertToIntDiscrete
No se pudo convertir java.awt.image.IndexColorModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.IndexColorModel.createCompatibleWritableRaster
No se pudo convertir java.awt.image.IndexColorModel.finalize
No se pudo convertir java.awt.image.IndexColorModel.getComponents
No se pudo convertir java.awt.image.IndexColorModel.getComponentSize
No se pudo convertir java.awt.image.IndexColorModel.getDataElement
No se pudo convertir java.awt.image.IndexColorModel.getDataElements
No se pudo convertir java.awt.image.IndexColorModel.getRGBs
No se pudo convertir java.awt.image.IndexColorModel.getTransparency
No se pudo convertir java.awt.image.IndexColorModel.getValidPixels
No se pudo convertir java.awt.image.IndexColorModel.IndexColorModel(int, int, int[], int, boolean,int,int)
No se pudo convertir java.awt.image.IndexColorModel.IndexColorModel(int, int, int[], int, int, BigInteger)
No se pudo convertir java.awt.image.IndexColorModel.isCompatibleRaster
No se pudo convertir java.awt.image.IndexColorModel.isCompatibleSampleModel
No se pudo convertir java.awt.image.Kernel
No se pudo convertir java.awt.image.LookupOp
No se pudo convertir java.awt.image.LookupTable
No se pudo convertir java.awt.image.MemoryImageSource
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getBitOffset
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getDataBitOffset
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getDataElements
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getNumDataElements
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getOffset
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getPixel
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getSample
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getSampleSize
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getSampleSize(int)
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.getTransferType
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.MultiPixelPackedSampleModel(int, int, int, int)
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.MultiPixelPackedSampleModel(int, int, int, int, int, int)
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.setDataElements
No se pudo convertir java.awt.image.MultiPixelPackedSampleModel.setSample
No se pudo convertir java.awt.image.PackedColorModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.PackedColorModel.getAlphaRaster
No se pudo convertir java.awt.image.PackedColorModel.getMask
No se pudo convertir java.awt.image.PackedColorModel.getMasks
No se pudo convertir java.awt.image.PackedColorModel.isCompatibleSampleModel
No se pudo convertir java.awt.image.PackedColorModel.PackedColorModel
No se pudo convertir java.awt.image.PixelGrabber.abortGrabbing
No se pudo convertir java.awt.image.PixelGrabber.getStatus
No se pudo convertir java.awt.image.PixelGrabber.setColorModel
No se pudo convertir java.awt.image.PixelGrabber.startGrabbing
No se pudo convertir java.awt.image.PixelGrabber.status
No se pudo convertir java.awt.image.PixelInterleavedSampleModel
No se pudo convertir java.awt.image.PixelInterleavedSampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.PixelInterleavedSampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.PixelInterleavedSampleModel.PixelInterleavedSampleModel
No se pudo convertir java.awt.image.Raster
No se pudo convertir java.awt.image.Raster.createChild
No se pudo convertir java.awt.image.Raster.createCompatibleWritableRaster
No se pudo convertir java.awt.image.Raster.createRaster
No se pudo convertir java.awt.image.Raster.createTranslatedChild
No se pudo convertir java.awt.image.Raster.createWritableRaster
No se pudo convertir java.awt.image.Raster.getDataBuffer
No se pudo convertir java.awt.image.Raster.getDataElements(int, int, int, int, object)
No se pudo convertir java.awt.image.Raster.getDataElements(int, int, object)
No se pudo convertir java.awt.image.Raster.getNumBands
No se pudo convertir java.awt.image.Raster.getNumDataElements
No se pudo convertir java.awt.image.Raster.getParent
No se pudo convertir java.awt.image.Raster.getPixel(int, int, double[])
No se pudo convertir java.awt.image.Raster.getPixel(int, int, float[])
No se pudo convertir java.awt.image.Raster.getPixels(int, int, int, int, double[])
No se pudo convertir java.awt.image.Raster.getPixels(int, int, int, int, float[])
No se pudo convertir java.awt.image.Raster.getPixels(int, int, int, int, int[])
No se pudo convertir java.awt.image.Raster.getPixel(int, int, int[])
No se pudo convertir java.awt.image.Raster.getSample
No se pudo convertir java.awt.image.Raster.getSampleDouble
No se pudo convertir java.awt.image.Raster.getSampleFloat
No se pudo convertir java.awt.image.Raster.getSampleModelTranslateX
No se pudo convertir java.awt.image.Raster.getSampleModelTranslateY
No se pudo convertir java.awt.image.Raster.getSamples
No se pudo convertir java.awt.image.Raster.getSamples(int, int, int, int, int, double[])
No se pudo convertir java.awt.image.Raster.getSamples(int, int, int, int, int, float[])
No se pudo convertir java.awt.image.Raster.getTransferType
No se pudo convertir java.awt.image.Raster.numBands
No se pudo convertir java.awt.image.Raster.numDataElements
No se pudo convertir java.awt.image.Raster.parent
No se pudo convertir java.awt.image.Raster.Raster(SampleModel, DataBuffer, Point)
No se pudo convertir java.awt.image.Raster.Raster(SampleModel, DataBuffer, Rectangle, Point, Raster)
No se pudo convertir java.awt.image.Raster.Raster(SampleModel, Point)
No se pudo convertir java.awt.image.Raster.sampleModelTranslateX
No se pudo convertir java.awt.image.Raster.sampleModelTranslateY
No se pudo convertir java.awt.image.RasterOp
No se pudo convertir java.awt.image.renderable.ContextualRenderedImageFactory
No se pudo convertir java.awt.image.renderable.RenderableImage.createDefaultRendering
No se pudo convertir java.awt.image.renderable.RenderableImage.createRendering
No se pudo convertir java.awt.image.renderable.RenderableImage.createScaledRendering
No se pudo convertir java.awt.image.renderable.RenderableImage.getMinX
No se pudo convertir java.awt.image.renderable.RenderableImage.getMinY
No se pudo convertir java.awt.image.renderable.RenderableImage.getProperty
No se pudo convertir java.awt.image.renderable.RenderableImage.getPropertyNames
No se pudo convertir java.awt.image.renderable.RenderableImage.getSources
No se pudo convertir java.awt.image.renderable.RenderableImage.HINTS_OBSERVED
No se pudo convertir java.awt.image.renderable.RenderableImage.isDynamic
No se pudo convertir java.awt.image.renderable.RenderableImageOp
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.addConsumer
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.isConsumer
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.removeConsumer
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.RenderableImageProducer
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.requestTopDownLeftRightResend
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.run
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.setRenderContext
No se pudo convertir java.awt.image.renderable.RenderableImageProducer.startProduction
No se pudo convertir java.awt.image.renderable.RenderContext
No se pudo convertir java.awt.image.renderable.RenderedImageFactory
No se pudo convertir java.awt.image.RenderedImage.copyData
No se pudo convertir java.awt.image.RenderedImage.getColorModel
No se pudo convertir java.awt.image.RenderedImage.getMinTileX
No se pudo convertir java.awt.image.RenderedImage.getMinTileY
No se pudo convertir java.awt.image.RenderedImage.getNumXTiles
No se pudo convertir java.awt.image.RenderedImage.getNumYTiles
No se pudo convertir java.awt.image.RenderedImage.getProperty
No se pudo convertir java.awt.image.RenderedImage.getPropertyNames
No se pudo convertir java.awt.image.RenderedImage.getSources
No se pudo convertir java.awt.image.RenderedImage.getTile
No se pudo convertir java.awt.image.RenderedImage.getTileGridXOffset
No se pudo convertir java.awt.image.RenderedImage.getTileGridYOffset
No se pudo convertir java.awt.image.RenderedImage.getTileHeight
No se pudo convertir java.awt.image.RenderedImage.getTileWidth
No se pudo convertir java.awt.image.ReplicateScaleFilter.outpixbuf
No se pudo convertir java.awt.image.ReplicateScaleFilter.src*
No se pudo convertir java.awt.image.RescaleOp
No se pudo convertir java.awt.image.RGBImageFilter
No se pudo convertir java.awt.image.SampleModel
No se pudo convertir java.awt.image.SampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.SampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.SampleModel.dataType
No se pudo convertir java.awt.image.SampleModel.getDataElements(int, int, int, int, Object, DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getDataElements(int, int, Object, DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getDataType
No se pudo convertir java.awt.image.SampleModel.getNumBands
No se pudo convertir java.awt.image.SampleModel.getNumDataElements
No se pudo convertir java.awt.image.SampleModel.getPixel(int, int, double[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getPixel(int, int, float[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getPixel(int, int, int[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getPixels(int, int, int, int, double[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getPixels(int, int, int, int, float[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getPixels(int, int, int, int, int[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getSample
No se pudo convertir java.awt.image.SampleModel.getSampleDouble
No se pudo convertir java.awt.image.SampleModel.getSampleFloat
No se pudo convertir java.awt.image.SampleModel.getSamples(int, int, int, int, int, double[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getSamples(int, int, int, int, int, float[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getSamples(int, int, int, int, int, int[], DataBuffer)
No se pudo convertir java.awt.image.SampleModel.getSampleSize
No se pudo convertir java.awt.image.SampleModel.getSampleSize(int)
No se pudo convertir java.awt.image.SampleModel.getTransferType
No se pudo convertir java.awt.image.SampleModel.numBands
No se pudo convertir java.awt.image.SampleModel.SampleModel
No se pudo convertir java.awt.image.SampleModel.setDataElements(int, int, int, int, Object, DataBuffer)
No se pudo convertir java.awt.image.SampleModel.setDataElements(int, int, Object, DataBuffer)
No se pudo convertir java.awt.image.SampleModel.setPixel
No se pudo convertir java.awt.image.SampleModel.setSample
No se pudo convertir java.awt.image.SampleModel.setSamples
No se pudo convertir java.awt.image.ShortLookupTable
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.createCompatibleSampleModel
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.createSubsetSampleModel
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getBitMasks
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getBitOffsets
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getDataElements
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getNumDataElements
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getOffset
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getPixel
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getPixels
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getSample
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getSamples
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getSampleSize
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.getSampleSize(int)
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.setDataElements
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.setSample
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.setSamples
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.SinglePixelPackedSampleModel(int, int, int, int, int[])
No se pudo convertir java.awt.image.SinglePixelPackedSampleModel.SinglePixelPackedSampleModel(int, int, int, int[])
No se pudo convertir java.awt.image.TileObserver
No se pudo convertir java.awt.Image.UndefinedProperty
No se pudo convertir java.awt.image.WritableRaster
No se pudo convertir java.awt.image.WritableRaster.createWritableChild
No se pudo convertir java.awt.image.WritableRaster.createWritableTranslatedChild
No se pudo convertir java.awt.image.WritableRaster.getWritableParent
No se pudo convertir java.awt.image.WritableRaster.setDataElements(int, int, int, int, Object)
No se pudo convertir java.awt.image.WritableRaster.setDataElements(int, int, Object)
No se pudo convertir java.awt.image.WritableRaster.setDataElements(int, int, Raster)
No se pudo convertir java.awt.image.WritableRaster.setPixel(int, int, int, double)
No se pudo convertir java.awt.image.WritableRaster.setPixel(int, int, int, float)
No se pudo convertir java.awt.image.WritableRaster.setPixel(int, int, int, int)
No se pudo convertir java.awt.image.WritableRaster.setRect
No se pudo convertir java.awt.image.WritableRaster.setSample(int, int, int, double)
No se pudo convertir java.awt.image.WritableRaster.setSample(int, int, int, float)
No se pudo convertir java.awt.image.WritableRaster.setSample(int, int, int, int)
No se pudo convertir java.awt.image.WritableRaster.setSamples(int, int, int, int, int, double[])
No se pudo convertir java.awt.image.WritableRaster.setSamples(int, int, int, int, int, float[])
No se pudo convertir java.awt.image.WritableRaster.setSamples(int, int, int, int, int, int[])
No se pudo convertir java.awt.image.WritableRaster.WritableRaster(Rectangle, Point, WritableRaster)
No se pudo convertir java.awt.image.WritableRaster.WritableRaster(SampleModel, DataBuffer, Point)
No se pudo convertir java.awt.image.WritableRaster.WritableRaster(SampleModel, Point)
No se pudo convertir java.awt.image.WritableRenderedImage
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.peer


No se pudo convertir java.awt.peer.CanvasPeer
No se pudo convertir java.awt.peer.ComponentPeer.checkImage
No se pudo convertir java.awt.peer.ComponentPeer.coalescePaintEvent
No se puede convertir java.awt.peer.ComponentPeer.createImage(ImageProducer)
No se puede convertir java.awt.peer.ComponentPeer.createImage(int, int)
No se pudo convertir java.awt.peer.ComponentPeer.getColorModel
No se pudo convertir java.awt.peer.ComponentPeer.getGraphicsConfiguration
No se pudo convertir java.awt.peer.ComponentPeer.getMinimumSize
No se pudo convertir java.awt.peer.ComponentPeer.getPreferredSize
No se pudo convertir java.awt.peer.ComponentPeer.getToolkit
No se pudo convertir java.awt.peer.ComponentPeer.handleEvent
No se pudo convertir java.awt.peer.ComponentPeer.minimumSize
No se pudo convertir java.awt.peer.ComponentPeer.paint
No se pudo convertir java.awt.peer.ComponentPeer.preferredSize
No se pudo convertir java.awt.peer.ComponentPeer.prepareImage
No se pudo convertir java.awt.peer.ComponentPeer.print
No se pudo convertir java.awt.peer.ComponentPeer.setBounds
No se pudo convertir java.awt.peer.ComponentPeer.setVisible
No se pudo convertir java.awt.peer.ContainerPeer.beginValidate
No se pudo convertir java.awt.peer.ContainerPeer.endValidate
No se pudo convertir java.awt.peer.FileDialogPeer.setFilenameFilter
No se pudo convertir java.awt.peer.FramePeer.setIconImage
No se pudo convertir java.awt.peer.LightweightPeer
No se pudo convertir java.awt.peer.ListPeer.delItems
No se pudo convertir java.awt.peer.ListPeer.makeVisible
No se pudo convertir java.awt.peer.MenuBarPeer.addHelpMenu
No se pudo convertir java.awt.peer.PopupMenuPeer.show
No se pudo convertir java.awt.peer.RobotPeer
No se pudo convertir java.awt.peer.ScrollbarPeer.setValues
No se pudo convertir java.awt.peer.ScrollPanePeer.setUnitIncrement
No se pudo convertir java.awt.peer.ScrollPanePeer.setValue
No se pudo convertir java.awt.peer.TextComponentPeer.filterEvents
No se pudo convertir java.awt.peer.TextComponentPeer.getCharacterBounds
No se pudo convertir java.awt.peer.TextComponentPeer.getIndexAtPoint
No se pudo convertir java.awt.peer.TextFieldPeer.getPreferredSize
No se pudo convertir java.awt.peer.TextFieldPeer.preferredSize
No se pudo convertir java.awt.peer.WindowPeer.handleFocusTraversalEvent
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.awt.print


No se pudo convertir java.awt.print.Book
No se pudo convertir java.awt.print.Pageable
No se pudo convertir java.awt.print.PageFormat.<Formato>
No se pudo convertir java.awt.print.PageFormat.getMatrix
No se pudo convertir java.awt.print.PageFormat.setOrientation
No se pudo convertir java.awt.print.Paper.clone
No se pudo convertir java.awt.print.Paper.getImageableHeight
No se pudo convertir java.awt.print.Paper.getImageableWidth
No se pudo convertir java.awt.print.Paper.getImageableX
No se pudo convertir java.awt.print.Paper.getImageableY
No se pudo convertir java.awt.print.Paper.Paper
No se pudo convertir java.awt.print.Paper.setImageableArea
No se pudo convertir java.awt.print.Paper.setSize
No se pudo convertir java.awt.print.Printable
No se pudo convertir java.awt.print.PrinterGraphics
No se pudo convertir java.awt.print.PrinterJob.cancel
No se pudo convertir java.awt.print.PrinterJob.defaultPage
No se pudo convertir java.awt.print.PrinterJob.isCancelled
No se pudo convertir java.awt.print.PrinterJob.setPageable
No se pudo convertir java.awt.print.PrinterJob.setPrintable(Printable)
No se pudo convertir java.awt.print.PrinterJob.setPrintable(Printable, PageFormat)
No se pudo convertir java.awt.print.PrinterJob.validatePage
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.beans


No se pudo convertir java.beans.AppletInitializer
No se pudo convertir java.beans.BeanDescriptor
No se pudo convertir java.beans.BeanDescriptor.BeanDescriptor
No se pudo convertir java.beans.BeanDescriptor.getCustomizerClass
No se pudo convertir java.beans.BeanInfo
No se pudo convertir java.beans.BeanInfo.ICON_COLOR_16x16
No se pudo convertir java.beans.BeanInfo.ICON_COLOR_32x32
No se pudo convertir java.beans.BeanInfo.ICON_MONO_16x16
No se pudo convertir java.beans.BeanInfo.ICON_MONO_32x32
No se pudo convertir java.beans.Beans
No se pudo convertir java.beans.Customizer
No se pudo convertir java.beans.DesignMode
No se pudo convertir java.beans.EventSetDescriptor
No se pudo convertir java.beans.EventSetDescriptor.EventSetDescriptor
No se pudo convertir java.beans.EventSetDescriptor.getAddListenerMethod
No se pudo convertir java.beans.EventSetDescriptor.getListenerMethodDescriptors
No se pudo convertir java.beans.EventSetDescriptor.getListenerMethods
No se pudo convertir java.beans.EventSetDescriptor.getListenerType
No se pudo convertir java.beans.EventSetDescriptor.getRemoveListenerMethod
No se pudo convertir java.beans.EventSetDescriptor.isInDefaultEventSet
No se pudo convertir java.beans.EventSetDescriptor.isUnicast
No se pudo convertir java.beans.EventSetDescriptor.setInDefaultEventSet
No se pudo convertir java.beans.EventSetDescriptor.setUnicast
No se pudo convertir java.beans.FeatureDescriptor
No se pudo convertir java.beans.FeatureDescriptor.attributeNames
No se pudo convertir java.beans.FeatureDescriptor.FeatureDescriptor
No se pudo convertir java.beans.FeatureDescriptor.getDisplayName
No se pudo convertir java.beans.FeatureDescriptor.getName
No se pudo convertir java.beans.FeatureDescriptor.getShortDescription
No se pudo convertir java.beans.FeatureDescriptor.getValue
No se pudo convertir java.beans.FeatureDescriptor.isExpert
No se pudo convertir java.beans.FeatureDescriptor.isHidden
No se pudo convertir java.beans.FeatureDescriptor.isPreferred
No se pudo convertir java.beans.FeatureDescriptor.setDisplayName
No se pudo convertir java.beans.FeatureDescriptor.setExpert
No se pudo convertir java.beans.FeatureDescriptor.setHidden
No se pudo convertir java.beans.FeatureDescriptor.setName
No se pudo convertir java.beans.FeatureDescriptor.setPreferred
No se pudo convertir java.beans.FeatureDescriptor.setShortDescription
No se pudo convertir java.beans.FeatureDescriptor.setValue
No se pudo convertir java.beans.IndexedPropertyDescriptor
No se pudo convertir java.beans.IntrospectionException
No se pudo convertir java.beans.Introspector
No se pudo convertir java.beans.MethodDescriptor
No se pudo convertir java.beans.ParameterDescriptor
No se pudo convertir java.beans.PropertyChangeEvent.getPropagationId
No se pudo convertir java.beans.PropertyChangeEvent.PropertyChangeEvent
No se pudo convertir java.beans.PropertyChangeEvent.setPropagationId
No se pudo convertir java.beans.PropertyChangeListener
No se pudo convertir java.beans.PropertyChangeSupport
No se pudo convertir java.beans.PropertyChangeSupport.addPropertyChangeListener
No se pudo convertir java.beans.PropertyChangeSupport.firePropertyChange
No se pudo convertir java.beans.PropertyChangeSupport.hasListeners
No se pudo convertir java.beans.PropertyChangeSupport.PropertyChangeSupport
No se pudo convertir java.beans.PropertyChangeSupport.removePropertyChangeListener
No se pudo convertir java.beans.PropertyDescriptor
No se pudo convertir java.beans.PropertyDescriptor.getPropertyEditorClass
No se pudo convertir java.beans.PropertyDescriptor.getReadMethod
No se pudo convertir java.beans.PropertyDescriptor.getWriteMethod
No se pudo convertir java.beans.PropertyDescriptor.isBound
No se pudo convertir java.beans.PropertyDescriptor.isConstrained
No se pudo convertir java.beans.PropertyDescriptor.PropertyDescriptor
No se pudo convertir java.beans.PropertyDescriptor.setBound
No se pudo convertir java.beans.PropertyDescriptor.setConstrained
No se pudo convertir java.beans.PropertyDescriptor.setPropertyEditorClass
No se pudo convertir java.beans.PropertyDescriptor.setReadMethod
No se pudo convertir java.beans.PropertyDescriptor.setWriteMethod
No se pudo convertir java.beans.PropertyEditor
No se pudo convertir java.beans.PropertyEditorManager
No se pudo convertir java.beans.PropertyEditorSupport
No se pudo convertir java.beans.PropertyVetoException.getPropertyChangeEvent
No se pudo convertir java.beans.SimpleBeanInfo
No se pudo convertir java.beans.VetoableChangeListener
No se pudo convertir java.beans.VetoableChangeSupport
No se pudo convertir java.beans.VetoableChangeSupport.addVetoableChangeListener
No se pudo convertir java.beans.VetoableChangeSupport.fireVetoableChange
No se pudo convertir java.beans.VetoableChangeSupport.hasListeners
No se pudo convertir java.beans.VetoableChangeSupport.removeVetoableChangeListener
No se pudo convertir java.beans.VetoableChangeSupport.VetoableChangeSupport
No se pudo convertir java.beans.Visibility
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.io


No se pudo convertir java.io.BufferedInputStream.available
No se pudo convertir java.io.BufferedInputStream.buf
No se pudo convertir java.io.BufferedInputStream.marklimit
No se pudo convertir java.io.BufferedInputStream.markpos
No se pudo convertir java.io.BufferedOutputStream.buf
No se pudo convertir java.io.BufferedReader.BufferedReader
No se pudo convertir java.io.BufferedReader.mark
No se pudo convertir java.io.BufferedReader.reset
No se pudo convertir java.io.BufferedWriter.BufferedWriter
No se pudo convertir java.io.BufferedWriter.write
No se pudo convertir java.io.ByteArrayInputStream.buf
No se pudo convertir java.io.ByteArrayInputStream.mark~
No se pudo convertir java.io.ByteArrayOutputStream.buf
No se pudo convertir java.io.ByteArrayOutputStream.reset
No se pudo convertir java.io.ByteArrayOutputStream.toString
No se pudo convertir java.io.CharArrayReader.buf
No se pudo convertir java.io.CharArrayReader.count
No se pudo convertir java.io.CharArrayReader.mark
No se pudo convertir java.io.CharArrayReader.markedPos
No se pudo convertir java.io.CharArrayReader.pos
No se pudo convertir java.io.CharArrayReader.reset
No se pudo convertir java.io.CharArrayReader.skip
No se pudo convertir java.io.CharArrayWriter.reset
No se pudo convertir java.io.CharArrayWriter.size
No se pudo convertir java.io.CharArrayWriter.toCharArray
No se pudo convertir java.io.CharArrayWriter.toString
No se pudo convertir java.io.CharArrayWriter.write
No se pudo convertir java.io.CharArrayWriter.writeTo
No se pudo convertir java.io.DataInput
No se pudo convertir java.io.DataInput.readLine
No se pudo convertir java.io.DataInput.readUTF
No se pudo convertir java.io.DataInputStream
No se pudo convertir java.io.DataInputStream.readLine
No se pudo convertir java.io.DataInputStream.readUTF
No se pudo convertir java.io.DataOutput
No se pudo convertir java.io.DataOutput.writeBytes
No se pudo convertir java.io.DataOutput.writeChars
No se pudo convertir java.io.DataOutput.writeUTF
No se pudo convertir java.io.DataOutputStream
No se pudo convertir java.io.DataOutputStream.writeBytes
No se pudo convertir java.io.DataOutputStream.writeChars
No se pudo convertir java.io.DataOutputStream.writeUTF
No se pudo convertir java.io.DataOutputStream.written
No se pudo convertir java.io.Externalizable
No se pudo convertir java.io.File.canRead
No se pudo convertir java.io.File.createTempFile (String, String)
No se pudo convertir java.io.File.createTempFile (String, String, File)
No se pudo convertir java.io.File.deleteOnExit
No se pudo convertir java.io.File.isAbsolute
No se pudo convertir java.io.File.list
No se pudo convertir java.io.File.listFiles
No se pudo convertir java.io.File.mkdir
No se pudo convertir java.io.File.mkdirs
No se pudo convertir java.io.File.renameTo
No se pudo convertir java.io.File.setLastModified
No se pudo convertir java.io.FileDescriptor
No se pudo convertir java.io.FileFilter
No se pudo convertir java.io.FileInputStream.available
No se pudo convertir java.io.FileInputStream.FileInputStream
No se pudo convertir java.io.FileInputStream.getFD
No se pudo convertir java.io.FilenameFilter
No se pudo convertir java.io.FileOutputStream.FileOutputStream
No se pudo convertir java.io.FileOutputStream.getFD
No se pudo convertir java.io.FileOutputStream.write
No se pudo convertir java.io.FilePermission.FilePermission
No se pudo convertir java.io.FileReader.FileReader
No se pudo convertir java.io.FileWriter.FileWriter
No se pudo convertir java.io.FilterInputStream.available
No se pudo convertir java.io.FilterInputStream.close
No se pudo convertir java.io.FileInputStream.FileInputStream
No se pudo convertir java.io.FilterInputStream.mark
No se pudo convertir java.io.FilterInputStream.markSupported
No se pudo convertir java.io.FilterInputStream.reset
No se pudo convertir java.io.FilterReader.FilterReader
No se pudo convertir java.io.FilterReader.in
No se pudo convertir java.io.FilterReader.mark
No se pudo convertir java.io.FilterReader.markSupported
No se pudo convertir java.io.FilterReader.reset
No se pudo convertir java.io.FileWriter
No se pudo convertir java.io.FileWriter.FileWriter
No se pudo convertir java.io.FilterWriter.write
No se pudo convertir java.io.InputStream.available
No se pudo convertir java.io.InputStream.InputStream
No se pudo convertir java.io.InputStream.mark
No se pudo convertir java.io.InputStream.markSupported
No se pudo convertir java.io.InputStream.read
No se pudo convertir java.io.InputStream.reset
No se pudo convertir java.io.InputStreamReader.InputStreamReader
No se pudo convertir java.io.InputStreamReader.read
No se pudo convertir java.io.InputStreamReader.read (char[], int, int)
No se pudo convertir java.io.InterruptedIOException.bytesTransferred
No se pudo convertir java.io.InvalidClassException.classname
No se pudo convertir java.io.InvalidClassException.InvalidClassException
No se pudo convertir java.io.LineNumberInputStream.available
No se pudo convertir java.io.LineNumberInputStream.getLineNumber
No se pudo convertir java.io.LineNumberInputStream.mark
No se pudo convertir java.io.LineNumberInputStream.reset
No se pudo convertir java.io.LineNumberInputStream.setLineNumber
No se pudo convertir java.io.LineNumberReader.getLineNumber
No se pudo convertir java.io.LineNumberReader.LineNumberReader
No se pudo convertir java.io.LineNumberReader.mark
No se pudo convertir java.io.LineNumberReader.reset
No se pudo convertir java.io.LineNumberReader.setLineNumber
No se pudo convertir java.io.ObjectInput
No se pudo convertir java.io.ObjectInput.available
No se pudo convertir java.io.ObjectInput.readObject
No se pudo convertir java.io.ObjectInputStream
No se pudo convertir java.io.ObjectInputStream.available
No se pudo convertir java.io.ObjectInputStream.defaultReadObject
No se pudo convertir java.io.ObjectInputStream.enableResolveObject
No se pudo convertir java.io.ObjectInputStream.GetField
No se pudo convertir java.io.ObjectInputStream.ObjectInputStream
No se pudo convertir java.io.ObjectInputStream.readClassDescriptor
No se pudo convertir java.io.ObjectInputStream.readFields
No se pudo convertir java.io.ObjectInputStream.readLine
No se pudo convertir java.io.ObjectInputStream.readObjectOverride
No se pudo convertir java.io.ObjectInputStream.readStreamHeader
No se pudo convertir java.io.ObjectInputStream.readUTF
No se pudo convertir java.io.ObjectInputStream.registerValidation
No se pudo convertir java.io.ObjectInputStream.resolveClass
No se pudo convertir java.io.ObjectInputStream.resolveObject
No se pudo convertir java.io.ObjectInputStream.resolveProxyClass
No se pudo convertir java.io.ObjectInputValidation
No se pudo convertir java.io.ObjectOutput
No se pudo convertir java.io.ObjectOutput.writeObject
No se pudo convertir java.io.ObjectOutputStream
No se pudo convertir java.io.ObjectOutputStream.annotateClass
No se pudo convertir java.io.ObjectOutputStream.annotateProxyClass
No se pudo convertir java.io.ObjectOutputStream.baseWireHandle
No se pudo convertir java.io.ObjectOutputStream.defaultWriteObject
No se pudo convertir java.io.ObjectOutputStream.enableReplaceObject
No se pudo convertir java.io.ObjectOutputStream.ObjectOutputStream
No se pudo convertir java.io.ObjectOutputStream.PutField
No se pudo convertir java.io.ObjectOutputStream.putFields
No se pudo convertir java.io.ObjectOutputStream.replaceObject
No se pudo convertir java.io.ObjectOutputStream.reset
No se pudo convertir java.io.ObjectOutputStream.SC_EXTERNALIZABLE
No se pudo convertir java.io.ObjectOutputStream.SC_SERIALIZABLE
No se pudo convertir java.io.ObjectOutputStream.SC_WRITE_METHOD
No se pudo convertir java.io.ObjectOutputStream.useProtocolVersion
No se pudo convertir java.io.ObjectOutputStream.writeBytes
No se pudo convertir java.io.ObjectOutputStream.writeChars
No se pudo convertir java.io.ObjectOutputStream.writeClassDescriptor
No se pudo convertir java.io.ObjectOutputStream.writeFields
No se pudo convertir java.io.ObjectOutputStream.writeObject
No se pudo convertir java.io.ObjectOutputStream.writeObjectOverride
No se pudo convertir java.io.ObjectOutputStream.writeStreamHeader
No se pudo convertir java.io.ObjectOutputStream.writeUTF
No se pudo convertir java.io.ObjectStreamClass
No se pudo convertir java.io.OptionalDataException
No se pudo convertir java.io.OutputStreamWriter.getEncoding
No se pudo convertir java.io.OutputStreamWriter.OutputStreamWriter
No se pudo convertir java.io.OutputStreamWriter.write
No se pudo convertir java.io.PipedInputStream.available
No se pudo convertir java.io.PipedInputStream.buffer
No se pudo convertir java.io.PipedInputStream.connect
No se pudo convertir java.io.PipedInputStream.in
No se pudo convertir java.io.PipedInputStream.out
No se pudo convertir java.io.PipedInputStream.PIPE_SIZE
No se pudo convertir java.io.PipedInputStream.PipedInputStream
No se pudo convertir java.io.PipedInputStream.read
No se pudo convertir java.io.PipedInputStream.receive
No se pudo convertir java.io.PipedOutputStream.connect
No se pudo convertir java.io.PipedOutputStream.PipedOutputStream
No se pudo convertir java.io.PipedOutputStream.write
No se pudo convertir java.io.PipedReader.connect
No se pudo convertir java.io.PipedWriter.connect
No se pudo convertir java.io.PipedWriter.write
No se pudo convertir java.io.PrintStream.checkError
No se pudo convertir java.io.PrintStream.print
No se pudo convertir java.io.PrintStream.println
No se pudo convertir java.io.PrintStream.setError
No se pudo convertir java.io.PrintStream.write
No se pudo convertir java.io.PrintWriter.checkError
No se pudo convertir java.io.PrintWriter.print
No se pudo convertir java.io.PrintWriter.PrintWriter
No se pudo convertir java.io.PrintWriter.setError
No se pudo convertir java.io.PrintWriter.write
No se pudo convertir java.io.PushbackInputStream.available
No se pudo convertir java.io.RandomAccessFile
No se pudo convertir java.io.RandomAccessFile.getFD
No se pudo convertir java.io.RandomAccessFile.RandomAccessFile(File, String)
No se pudo convertir java.io.RandomAccessFile.RandomAccessFile(File, String, String)
No se pudo convertir java.io.RandomAccessFile.readUTF
No se pudo convertir java.io.RandomAccessFile.writeUTF
No se pudo convertir java.io.Reader.lock
No se pudo convertir java.io.Reader.mark
No se pudo convertir java.io.Reader.markSupported
No se pudo convertir java.io.Reader.read
No se pudo convertir java.io.Reader.Reader
No se pudo convertir java.io.Reader.reset
No se pudo convertir java.io.SequenceInputStream.available
No se pudo convertir java.io.SequenceInputStream.SequenceInputStream
No se pudo convertir java.io.SerializablePermission
No se pudo convertir java.io.StreamTokenizer
No se pudo convertir java.io.StreamTokenizer.StreamTokenizer
No se pudo convertir java.io.StringBufferInputStream.available
No se pudo convertir java.io.StringBufferInputStream.buffer
No se pudo convertir java.io.StringBufferInputStream.count
No se pudo convertir java.io.StringBufferInputStream.pos
No se pudo convertir java.io.StringBufferInputStream.read
No se pudo convertir java.io.StringBufferInputStream.reset
No se pudo convertir java.io.StringBufferInputStream.skip
No se pudo convertir java.io.StringReader.mark
No se pudo convertir java.io.StringReader.markSupported
No se pudo convertir java.io.StringReader.ready
No se pudo convertir java.io.StringReader.reset
No se pudo convertir java.io.StringReader.skip
No se pudo convertir java.io.StringWriter.getBuffer
No se pudo convertir java.io.StringWriter.write
No se pudo convertir java.io.Writer.lock
No se pudo convertir java.io.Writer.write
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Java.lang


No se pudo convertir java.lang.Boolean.getBoolean
No se pudo convertir java.lang.Character.forDigit
No se pudo convertir java.lang.Character.isDefined
No se pudo convertir java.lang.Character.isIdentifierIgnorable
No se pudo convertir java.lang.Character.isJavaIdentifierPart
No se pudo convertir java.lang.Character.isUnicodeIdentifierPart
No se pudo convertir java.lang.Character.isUnicodeIdentifierStart
No se pudo convertir java.lang.Class.forName
No se pudo convertir java.lang.Class.getClassLoader
No se pudo convertir java.lang.Class.getDeclaredMethod
No se pudo convertir java.lang.Class.getModifiers
No se pudo convertir java.lang.Class.getPackage
No se pudo convertir java.lang.Class.getProtectionDomain
No se pudo convertir java.lang.Class.getResource
No se pudo convertir java.lang.Class.getResourceAsStream
No se pudo convertir java.lang.Class.getSigners
No se pudo convertir java.lang.Class.newInstance
No se pudo convertir java.lang.ClassLoader
No se pudo convertir java.lang.ClassNotFoundException.printStackTrace
No se pudo convertir java.lang.Compiler
No se pudo convertir java.lang.Double.doubleToLongBits
No se pudo convertir java.lang.Double.doubleToRawLongBits
No se pudo convertir java.lang.Double.longBitsToDouble
No se pudo convertir java.lang.ExceptionInInitializerError.getException
No se pudo convertir java.lang.ExceptionInInitializerError.printStackTrace
No se pudo convertir java.lang.Float.floatToIntBits
No se pudo convertir java.lang.Float.floatToRawIntBits
No se pudo convertir java.lang.Float.intBitsToFloat
No se pudo convertir java.lang.InheritableThreadLocal
No se pudo convertir java.lang.Integer.getInteger
No se pudo convertir java.lang.Integer.TYPE
No se pudo convertir java.lang.Long.getLong
No se pudo convertir java.lang.Math.round
No se pudo convertir java.lang.Number
No se pudo convertir java.lang.Number.Number
No se pudo convertir java.lang.Object.class
No se pudo convertir java.lang.Object.clone
No se pudo convertir java.lang.Package
No se pudo convertir java.lang.ref.PhantomReference
No se pudo convertir java.lang.ref.Reference
No se pudo convertir java.lang.ref.ReferenceQueue
No se pudo convertir java.lang.ref.SoftReference
No se pudo convertir java.lang.ref.WeakReference.WeakReference
No se pudo convertir java.lang.reflect.AccessibleObject
No se pudo convertir java.lang.reflect.Constructor.getExceptionTypes
No se pudo convertir java.lang.reflect.Constructor.newInstance
No se pudo convertir java.lang.reflect.Field.getModifiers
No se pudo convertir java.lang.reflect.Field.setByte
No se pudo convertir java.lang.reflect.Field.setChar
No se pudo convertir java.lang.reflect.Field.setShort
No se pudo convertir java.lang.reflect.InvocationHandler
No se pudo convertir java.lang.reflect.InvocationTargetException.InvocationTargetException
No se pudo convertir java.lang.reflect.Member.DECLARED
No se pudo convertir java.lang.reflect.Member.getModifiers
No se pudo convertir java.lang.reflect.Member.PUBLIC
No se pudo convertir java.lang.reflect.Method.getExceptionTypes
No se pudo convertir java.lang.reflect.Method.getModifiers
No se pudo convertir java.lang.reflect.Modifier
No se pudo convertir java.lang.reflect.Proxy
No se pudo convertir java.lang.reflect.ReflectPermission
No se pudo convertir java.lang.Runtime.addShutdownHook
No se pudo convertir java.lang.Runtime.exec
No se pudo convertir java.lang.Runtime.freeMemory
No se pudo convertir java.lang.Runtime.getLocalizedInputStream
No se pudo convertir java.lang.Runtime.getLocalizedOutputStream
No se pudo convertir java.lang.Runtime.halt
No se pudo convertir java.lang.Runtime.load
No se pudo convertir java.lang.Runtime.loadLibrary
No se pudo convertir java.lang.Runtime.removeShutdownHook
No se pudo convertir java.lang.Runtime.runFinalizersOnExit
No se pudo convertir java.lang.Runtime.Runtime
No se pudo convertir java.lang.Runtime.totalMemory
No se pudo convertir java.lang.Runtime.traceInstructions
No se pudo convertir java.lang.Runtime.traceMethodCalls
No se pudo convertir java.lang.RuntimePermission
No se pudo convertir java.lang.SecurityManager.checkAccess
No se pudo convertir java.lang.SecurityManager.checkAwtEventQueueAccess
No se pudo convertir java.lang.SecurityManager.checkConnect
No se pudo convertir java.lang.SecurityManager.checkCreateClassLoader
No se pudo convertir java.lang.SecurityManager.checkExec
No se pudo convertir java.lang.SecurityManager.checkExit
No se pudo convertir java.lang.SecurityManager.checkLink
No se pudo convertir java.lang.SecurityManager.checkListen
No se pudo convertir java.lang.SecurityManager.checkMemberAccess
No se pudo convertir java.lang.SecurityManager.checkMulticast
No se pudo convertir java.lang.SecurityManager.checkPackageAccess
No se pudo convertir java.lang.SecurityManager.checkPackageDefinition
No se pudo convertir java.lang.SecurityManager.checkPermission(Permission)
No se pudo convertir java.lang.SecurityManager.checkPermission(Permission, Object)
No se pudo convertir java.lang.SecurityManager.checkPrintJobAccess
No se pudo convertir java.lang.SecurityManager.checkPropertiesAccess
No se pudo convertir java.lang.SecurityManager.checkPropertyAccess
No se pudo convertir java.lang.SecurityManager.checkRead
No se pudo convertir java.lang.SecurityManager.checkSecurityAccess
No se pudo convertir java.lang.SecurityManager.checkSetFactory
No se pudo convertir java.lang.SecurityManager.checkTopLevelWindow
No se pudo convertir java.lang.SecurityManager.checkWrite
No se pudo convertir java.lang.SecurityManager.classDepth
No se pudo convertir java.lang.SecurityManager.classLoaderDepth
No se pudo convertir java.lang.SecurityManager.currentClassLoader
No se pudo convertir java.lang.SecurityManager.currentLoadedClass
No se pudo convertir java.lang.SecurityManager.getClassContext
No se pudo convertir java.lang.SecurityManager.getInCheck
No se pudo convertir java.lang.SecurityManager.getSecurityContext
No se pudo convertir java.lang.SecurityManager.getThreadGroup
No se pudo convertir java.lang.SecurityManager.inCheck
No se pudo convertir java.lang.SecurityManager.inClass
No se pudo convertir java.lang.SecurityManager.inClassLoader
No se pudo convertir java.lang.SecurityManager.SecurityManager
No se pudo convertir java.lang.StackOverflowError
No se pudo convertir java.lang.StrictMath.round
No se pudo convertir java.lang.String.CASE_INSENSITIVE_ORDER
No se pudo convertir java.lang.String.getBytes
No se pudo convertir java.lang.String.String(byte[])
No se pudo convertir java.lang.String.String(byte[]), int, int, int)
No se pudo convertir java.lang.String.String(byte[], int, int, String)
No se pudo convertir java.lang.String.String(byte[], String)
No se pudo convertir java.lang.System
No se pudo convertir java.lang.System.currentTimeMillis
No se pudo convertir java.lang.System.getProperties
No se pudo convertir java.lang.System.getProperty
No se pudo convertir java.lang.System.getSecurityManager
No se pudo convertir java.lang.System.load
No se pudo convertir java.lang.System.loadLibrary
No se pudo convertir java.lang.System.mapLibraryName
No se pudo convertir java.lang.System.runFinalization
No se pudo convertir java.lang.System.runFinalizersOnExit
No se pudo convertir java.lang.System.setErr
No se pudo convertir java.lang.System.setIn
No se pudo convertir java.lang.System.setOut
No se pudo convertir java.lang.System.setProperty
No se pudo convertir java.lang.System.setProperties
No se pudo convertir java.lang.System.setSecurityManager
No se pudo convertir java.lang.Thread.activeCount
No se pudo convertir java.lang.Thread.checkAccess
No se pudo convertir java.lang.Thread.countStackFrames
No se pudo convertir java.lang.Thread.destroy
No se pudo convertir java.lang.Thread.enumerate
No se pudo convertir java.lang.Thread.getContextClassLoader
No se pudo convertir java.lang.Thread.getThreadGroup
No se pudo convertir java.lang.Thread.interrupted
No se pudo convertir java.lang.Thread.isInterrupted
No se pudo convertir java.lang.Thread.run
No se pudo convertir java.lang.Thread.setContextClassLoader
No se pudo convertir java.lang.Thread.sleep(long)
No se pudo convertir java.lang.Thread.sleep(long, int)
No se pudo convertir java.lang.Thread.Thread
No se pudo convertir java.lang.Thread.yield
No se pudo convertir java.lang.ThreadGroup
No se pudo convertir java.lang.ThreadLocal.initialValue
No se pudo convertir java.lang.Throwable.fillInStackTrace
No se pudo convertir java.lang.UnsupportedClassVersionError
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.math


No se pudo convertir java.math.BigDecimal
No se pudo convertir java.math.BigDecimal.BigDecimal
No se pudo convertir java.math.BigDecimal.divide
No se pudo convertir java.math.BigDecimal.movePointLeft
No se pudo convertir java.math.BigDecimal.movePointRight
No se pudo convertir java.math.BigDecimal.ROUND_CEILING
No se pudo convertir java.math.BigDecimal.ROUND_DOWN
No se pudo convertir java.math.BigDecimal.ROUND_FLOOR
No se pudo convertir java.math.BigDecimal.ROUND_HALF_DOWN
No se pudo convertir java.math.BigDecimal.ROUND_HALF_EVEN
No se pudo convertir java.math.BigDecimal.ROUND_HALF_UP
No se pudo convertir java.math.BigDecimal.ROUND_UNNECESSARY
No se pudo convertir java.math.BigDecimal.ROUND_UP
No se pudo convertir java.math.BigDecimal.scale
No se pudo convertir java.math.BigDecimal.setScale
No se pudo convertir java.math.BigDecimal.toBigInteger
No se pudo convertir java.math.BigDecimal.unscaledValue
No se pudo convertir java.math.BigDecimal.valueOf
No se pudo convertir java.math.BigInteger
No se pudo convertir java.math.BigInteger.and
No se pudo convertir java.math.BigInteger.andNot
No se pudo convertir java.math.BigInteger.BigInteger(byte[])
No se pudo convertir java.math.BigInteger.BigInteger(int, byte[])
No se pudo convertir java.math.BigInteger.BigInteger(int, int, Random)
No se pudo convertir java.math.BigInteger.BigInteger(int, Random)
No se pudo convertir java.math.BigInteger.BigInteger(String, int)
No se pudo convertir java.math.BigInteger.bitCount
No se pudo convertir java.math.BigInteger.bitLength
No se pudo convertir java.math.BigInteger.clearBit
No se pudo convertir java.math.BigInteger.flipBit
No se pudo convertir java.math.BigInteger.gcd
No se pudo convertir java.math.BigInteger.getLowestSetBit
No se pudo convertir java.math.BigInteger.isProbablePrime
No se pudo convertir java.math.BigInteger.modInverse
No se pudo convertir java.math.BigInteger.modPow
No se pudo convertir java.math.BigInteger.not
No se pudo convertir java.math.BigInteger.or
No se pudo convertir java.math.BigInteger.pow
No se pudo convertir java.math.BigInteger.setBit
No se pudo convertir java.math.BigInteger.shiftLeft
No se pudo convertir java.math.BigInteger.shiftRight
No se pudo convertir java.math.BigInteger.testBit
No se pudo convertir java.math.BigInteger.toByteArray
No se pudo convertir java.math.BigInteger.toString
No se pudo convertir java.math.BigInteger.xor
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.net


No se pudo convertir java.net.Authenticator
No se pudo convertir java.net.ContentHandler
No se pudo convertir java.net.ContentHandlerFactory
No se pudo convertir java.net.DatagramPacket.DatagramPacket
No se pudo convertir java.net.DatagramPacket.getOffset
No se pudo convertir java.net.DatagramSocket.getLocalAddress
No se pudo convertir java.net.DatagramSocket.getLocalPort
No se pudo convertir java.net.DatagramSocket.getReceiveBufferSize
No se pudo convertir java.net.DatagramSocket.getSendBufferSize
No se pudo convertir java.net.DatagramSocket.getSoTimeout
No se pudo convertir java.net.DatagramSocket.setDatagramSocketImplFactory
No se pudo convertir java.net.DatagramSocket.setReceiveBufferSize
No se pudo convertir java.net.DatagramSocket.setSendBufferSize
No se pudo convertir java.net.DatagramSocket.setSoTimeout
No se pudo convertir java.net.DatagramSocketImpl
No se pudo convertir java.net.DatagramSocketImplFactory
No se pudo convertir java.net.FileNameMap
No se pudo convertir java.net.HttpURLConnection.getErrorStream
No se pudo convertir java.net.HttpURLConnection.getFollowRedirects
No se pudo convertir java.net.HttpURLConnection.getPermission
No se pudo convertir java.net.HttpURLConnection.getResponseCode
No se pudo convertir java.net.HttpURLConnection.getResponseMessage
No se pudo convertir java.net.HttpURLConnection.HTTP_MOVED_TEMP
No se pudo convertir java.net.HttpURLConnection.responseCode
No se pudo convertir java.net.HttpURLConnection.responseMessage
No se pudo convertir java.net.HttpURLConnection.usingProxy
No se pudo convertir java.net.InetAddress.getAddress
No se pudo convertir java.net.InetAddress.getAllByName
No se pudo convertir java.net.InetAddress.getByName
No se pudo convertir java.net.InetAddress.getLocalHost
No se pudo convertir java.net.InetAddress.isMulticastAddress
No se pudo convertir java.net.JarURLConnection
No se pudo convertir java.net.MulticastSocket.getInterface
No se pudo convertir java.net.MulticastSocket.getTimeToLive
No se pudo convertir java.net.MulticastSocket.getTTL
No se pudo convertir java.net.MulticastSocket.send
No se pudo convertir java.net.MulticastSocket.setInterface
No se pudo convertir java.net.MulticastSocket.setTimeToLive
No se pudo convertir java.net.MulticastSocket.setTTL
No se pudo convertir java.net.NetPermission.NetPermission
No se pudo convertir java.net.NoRouteToHostException.NoRouteToHostException
No se pudo convertir java.net.PlainDatagramSocketImpl
No se pudo convertir java.net.PlainSocketImpl
No se pudo convertir java.net.ServerSocket.getSoTimeout
No se pudo convertir java.net.ServerSocket.implAccept
No se pudo convertir java.net.ServerSocket.ServerSocket
No se pudo convertir java.net.ServerSocket.setSocketFactory
No se pudo convertir java.net.ServerSocket.setSoTimeout
No se pudo convertir java.net.Socket.getInetAddress
No se pudo convertir java.net.Socket.getKeepAlive
No se pudo convertir java.net.Socket.getLocalAddress
No se pudo convertir java.net.Socket.getLocalPort
No se pudo convertir java.net.Socket.getPort
No se pudo convertir java.net.Socket.setKeepAlive
No se pudo convertir java.net.Socket.setSocketImplFactory
No se pudo convertir java.net.Socket.shutdownInput
No se pudo convertir java.net.Socket.shutdownOutput
No se pudo convertir java.net.Socket.Socket
No se pudo convertir java.net.SocketException.SocketException
No se pudo convertir java.net.SocketImpl
No se pudo convertir java.net.SocketImplFactory
No se pudo convertir java.net.SocketInputStream
No se pudo convertir java.net.SocketOptions
No se pudo convertir java.net.SocketOutputStream
No se pudo convertir java.net.SocketPermission.SocketPermission
No se pudo convertir java.net.UnknownContentHandler
No se pudo convertir java.net.URL.getContent
No se pudo convertir java.net.URL.getContent(Class[])
No se pudo convertir java.net.URL.getPort
No se pudo convertir java.net.URL.openStream
No se pudo convertir java.net.URL.set
No se pudo convertir java.net.URL.setURLStreamHandlerFactory
No se pudo convertir java.net.URL.URL
No se pudo convertir java.net.URLClassLoader
No se pudo convertir java.net.URLConnection.allowUserInteraction
No se pudo convertir java.net.URLConnection.connect
No se pudo convertir java.net.URLConnection.doInput
No se pudo convertir java.net.URLConnection.doOutput
No se pudo convertir java.net.URLConnection.fileNameMap
No se pudo convertir java.net.URLConnection.getAllowUserInteraction
No se pudo convertir java.net.URLConnection.getContent
No se pudo convertir java.net.URLConnection.getContentEncoding
No se pudo convertir java.net.URLConnection.getDate
No se pudo convertir java.net.URLConnection.getDefaultAllowUserInteraction
No se pudo convertir java.net.URLConnection.getDefaultRequestProperty
No se pudo convertir java.net.URLConnection.getDefaultUseCaches
No se pudo convertir java.net.URLConnection.getDoInput
No se pudo convertir java.net.URLConnection.getDoOutput
No se pudo convertir java.net.URLConnection.getFileNameMap
No se pudo convertir java.net.URLConnection.getHeaderField
No se pudo convertir java.net.URLConnection.getHeaderFieldKey
No se pudo convertir java.net.URLConnection.getIfModifiedSince
No se pudo convertir java.net.URLConnection.getLastModified
No se pudo convertir java.net.URLConnection.getPermission
No se pudo convertir java.net.URLConnection.getRequestProperty
No se pudo convertir java.net.URLConnection.getUseCaches
No se pudo convertir java.net.URLConnection.guessContentTypeFromName
No se pudo convertir java.net.URLConnection.guessContentTypeFromStream
No se pudo convertir java.net.URLConnection.setAllowUserInteraction
No se pudo convertir java.net.URLConnection.setContentHandlerFactory
No se pudo convertir java.net.URLConnection.setDefaultAllowUserInteraction
No se pudo convertir java.net.URLConnection.setDefaultRequestProperty
No se pudo convertir java.net.URLConnection.setDefaultUseCaches
No se pudo convertir java.net.URLConnection.setDoInput
No se pudo convertir java.net.URLConnection.setDoOutput
No se pudo convertir java.net.URLConnection.setFileNameMap
No se pudo convertir java.net.URLConnection.setUseCaches
No se pudo convertir java.net.URLConnection.toString
No se pudo convertir java.net.URLConnection.url
No se pudo convertir java.net.URLConnection.useCaches
No se pudo convertir java.net.URLDecoder
No se pudo convertir java.net.URLEncoder
No se pudo convertir java.net.URLStreamHandler
No se pudo convertir java.net.URLStreamHandlerFactory
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.rmi


No se pudo convertir java.rmi.AccessException
No se pudo convertir java.rmi.activation.Activatable.Activatable
No se pudo convertir java.rmi.activation.Activatable.exportObject
No se pudo convertir java.rmi.activation.Activatable.getID
No se pudo convertir java.rmi.activation.Activatable.inactive
No se pudo convertir java.rmi.activation.Activatable.register
No se pudo convertir java.rmi.activation.Activatable.unexportObject
No se pudo convertir java.rmi.activation.Activatable.unregister
No se pudo convertir java.rmi.activation.ActivateFailedException
No se pudo convertir java.rmi.activation.ActivationDesc
No se pudo convertir java.rmi.activation.ActivationException
No se pudo convertir java.rmi.activation.ActivationGroup
No se pudo convertir java.rmi.activation.ActivationGroup_Stub
No se pudo convertir java.rmi.activation.ActivationGroupDesc
No se pudo convertir java.rmi.activation.ActivationGroupDesc.CommandEnvironment
No se pudo convertir java.rmi.activation.ActivationGroupID
No se pudo convertir java.rmi.activation.ActivationID
No se pudo convertir java.rmi.activation.ActivationInstantiator
No se pudo convertir java.rmi.activation.ActivationMonitor
No se pudo convertir java.rmi.activation.ActivationSystem
No se pudo convertir java.rmi.activation.Activator.activate
No se pudo convertir java.rmi.activation.CommandEnvironment.CommandEnvironment
No se pudo convertir java.rmi.activation.CommandEnvironment.equals
No se pudo convertir java.rmi.activation.CommandEnvironment.getCommandOptions
No se pudo convertir java.rmi.activation.CommandEnvironment.getCommandPath
No se pudo convertir java.rmi.activation.CommandEnvironment.hashCode
No se pudo convertir java.rmi.activation.UnknownGroupException
No se pudo convertir java.rmi.activation.UnknownObjectException
No se pudo convertir java.rmi.AlreadyBoundException
No se pudo convertir java.rmi.ConnectException
No se pudo convertir java.rmi.ConnectIOException
No se pudo convertir java.rmi.dgc.DGC
No se pudo convertir java.rmi.dgc.Lease.getVMID
No se pudo convertir java.rmi.dgc.VMID
No se pudo convertir java.rmi.MarshalException
No se pudo convertir java.rmi.MarshalledObject
No se pudo convertir java.rmi.Naming
No se pudo convertir java.rmi.Naming.bind
No se pudo convertir java.rmi.Naming.lookup
No se pudo convertir java.rmi.Naming.rebind
No se pudo convertir java.rmi.Naming.unbind
No se pudo convertir java.rmi.NoSuchObjectException
No se pudo convertir java.rmi.NotBoundException
No se pudo convertir java.rmi.registry.LocateRegistry
No se pudo convertir java.rmi.registry.Registry
No se pudo convertir java.rmi.registry.Registry.bind
No se pudo convertir java.rmi.registry.Registry.lookup
No se pudo convertir java.rmi.registry.Registry.rebind
No se pudo convertir java.rmi.registry.Registry.REGISTRY_PORT
No se pudo convertir java.rmi.registry.Registry.unbind
No se pudo convertir java.rmi.registry.RegistryHandler
No se pudo convertir java.rmi.RemoteException.detail
No se pudo convertir java.rmi.RMISecurityException
No se pudo convertir java.rmi.RMISecurityManager
No se pudo convertir java.rmi.RMISecurityManager.RMISecurityManager
No se pudo convertir java.rmi.server.ExportException
No se pudo convertir java.rmi.server.LoaderHandler
No se pudo convertir java.rmi.server.LogStream
No se pudo convertir java.rmi.server.ObjID
No se pudo convertir java.rmi.server.Operation
No se pudo convertir java.rmi.server.RemoteCall
No se pudo convertir java.rmi.server.RemoteRef
No se pudo convertir java.rmi.server.RemoteServer
No se pudo convertir java.rmi.server.RemoteStub
No se pudo convertir java.rmi.server.RMIClassLoader
No se pudo convertir java.rmi.server.RMIFailureHandler
No se pudo convertir java.rmi.server.RMISocketFactory.getDefaultSocketFactory
No se pudo convertir java.rmi.server.RMISocketFactory.getFailureHandler
No se pudo convertir java.rmi.server.RMISocketFactory.getSocketFactory
No se pudo convertir java.rmi.server.RMISocketFactory.setFailureHandler
No se pudo convertir java.rmi.server.RMISocketFactory.setSocketFactory
No se pudo convertir java.rmi.server.RemoteObject.getRef
No se pudo convertir java.rmi.server.RemoteObject.ref
No se pudo convertir java.rmi.server.RemoteObject.RemoteObject
No se pudo convertir java.rmi.server.RemoteObject.toStub
No se pudo convertir java.rmi.server.RemoteServer.getClientHost
No se pudo convertir java.rmi.server.RemoteServer.getLog
No se pudo convertir java.rmi.server.RemoteServer.RemoteServer
No se pudo convertir java.rmi.server.ServerCloneException
No se pudo convertir java.rmi.server.ServerNotActiveException
No se pudo convertir java.rmi.server.ServerRef
No se pudo convertir java.rmi.server.Skeleton
No se pudo convertir java.rmi.server.SkeletonMismatchException
No se pudo convertir java.rmi.server.SkeletonNotFoundException
No se pudo convertir java.rmi.server.SocketSecurityException
No se pudo convertir java.rmi.server.UID
No se pudo convertir java.rmi.server.UnicastRemoteObject.clone
No se pudo convertir java.rmi.server.UnicastRemoteObject.exportObject
No se pudo convertir java.rmi.server.UnicastRemoteObject.unexportObject
No se pudo convertir java.rmi.server.UnicastRemoteObject.UnicastRemoteObject
No se pudo convertir java.rmi.server.Unreferenced
No se pudo convertir java.rmi.ServerRuntimeException
No se pudo convertir java.rmi.StubNotFoundException
No se pudo convertir java.rmi.UnexpectedException
No se pudo convertir java.rmi.UnknownHostException
No se pudo convertir java.rmi.UnmarshalException
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.security


No se pudo convertir java.security.AccessControlContext
No se pudo convertir java.security.AccessControlException.getPermission
No se pudo convertir java.security.AccessController
No se pudo convertir java.security.acl
No se pudo convertir java.security.acl.Acl
No se pudo convertir java.security.acl.AclEntry
No se pudo convertir java.security.acl.AclNotFoundException
No se pudo convertir java.security.acl.Group
No se pudo convertir java.security.acl.LastOwnerException
No se pudo convertir java.security.acl.NotOwnerException
No se pudo convertir java.security.acl.Owner
No se pudo convertir java.security.acl.Permission
No se pudo convertir java.security.AlgorithmParameterGenerator
No se pudo convertir java.security.AlgorithmParameterGeneratorSpi
No se pudo convertir java.security.AlgorithmParameters
No se pudo convertir java.security.AlgorithmParametersSpi
No se pudo convertir java.security.AllPermission
No se pudo convertir java.security.BasicPermission.newPermissionCollection
No se pudo convertir java.security.cert.Certificate.Certificate
No se pudo convertir java.security.cert.Certificate.getEncoded
No se pudo convertir java.security.cert.Certificate.verify(PublicKey)
No se pudo convertir java.security.cert.Certificate.verify(PublicKey, String)
No se pudo convertir java.security.cert.Certificate.writeReplace
No se pudo convertir java.security.cert.CertificateFactory.CertificateFactory
No se pudo convertir java.security.cert.CertificateFactory.generateCertificate
No se pudo convertir java.security.cert.CertificateFactory.generateCertificates
No se pudo convertir java.security.cert.CertificateFactory.generateCRL
No se pudo convertir java.security.cert.CertificateFactory.generateCRLs
No se pudo convertir java.security.cert.CertificateFactory.getInstance
No se pudo convertir java.security.cert.CertificateFactory.getProvider
No se pudo convertir java.security.cert.CertificateFactorySpi
No se pudo convertir java.security.cert.CRL
No se pudo convertir java.security.cert.X509Certificate.getBasicConstraints
No se pudo convertir java.security.cert.X509Certificate.getCriticalExtensionOIDs
No se pudo convertir java.security.cert.X509Certificate.getExtensionValue
No se pudo convertir java.security.cert.X509Certificate.getIssuerUniqueID
No se pudo convertir java.security.cert.X509Certificate.getKeyUsage
No se pudo convertir java.security.cert.X509Certificate.getNonCriticalExtensionOIDs
No se pudo convertir java.security.cert.X509Certificate.getNotAfter
No se pudo convertir java.security.cert.X509Certificate.getNotBefore
No se pudo convertir java.security.cert.X509CRLEntry.getRevocationDate
No se pudo convertir java.security.cert.X509Certificate.getSigAlgName
No se pudo convertir java.security.cert.X509Certificate.getSignature
No se pudo convertir java.security.cert.X509Certificate.getSubjectUniqueID
No se pudo convertir java.security.cert.X509Certificate.getTBSCertificate
No se pudo convertir java.security.cert.X509Certificate.getVersion
No se pudo convertir java.security.cert.X509Certificate.hasUnsupportedCriticalExtension
No se pudo convertir java.security.cert.X509CRL
No se pudo convertir java.security.cert.X509CRLEntry.getCriticalExtensionOIDs
No se pudo convertir java.security.cert.X509CRLEntry.getEncoded
No se pudo convertir java.security.cert.X509CRLEntry.getExtensionValue
No se pudo convertir java.security.cert.X509CRLEntry.getNonCriticalExtensionOIDs
No se pudo convertir java.security.cert.X509CRLEntry.hasExtensions
No se pudo convertir java.security.cert.X509CRLEntry.hasUnsupportedCriticalExtension
No se pudo convertir java.security.cert.X509Extension
No se pudo convertir java.security.Certificate
No se pudo convertir java.security.CodeSource
No se pudo convertir java.security.DomainCombiner
No se pudo convertir java.security.Guard
No se pudo convertir java.security.GuardedObject
No se pudo convertir java.security.Identity
No se pudo convertir java.security.IdentityScope
No se pudo convertir java.security.interfaces.DSAKeyPairGenerator
No se pudo convertir java.security.interfaces.DSAParams.getG
No se pudo convertir java.security.interfaces.DSAParams.getP
No se pudo convertir java.security.interfaces.DSAParams.getQ
No se pudo convertir java.security.interfaces.DSAPrivateKey
No se pudo convertir java.security.interfaces.DSAPublicKey
No se pudo convertir java.security.interfaces.RSAPrivateCrtKey
No se pudo convertir java.security.interfaces.RSAPrivateKey
No se pudo convertir java.security.interfaces.RSAPublicKey
No se pudo convertir java.security.Key.getFormat
No se pudo convertir java.security.KeyFactory
No se pudo convertir java.security.KeyFactorySpi
No se pudo convertir java.security.KeyPairGenerator
No se pudo convertir java.security.KeyPairGeneratorSpi
No se pudo convertir java.security.KeyStore
No se pudo convertir java.security.KeyStoreSpi
No se pudo convertir java.security.MessageDigest.clone
No se pudo convertir java.security.MessageDigest.getInstance
No se pudo convertir java.security.MessageDigestSpi.clone
No se pudo convertir java.security.MessageDigestSpi.MessageDigestSpi
No se pudo convertir java.security.Permission.checkGuard
No se pudo convertir java.security.Permission.getName
No se pudo convertir java.security.PermissionCollection.implies
No se pudo convertir java.security.PermissionCollection.setReadOnly
No se pudo convertir java.security.Policy
No se pudo convertir java.security.ProtectionDomain
No se pudo convertir java.security.Provider
No se pudo convertir java.security.SecureClassLoader
No se pudo convertir java.security.SecureRandom.getProvider
No se pudo convertir java.security.SecureRandom.next
No se pudo convertir java.security.SecureRandomSpi.SecureRandomSpi
No se pudo convertir java.security.Security
No se pudo convertir java.security.SecurityPermission.SecurityPermission
No se pudo convertir java.security.Signature.clone
No se pudo convertir java.security.Signature.engineGetParameter
No se pudo convertir java.security.Signature.engineInitSign
No se pudo convertir java.security.Signature.engineInitVerify
No se pudo convertir java.security.Signature.engineSetParameter
No se pudo convertir java.security.Signature.engineSign
No se pudo convertir java.security.Signature.engineVerify
No se pudo convertir java.security.Signature.getInstance
No se pudo convertir java.security.Signature.getParameter
No se pudo convertir java.security.Signature.initSign
No se pudo convertir java.security.Signature.initVerify
No se pudo convertir java.security.Signature.setParameter
No se pudo convertir java.security.Signature.sign
No se pudo convertir java.security.Signature.SIGN~
No se pudo convertir java.security.Signature.state
No se pudo convertir java.security.Signature.UNINITIALIZED
No se pudo convertir java.security.Signature.verify
No se pudo convertir java.security.Signature.VERIFY~
No se pudo convertir java.security.SignatureSpi.appRandom
No se pudo convertir java.security.SignatureSpi.clone
No se pudo convertir java.security.SignatureSpi.engineGetParameter
No se pudo convertir java.security.SignatureSpi.engineInitSign
No se pudo convertir java.security.SignatureSpi.engineSetParameter
No se pudo convertir java.security.SignatureSpi.engineSign
No se pudo convertir java.security.SignatureSpi.engineSign(byte[], int, int)
No se pudo convertir java.security.SignatureSpi.engineVerify
No se pudo convertir java.security.SecureRandomSpi.SecureRandomSpi
No se pudo convertir java.security.SignedObject
No se pudo convertir java.security.Signer
No se pudo convertir java.security.spec.DSAParameterSpec.DSAParameterSpec
No se pudo convertir java.security.spec.DSAPrivateKeySpec.DSAPrivateKeySpec
No se pudo convertir java.security.spec.DSAPublicKeySpec.DSAPublicKeySpec
No se pudo convertir java.security.spec.EncodedKeySpec
No se pudo convertir java.security.spec.PKCS8EncodedKeySpec
No se pudo convertir java.security.spec.RSAKeyGenParameterSpec
No se pudo convertir java.security.spec.RSAPrivateCrtKeySpec
No se pudo convertir java.security.spec.RSAPrivateKeySpec.RSAPrivateKeySpec
No se pudo convertir java.security.spec.RSAPublicKeySpec.RSAPublicKeySpec
No se pudo convertir java.security.spec.X509EncodedKeySpec
No se pudo convertir java.security.UnresolvedPermission
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Java.sql


No se pudo convertir java.sql.Array
No se pudo convertir java.sql.BatchUpdateException
No se pudo convertir java.sql.Blob
No se pudo convertir java.sql.Blob.getBinaryStream
No se pudo convertir java.sql.Blob.getBytes
No se pudo convertir java.sql.Blob.position
No se pudo convertir java.sql.CallableStatement.getArray
No se pudo convertir java.sql.CallableStatement.getBigDecimal
No se pudo convertir java.sql.CallableStatement.getBlob
No se pudo convertir java.sql.CallableStatement.getClob
No se pudo convertir java.sql.CallableStatement.getDate
No se pudo convertir java.sql.CallableStatement.getObject
No se pudo convertir java.sql.CallableStatement.getRef
No se pudo convertir java.sql.CallableStatement.getTime
No se pudo convertir java.sql.CallableStatement.getTimestamp
No se pudo convertir java.sql.CallableStatement.registerOutParameter
No se pudo convertir java.sql.CallableStatement.wasNull
No se pudo convertir java.sql.Clob
No se pudo convertir java.sql.Clob.getAsciiStream
No se pudo convertir java.sql.Clob.getCharacterStream
No se pudo convertir java.sql.Clob.getSubString
No se pudo convertir java.sql.Clob.position
No se pudo convertir java.sql.Connection.clearWarnings
No se pudo convertir java.sql.Connection.createStatement
No se pudo convertir java.sql.Connection.getTypeMap
No se pudo convertir java.sql.Connection.getWarnings
No se pudo convertir java.sql.Connection.isReadOnly
No se pudo convertir java.sql.Connection.nativeSQL
No se pudo convertir java.sql.Connection.prepareCall
No se pudo convertir java.sql.Connection.prepareStatement
No se pudo convertir java.sql.Connection.setCatalog
No se pudo convertir java.sql.Connection.setReadOnly
No se pudo convertir java.sql.Connection.setTypeMap
No se pudo convertir java.sql.DatabaseMetaData.allProceduresAreCallable
No se pudo convertir java.sql.DatabaseMetaData.allTablesAreSelectable
No se pudo convertir java.sql.DatabaseMetaData.bestRowNotPseudo
No se pudo convertir java.sql.DatabaseMetaData.bestRowPseudo
No se pudo convertir java.sql.DatabaseMetaData.bestRowSession
No se pudo convertir java.sql.DatabaseMetaData.bestRowTemporary
No se pudo convertir java.sql.DatabaseMetaData.bestRowTransaction
No se pudo convertir java.sql.DatabaseMetaData.bestRowUnknown
No se pudo convertir java.sql.DatabaseMetaData.columnNoNulls
No se pudo convertir java.sql.DatabaseMetaData.columnNullable
No se pudo convertir java.sql.DatabaseMetaData.columnNullableUnknown
No se pudo convertir java.sql.DatabaseMetaData.dataDefinitionCausesTransactionCommit
No se pudo convertir java.sql.DatabaseMetaData.dataDefinitionIgnoredInTransactions
No se pudo convertir java.sql.DatabaseMetaData.deletesAreDetected
No se pudo convertir java.sql.DatabaseMetaData.doesMaxRowSizeIncludeBlobs
No se pudo convertir java.sql.DatabaseMetaData.getBestRowIdentifier
No se pudo convertir java.sql.DatabaseMetaData.getCatalogTerm
No se pudo convertir java.sql.DatabaseMetaData.getColumnPrivileges
No se pudo convertir java.sql.DatabaseMetaData.getColumns
No se pudo convertir java.sql.DatabaseMetaData.getCrossReference
No se pudo convertir java.sql.DatabaseMetaData.getDatabaseProductName
No se pudo convertir java.sql.DatabaseMetaData.getDriverMajorVersion
No se pudo convertir java.sql.DatabaseMetaData.getDriverMinorVersion
No se pudo convertir java.sql.DatabaseMetaData.getDriverName
No se pudo convertir java.sql.DatabaseMetaData.getDriverVersion
No se pudo convertir java.sql.DatabaseMetaData.getExportedKeys
No se pudo convertir java.sql.DatabaseMetaData.getExtraNameCharacters
No se pudo convertir java.sql.DatabaseMetaData.getIdentifierQuoteString
No se pudo convertir java.sql.DatabaseMetaData.getImportedKeys
No se pudo convertir java.sql.DatabaseMetaData.getIndexInfo
No se pudo convertir java.sql.DatabaseMetaData.getMaxColumnsInGroupBy
No se pudo convertir java.sql.DatabaseMetaData.getMaxColumnsInIndex
No se pudo convertir java.sql.DatabaseMetaData.getMaxColumnsInOrderBy
No se pudo convertir java.sql.DatabaseMetaData.getMaxColumnsInSelect
No se pudo convertir java.sql.DatabaseMetaData.getMaxColumnsInTable
No se pudo convertir java.sql.DatabaseMetaData.getMaxConnections
No se pudo convertir java.sql.DatabaseMetaData.getMaxIndexLength
No se pudo convertir java.sql.DatabaseMetaData.getMaxRowSize
No se pudo convertir java.sql.DatabaseMetaData.getMaxStatementLength
No se pudo convertir java.sql.DatabaseMetaData.getMaxStatements
No se pudo convertir java.sql.DatabaseMetaData.getMaxTablesInSelect
No se pudo convertir java.sql.DatabaseMetaData.getNumericFunctions
No se pudo convertir java.sql.DatabaseMetaData.getPrimaryKeys
No se pudo convertir java.sql.DatabaseMetaData.getProcedureColumns
No se pudo convertir java.sql.DatabaseMetaData.getProcedures
No se pudo convertir java.sql.DatabaseMetaData.getProcedureTerm
No se pudo convertir java.sql.DatabaseMetaData.getSchemaTerm
No se pudo convertir java.sql.DatabaseMetaData.getSearchStringEscape
No se pudo convertir java.sql.DatabaseMetaData.getSQLKeywords
No se pudo convertir java.sql.DatabaseMetaData.getStringFunctions
No se pudo convertir java.sql.DatabaseMetaData.getSystemFunctions
No se pudo convertir java.sql.DatabaseMetaData.getTablePrivileges
No se pudo convertir java.sql.DatabaseMetaData.getTables
No se pudo convertir java.sql.DatabaseMetaData.getTimeDateFunctions
No se pudo convertir java.sql.DatabaseMetaData.getUDTs
No se pudo convertir java.sql.DatabaseMetaData.getURL
No se pudo convertir java.sql.DatabaseMetaData.getUserName
No se pudo convertir java.sql.DatabaseMetaData.getVersionColumns
No se pudo convertir java.sql.DatabaseMetaData.importedKeyCascade
No se pudo convertir java.sql.DatabaseMetaData.importedKeyInitiallyDeferred
No se pudo convertir java.sql.DatabaseMetaData.importedKeyInitiallyImmediate
No se pudo convertir java.sql.DatabaseMetaData.importedKeyNoAction
No se pudo convertir java.sql.DatabaseMetaData.importedKeyNotDeferrable
No se pudo convertir java.sql.DatabaseMetaData.importedKeyRestrict
No se pudo convertir java.sql.DatabaseMetaData.importedKeySetDefault
No se pudo convertir java.sql.DatabaseMetaData.importedKeySetNull
No se pudo convertir java.sql.DatabaseMetaData.insertsAreDetected
No se pudo convertir java.sql.DatabaseMetaData.isCatalogAtStart
No se pudo convertir java.sql.DatabaseMetaData.isReadOnly
No se pudo convertir java.sql.DatabaseMetaData.nullPlusNonNullIsNull
No se pudo convertir java.sql.DatabaseMetaData.nullsAreSortedAtEnd
No se pudo convertir java.sql.DatabaseMetaData.nullsAreSortedAtStart
No se pudo convertir java.sql.DatabaseMetaData.nullsAreSortedHigh
No se pudo convertir java.sql.DatabaseMetaData.nullsAreSortedLow
No se pudo convertir java.sql.DatabaseMetaData.othersDeletesAreVisible
No se pudo convertir java.sql.DatabaseMetaData.othersInsertsAreVisible
No se pudo convertir java.sql.DatabaseMetaData.othersUpdatesAreVisible
No se pudo convertir java.sql.DatabaseMetaData.ownDeletesAreVisible
No se pudo convertir java.sql.DatabaseMetaData.ownInsertsAreVisible
No se pudo convertir java.sql.DatabaseMetaData.ownUpdatesAreVisible
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnIn
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnInOut
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnOut
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnResult
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnReturn
No se pudo convertir java.sql.DatabaseMetaData.procedureColumnUnknown
No se pudo convertir java.sql.DatabaseMetaData.procedureNoNulls
No se pudo convertir java.sql.DatabaseMetaData.procedureNoResult
No se pudo convertir java.sql.DatabaseMetaData.procedureNullable
No se pudo convertir java.sql.DatabaseMetaData.procedureNullableUnknown
No se pudo convertir java.sql.DatabaseMetaData.procedureResultUnknown
No se pudo convertir java.sql.DatabaseMetaData.procedureReturnsResult
No se pudo convertir java.sql.DatabaseMetaData.storesLowerCaseIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.storesLowerCaseQuotedIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.storesMixedCaseIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.storesMixedCaseQuotedIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.storesUpperCaseIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.storesUpperCaseQuotedIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.supportsAlterTableWithAddColumn
No se pudo convertir java.sql.DatabaseMetaData.supportsAlterTableWithDropColumn
No se pudo convertir java.sql.DatabaseMetaData.supportsANSI92EntryLevelSQL
No se pudo convertir java.sql.DatabaseMetaData.supportsANSI92FullSQL
No se pudo convertir java.sql.DatabaseMetaData.supportsANSI92IntermediateSQL
No se pudo convertir java.sql.DatabaseMetaData.supportsBatchUpdates
No se pudo convertir java.sql.DatabaseMetaData.supportsCatalogsInDataManipulation
No se pudo convertir java.sql.DatabaseMetaData.supportsCatalogsInIndexDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsCatalogsInPrivilegeDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsCatalogsInProcedureCalls
No se pudo convertir java.sql.DatabaseMetaData.supportsCatalogsInTableDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsColumnAliasing
No se pudo convertir java.sql.DatabaseMetaData.supportsConvert
No se pudo convertir java.sql.DatabaseMetaData.supportsCoreSQLGrammar
No se pudo convertir java.sql.DatabaseMetaData.supportsCorrelatedSubqueries
No se pudo convertir java.sql.DatabaseMetaData.supportsDataDefinitionAndDataManipulationTransactions
No se pudo convertir java.sql.DatabaseMetaData.supportsDataManipulationTransactionsOnly
No se pudo convertir java.sql.DatabaseMetaData.supportsDifferentTableCorrelationNames
No se pudo convertir java.sql.DatabaseMetaData.supportsExpressionsInOrderBy
No se pudo convertir java.sql.DatabaseMetaData.supportsExtendedSQLGrammar
No se pudo convertir java.sql.DatabaseMetaData.supportsFullOuterJoins
No se pudo convertir java.sql.DatabaseMetaData.supportsGroupBy
No se pudo convertir java.sql.DatabaseMetaData.supportsGroupByBeyondSelect
No se pudo convertir java.sql.DatabaseMetaData.supportsGroupByUnrelated
No se pudo convertir java.sql.DatabaseMetaData.supportsIntegrityEnhancementFacility
No se pudo convertir java.sql.DatabaseMetaData.supportsLikeEscapeClause
No se pudo convertir java.sql.DatabaseMetaData.supportsLimitedOuterJoins
No se pudo convertir java.sql.DatabaseMetaData.supportsMinimumSQLGrammar
No se pudo convertir java.sql.DatabaseMetaData.supportsMixedCaseIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.supportsMixedCaseQuotedIdentifiers
No se pudo convertir java.sql.DatabaseMetaData.supportsMultipleResultSets
No se pudo convertir java.sql.DatabaseMetaData.supportsMultipleTransactions
No se pudo convertir java.sql.DatabaseMetaData.supportsNonNullableColumns
No se pudo convertir java.sql.DatabaseMetaData.supportsOpenCursorsAcrossCommit
No se pudo convertir java.sql.DatabaseMetaData.supportsOpenCursorsAcrossRollback
No se pudo convertir java.sql.DatabaseMetaData.supportsOpenStatementsAcrossCommit
No se pudo convertir java.sql.DatabaseMetaData.supportsOpenStatementsAcrossRollback
No se pudo convertir java.sql.DatabaseMetaData.supportsOrderByUnrelated
No se pudo convertir java.sql.DatabaseMetaData.supportsOuterJoins
No se pudo convertir java.sql.DatabaseMetaData.supportsPositionedDelete
No se pudo convertir java.sql.DatabaseMetaData.supportsPositionedUpdate
No se pudo convertir java.sql.DatabaseMetaData.supportsResultSetConcurrency
No se pudo convertir java.sql.DatabaseMetaData.supportsResultSetType
No se pudo convertir java.sql.DatabaseMetaData.supportsSchemasInDataManipulation
No se pudo convertir java.sql.DatabaseMetaData.supportsSchemasInIndexDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsSchemasInPrivilegeDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsSchemasInProcedureCalls
No se pudo convertir java.sql.DatabaseMetaData.supportsSchemasInTableDefinitions
No se pudo convertir java.sql.DatabaseMetaData.supportsSelectForUpdate
No se pudo convertir java.sql.DatabaseMetaData.supportsStoredProcedures
No se pudo convertir java.sql.DatabaseMetaData.supportsSubqueriesInComparisons
No se pudo convertir java.sql.DatabaseMetaData.supportsSubqueriesInExists
No se pudo convertir java.sql.DatabaseMetaData.supportsSubqueriesInIns
No se pudo convertir java.sql.DatabaseMetaData.supportsSubqueriesInQuantifieds
No se pudo convertir java.sql.DatabaseMetaData.supportsTableCorrelationNames
No se pudo convertir java.sql.DatabaseMetaData.supportsTransactionIsolationLevel
No se pudo convertir java.sql.DatabaseMetaData.supportsTransactions
No se pudo convertir java.sql.DatabaseMetaData.supportsUnion
No se pudo convertir java.sql.DatabaseMetaData.supportsUnionAll
No se pudo convertir java.sql.DatabaseMetaData.tableIndexClustered
No se pudo convertir java.sql.DatabaseMetaData.tableIndexHashed
No se pudo convertir java.sql.DatabaseMetaData.tableIndexOther
No se pudo convertir java.sql.DatabaseMetaData.tableIndexStatistic
No se pudo convertir java.sql.DatabaseMetaData.typeNoNulls
No se pudo convertir java.sql.DatabaseMetaData.typeNullable
No se pudo convertir java.sql.DatabaseMetaData.typeNullableUnknown
No se pudo convertir java.sql.DatabaseMetaData.typePredBasic
No se pudo convertir java.sql.DatabaseMetaData.typePredChar
No se pudo convertir java.sql.DatabaseMetaData.typePredNone
No se pudo convertir java.sql.DatabaseMetaData.typeSearchable
No se pudo convertir java.sql.DatabaseMetaData.updatesAreDetected
No se pudo convertir java.sql.DatabaseMetaData.usesLocalFilePerTable
No se pudo convertir java.sql.DatabaseMetaData.usesLocalFiles
No se pudo convertir java.sql.DatabaseMetaData.versionColumnNotPseudo
No se pudo convertir java.sql.DatabaseMetaData.versionColumnPseudo
No se pudo convertir java.sql.DatabaseMetaData.versionColumnUnknown
No se pudo convertir java.sql.DataTruncation
No se pudo convertir java.sql.Date.Date
No se pudo convertir java.sql.Date.getHours
No se pudo convertir java.sql.Date.getMinutes
No se pudo convertir java.sql.Date.getSeconds
No se pudo convertir java.sql.Date.setHours
No se pudo convertir java.sql.Date.setMinutes
No se pudo convertir java.sql.Date.setSeconds
No se pudo convertir java.sql.DriverInfo
No se pudo convertir java.sql.DriverManager
No se pudo convertir java.sql.DriverPropertyInfo
No se pudo convertir java.sql.PreparedStatement.addBatch
No se pudo convertir java.sql.PreparedStatement.getMetaData
No se pudo convertir java.sql.PreparedStatement.setArray
No se pudo convertir java.sql.PreparedStatement.setBlob
No se pudo convertir java.sql.PreparedStatement.setClob
No se pudo convertir java.sql.PreparedStatement.setDate
No se pudo convertir java.sql.PreparedStatement.setNull
No se pudo convertir java.sql.PreparedStatement.setRef
No se pudo convertir java.sql.PreparedStatement.setTime
No se pudo convertir java.sql.PreparedStatement.setTimestamp
No se pudo convertir java.sql.Ref
No se pudo convertir java.sql.ResultSet
No se pudo convertir java.sql.ResultSet.<ModoConcurrencia>
No se pudo convertir java.sql.ResultSet.absolute
No se pudo convertir java.sql.ResultSet.afterLast
No se pudo convertir java.sql.ResultSet.beforeFirst
No se pudo convertir java.sql.ResultSet.cancelRowUpdates
No se pudo convertir java.sql.ResultSet.clearWarnings
No se pudo convertir java.sql.ResultSet.close
No se pudo convertir java.sql.ResultSet.deleteRow
No se pudo convertir java.sql.ResultSet.findColumn
No se pudo convertir java.sql.ResultSet.first
No se pudo convertir java.sql.ResultSet.getArray
No se pudo convertir java.sql.ResultSet.getAsciiStream
No se pudo convertir java.sql.ResultSet.getBigDecimal
No se pudo convertir java.sql.ResultSet.getBinaryStream
No se pudo convertir java.sql.ResultSet.getBlob
No se pudo convertir java.sql.ResultSet.getBoolean
No se pudo convertir java.sql.ResultSet.getByte
No se pudo convertir java.sql.ResultSet.getBytes
No se pudo convertir java.sql.ResultSet.getCharacterStream
No se pudo convertir java.sql.ResultSet.getClob
No se pudo convertir java.sql.ResultSet.getConcurrency
No se pudo convertir java.sql.ResultSet.getCursorName
No se pudo convertir java.sql.ResultSet.getDate
No se pudo convertir java.sql.ResultSet.getDouble
No se pudo convertir java.sql.ResultSet.getFetchDirection
No se pudo convertir java.sql.ResultSet.getFetchSize
No se pudo convertir java.sql.ResultSet.getFloat
No se pudo convertir java.sql.ResultSet.getInt
No se pudo convertir java.sql.ResultSet.getLong
No se pudo convertir java.sql.ResultSet.getMetaData
No se pudo convertir java.sql.ResultSet.getObject
No se pudo convertir java.sql.ResultSet.getRef
No se pudo convertir java.sql.ResultSet.getRow
No se pudo convertir java.sql.ResultSet.getShort
No se pudo convertir java.sql.ResultSet.getStatement
No se pudo convertir java.sql.ResultSet.getString
No se pudo convertir java.sql.ResultSet.getTime
No se pudo convertir java.sql.ResultSet.getTimestamp
No se pudo convertir java.sql.ResultSet.getType
No se pudo convertir java.sql.ResultSet.getUnicodeStream
No se pudo convertir java.sql.ResultSet.getWarnings
No se pudo convertir java.sql.ResultSet.insertRow
No se pudo convertir java.sql.ResultSet.isAfterLast
No se pudo convertir java.sql.ResultSet.isBeforeFirst
No se pudo convertir java.sql.ResultSet.isFirst
No se pudo convertir java.sql.ResultSet.isLast
No se pudo convertir java.sql.ResultSet.last
No se pudo convertir java.sql.ResultSet.moveToCurrentRow
No se pudo convertir java.sql.ResultSet.moveToInsertRow
No se pudo convertir java.sql.ResultSet.next
No se pudo convertir java.sql.ResultSet.previous
No se pudo convertir java.sql.ResultSet.refreshRow
No se pudo convertir java.sql.ResultSet.relative
No se pudo convertir java.sql.ResultSet.rowDeleted
No se pudo convertir java.sql.ResultSet.rowInserted
No se pudo convertir java.sql.ResultSet.rowUpdated
No se pudo convertir java.sql.ResultSet.setFetchDirection
No se pudo convertir java.sql.ResultSet.setFetchSize
No se pudo convertir java.sql.ResultSet.TYPE_FORWARD_ONLY
No se pudo convertir java.sql.ResultSet.updateAsciiStream
No se pudo convertir java.sql.ResultSet.updateBigDecimal
No se pudo convertir java.sql.ResultSet.updateBinaryStream
No se pudo convertir java.sql.ResultSet.updateBoolean
No se pudo convertir java.sql.ResultSet.updateByte
No se pudo convertir java.sql.ResultSet.updateBytes
No se pudo convertir java.sql.ResultSet.updateCharacterStream
No se pudo convertir java.sql.ResultSet.updateDate
No se pudo convertir java.sql.ResultSet.updateDouble
No se pudo convertir java.sql.ResultSet.updateFloat
No se pudo convertir java.sql.ResultSet.updateInt
No se pudo convertir java.sql.ResultSet.updateLong
No se pudo convertir java.sql.ResultSet.updateNull
No se pudo convertir java.sql.ResultSet.updateObject
No se pudo convertir java.sql.ResultSet.updateRow
No se pudo convertir java.sql.ResultSetMetaData.isSigned
No se pudo convertir java.sql.ResultSet.updateString
No se pudo convertir java.sql.ResultSet.updateTime
No se pudo convertir java.sql.ResultSet.updateTimestamp
No se pudo convertir java.sql.ResultSet.wasNull
No se pudo convertir java.sql.ResultSetMetaData.columnNoNulls
No se pudo convertir java.sql.ResultSetMetaData.columnNullable
No se pudo convertir java.sql.ResultSetMetaData.columnNullableUnknown
No se pudo convertir java.sql.ResultSetMetaData.getPrecision
No se pudo convertir java.sql.ResultSetMetaData.isCaseSensitive
No se pudo convertir java.sql.ResultSetMetaData.isCurrency
No se pudo convertir java.sql.ResultSetMetaData.isDefinitelyWritable
No se pudo convertir java.sql.ResultSetMetaData.isSearchable
No se pudo convertir java.sql.ResultSetMetaData.isSigned
No se pudo convertir java.sql.ResultSetMetaData.isWritable
No se pudo convertir javax.sql.RowSetMetaData.setNullable
No se pudo convertir java.sql.SQLData
No se pudo convertir java.sql.SQLException.getNextException
No se pudo convertir java.sql.SQLException.setNextException
No se pudo convertir java.sql.SQLException.SQLException
No se pudo convertir java.sql.SQLInput
No se pudo convertir java.sql.SQLOutput
No se pudo convertir java.sql.SQLPermission
No se pudo convertir java.sql.SQLWarning
No se pudo convertir java.sql.Statement.clearWarnings
No se pudo convertir java.sql.Statement.close
No se pudo convertir java.sql.Statement.execute
No se pudo convertir java.sql.Statement.executeBatch
No se pudo convertir java.sql.Statement.getFetchDirection
No se pudo convertir java.sql.Statement.getFetchSize
No se pudo convertir java.sql.Statement.getMaxFieldSize
No se pudo convertir java.sql.Statement.getMaxRows
No se pudo convertir java.sql.Statement.getMoreResults
No se pudo convertir java.sql.Statement.getResultSet
No se pudo convertir java.sql.Statement.getResultSetConcurrency
No se pudo convertir java.sql.Statement.getResultSetType
No se pudo convertir java.sql.Statement.getUpdateCount
No se pudo convertir java.sql.Statement.getWarnings
No se pudo convertir java.sql.Statement.setCursorName
No se pudo convertir java.sql.Statement.setEscapeProcessing
No se pudo convertir java.sql.Statement.setFetchDirection
No se pudo convertir java.sql.Statement.setFetchSize
No se pudo convertir java.sql.Statement.setMaxFieldSize
No se pudo convertir java.sql.Statement.setMaxRows
No se pudo convertir java.sql.Struct
No se pudo convertir java.sql.Timestamp.getNanos
No se pudo convertir java.sql.Timestamp.setNanos
No se pudo convertir java.sql.Timestamp.Timestamp
No se pudo convertir java.sql.Types.<NombreTipo>
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.text


No se pudo convertir java.text.Annotation
No se pudo convertir java.text.AttributedCharacterIterator
No se pudo convertir java.text.AttributedCharacterIterator.Attribute
No se pudo convertir java.text.AttributedString
No se pudo convertir java.text.BreakDictionary
No se pudo convertir java.text.BreakIterator
No se pudo convertir java.text.CharacterIterator.clone
No se pudo convertir java.text.ChoiceFormat
No se pudo convertir java.text.CollationElementIterator
No se pudo convertir java.text.CollationKey.compareTo
No se pudo convertir java.text.Collator.CANONICAL_DECOMPOSITION
No se pudo convertir java.text.Collator.Collator
No se pudo convertir java.text.Collator.compare
No se pudo convertir java.text.Collator.FULL_DECOMPOSITION
No se pudo convertir java.text.Collator.getDecomposition
No se pudo convertir java.text.Collator.getStrength
No se pudo convertir java.text.Collator.IDENTICAL
No se pudo convertir java.text.Collator.NO_DECOMPOSITION
No se pudo convertir java.text.Collator.PRIMARY
No se pudo convertir java.text.Collator.SECONDARY
No se pudo convertir java.text.Collator.setDecomposition
No se pudo convertir java.text.Collator.setStrength
No se pudo convertir java.text.Collator.TERTIARY
No se pudo convertir java.text.DateFormat.format
No se pudo convertir java.text.DateFormat.getNumberFormat
No se pudo convertir java.text.DateFormat.getTimeZone
No se pudo convertir java.text.DateFormat.isLenient
No se pudo convertir java.text.DateFormat.numberFormat
No se pudo convertir java.text.DateFormat.parse
No se pudo convertir java.text.DateFormat.parseObject
No se pudo convertir java.text.DateFormat.setLenient
No se pudo convertir java.text.DateFormat.setNumberFormat
No se pudo convertir java.text.DateFormat.setTimeZone
No se pudo convertir java.text.DateFormatSymbols.DateFormatSymbols
No se pudo convertir java.text.DateFormatSymbols.getEras
No se pudo convertir java.text.DateFormatSymbols.getLocalPatternChars
No se pudo convertir java.text.DateFormatSymbols.getZoneStrings
No se pudo convertir java.text.DateFormatSymbols.setEras
No se pudo convertir java.text.DateFormatSymbols.setLocalPatternChars
No se pudo convertir java.text.DateFormatSymbols.setZoneStrings
No se pudo convertir java.text.DecimalFormat
No se pudo convertir java.text.DecimalFormatSymbols.DecimalFormatSymbols
No se pudo convertir java.text.DecimalFormatSymbols.getDigit
No se pudo convertir java.text.DecimalFormatSymbols.getInternationalCurrencySymbol
No se pudo convertir java.text.DecimalFormatSymbols.getPatternSeparator
No se pudo convertir java.text.DecimalFormatSymbols.getZeroDigit
No se pudo convertir java.text.DecimalFormatSymbols.setDigit
No se pudo convertir java.text.DecimalFormatSymbols.setInternationalCurrencySymbol
No se pudo convertir java.text.DecimalFormatSymbols.setPatternSeparator
No se pudo convertir java.text.DecimalFormatSymbols.setZeroDigit
No se pudo convertir java.text.DictionaryBasedBreakIterator
No se pudo convertir java.text.FieldPosition
No se pudo convertir java.text.Format
No se pudo convertir java.text.Format.format
No se pudo convertir java.text.MessageFormat
No se pudo convertir java.text.NumberFormat.format
No se pudo convertir java.text.NumberFormat.FRACTION_FIELD
No se pudo convertir java.text.NumberFormat.INTEGER_FIELD
No se pudo convertir java.text.NumberFormat.isParseIntegerOnly
No se pudo convertir java.text.NumberFormat.parse
No se pudo convertir java.text.NumberFormat.parseObject
No se pudo convertir java.text.NumberFormat.setParseIntegerOnly
No se pudo convertir java.text.ParseException
No se pudo convertir java.text.ParseException.getErrorOffset
No se pudo convertir java.text.ParsePosition.getErrorIndex
No se pudo convertir java.text.ParsePosition.setErrorIndex
No se pudo convertir java.text.ParsePosition.toString
No se pudo convertir java.text.RuleBasedBreakIterator
No se pudo convertir java.text.RuleBasedCollator
No se pudo convertir java.text.SimpleDateFormat
No se pudo convertir java.text.StringCharacterIterator.clone
No se pudo convertir java.text.StringCharacterIterator.setText
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.text.resources


No se pudo convertir java.text.resources.BreakIteratorRules.BreakIteratorRules
No se pudo convertir java.text.resources.BreakIteratorRules.getContents
No se pudo convertir java.text.resources.DateFormatZoneData.DateFormatZoneData
No se pudo convertir java.text.resources.DateFormatZoneData.getContents
No se pudo convertir java.text.resources.DateFormatZoneData.getKeys
No se pudo convertir java.text.resources.DateFormatZoneData_ar
No se pudo convertir java.text.resources.DateFormatZoneData_ar.DateFormatZoneData_ar
No se pudo convertir java.text.resources.DateFormatZoneData_ar.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_be
No se pudo convertir java.text.resources.DateFormatZoneData_be.DateFormatZoneData_be
No se pudo convertir java.text.resources.DateFormatZoneData_be.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_bg
No se pudo convertir java.text.resources.DateFormatZoneData_bg.DateFormatZoneData_bg
No se pudo convertir java.text.resources.DateFormatZoneData_bg.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_ca
No se pudo convertir java.text.resources.DateFormatZoneData_ca.DateFormatZoneData_ca
No se pudo convertir java.text.resources.DateFormatZoneData_ca.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_cs.DateFormatZoneData_cs
No se pudo convertir java.text.resources.DateFormatZoneData_cs.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_da.DateFormatZoneData_da
No se pudo convertir java.text.resources.DateFormatZoneData_da.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_de
No se pudo convertir java.text.resources.DateFormatZoneData_de.DateFormatZoneData_de
No se pudo convertir java.text.resources.DateFormatZoneData_de.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_de_AT
No se pudo convertir java.text.resources.DateFormatZoneData_de_AT.DateFormatZoneData_de_AT
No se pudo convertir java.text.resources.DateFormatZoneData_de_AT.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_de_CH
No se pudo convertir java.text.resources.DateFormatZoneData_de_CH.DateFormatZoneData_de_CH
No se pudo convertir java.text.resources.DateFormatZoneData_de_CH.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_el
No se pudo convertir java.text.resources.DateFormatZoneData_el.DateFormatZoneData_el
No se pudo convertir java.text.resources.DateFormatZoneData_el.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_en
No se pudo convertir java.text.resources.DateFormatZoneData_en.DateFormatZoneData_en
No se pudo convertir java.text.resources.DateFormatZoneData_en.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_en_CA
No se pudo convertir java.text.resources.DateFormatZoneData_en_CA.DateFormatZoneData_en_CA
No se pudo convertir java.text.resources.DateFormatZoneData_en_CA.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_en_GB
No se pudo convertir java.text.resources.DateFormatZoneData_en_GB.DateFormatZoneData_en_GB
No se pudo convertir java.text.resources.DateFormatZoneData_en_GB.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_en_IE
No se pudo convertir java.text.resources.DateFormatZoneData_en_IE.DateFormatZoneData_en_IE
No se pudo convertir java.text.resources.DateFormatZoneData_en_IE.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_es
No se pudo convertir java.text.resources.DateFormatZoneData_es.DateFormatZoneData_es
No se pudo convertir java.text.resources.DateFormatZoneData_es.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_et
No se pudo convertir java.text.resources.DateFormatZoneData_et.DateFormatZoneData_et
No se pudo convertir java.text.resources.DateFormatZoneData_et.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_fi
No se pudo convertir java.text.resources.DateFormatZoneData_fi.DateFormatZoneData_fi
No se pudo convertir java.text.resources.DateFormatZoneData_fi.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_fr
No se pudo convertir java.text.resources.DateFormatZoneData_fr.DateFormatZoneData_fr
No se pudo convertir java.text.resources.DateFormatZoneData_fr.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_fr_BE
No se pudo convertir java.text.resources.DateFormatZoneData_fr_BE.DateFormatZoneData_fr_BE
No se pudo convertir java.text.resources.DateFormatZoneData_fr_BE.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CA
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CA.DateFormatZoneData_fr_CA
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CA.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CH
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CH.DateFormatZoneData_fr_CH
No se pudo convertir java.text.resources.DateFormatZoneData_fr_CH.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_hr
No se pudo convertir java.text.resources.DateFormatZoneData_hr.DateFormatZoneData_hr
No se pudo convertir java.text.resources.DateFormatZoneData_hr.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_hu
No se pudo convertir java.text.resources.DateFormatZoneData_hu.DateFormatZoneData_hu
No se pudo convertir java.text.resources.DateFormatZoneData_hu.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_is
No se pudo convertir java.text.resources.DateFormatZoneData_is.DateFormatZoneData_is
No se pudo convertir java.text.resources.DateFormatZoneData_is.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_it
No se pudo convertir java.text.resources.DateFormatZoneData_it.DateFormatZoneData_it
No se pudo convertir java.text.resources.DateFormatZoneData_it.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_it_CH
No se pudo convertir java.text.resources.DateFormatZoneData_it_CH.DateFormatZoneData_it_CH
No se pudo convertir java.text.resources.DateFormatZoneData_it_CH.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_iw
No se pudo convertir java.text.resources.DateFormatZoneData_iw.DateFormatZoneData_iw
No se pudo convertir java.text.resources.DateFormatZoneData_iw.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_ja
No se pudo convertir java.text.resources.DateFormatZoneData_ja.DateFormatZoneData_ja
No se pudo convertir java.text.resources.DateFormatZoneData_ja.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_ko
No se pudo convertir java.text.resources.DateFormatZoneData_ko.DateFormatZoneData_ko
No se pudo convertir java.text.resources.DateFormatZoneData_ko.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_lt
No se pudo convertir java.text.resources.DateFormatZoneData_lt.DateFormatZoneData_lt
No se pudo convertir java.text.resources.DateFormatZoneData_lt.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_lv
No se pudo convertir java.text.resources.DateFormatZoneData_lv.DateFormatZoneData_lv
No se pudo convertir java.text.resources.DateFormatZoneData_lv.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_mk
No se pudo convertir java.text.resources.DateFormatZoneData_mk.DateFormatZoneData_mk
No se pudo convertir java.text.resources.DateFormatZoneData_mk.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_nl
No se pudo convertir java.text.resources.DateFormatZoneData_nl.DateFormatZoneData_nl
No se pudo convertir java.text.resources.DateFormatZoneData_nl.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_nl_BE
No se pudo convertir java.text.resources.DateFormatZoneData_nl_BE.DateFormatZoneData_nl_BE
No se pudo convertir java.text.resources.DateFormatZoneData_nl_BE.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_no
No se pudo convertir java.text.resources.DateFormatZoneData_no.DateFormatZoneData_no
No se pudo convertir java.text.resources.DateFormatZoneData_no.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_no_NO_NY
No se pudo convertir java.text.resources.DateFormatZoneData_no_NO_NY.DateFormatZoneData_no_NO_NY
No se pudo convertir java.text.resources.DateFormatZoneData_no_NO_NY.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_pl
No se pudo convertir java.text.resources.DateFormatZoneData_pl.DateFormatZoneData_pl
No se pudo convertir java.text.resources.DateFormatZoneData_pl.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_pt
No se pudo convertir java.text.resources.DateFormatZoneData_pt.DateFormatZoneData_pt
No se pudo convertir java.text.resources.DateFormatZoneData_pt.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_ro
No se pudo convertir java.text.resources.DateFormatZoneData_ro.DateFormatZoneData_ro
No se pudo convertir java.text.resources.DateFormatZoneData_ro.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_ru
No se pudo convertir java.text.resources.DateFormatZoneData_ru.DateFormatZoneData_ru
No se pudo convertir java.text.resources.DateFormatZoneData_ru.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sh
No se pudo convertir java.text.resources.DateFormatZoneData_sh.DateFormatZoneData_sh
No se pudo convertir java.text.resources.DateFormatZoneData_sh.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sk
No se pudo convertir java.text.resources.DateFormatZoneData_sk.DateFormatZoneData_sk
No se pudo convertir java.text.resources.DateFormatZoneData_sk.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sl
No se pudo convertir java.text.resources.DateFormatZoneData_sl.DateFormatZoneData_sl
No se pudo convertir java.text.resources.DateFormatZoneData_sl.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sq
No se pudo convertir java.text.resources.DateFormatZoneData_sq.DateFormatZoneData_sq
No se pudo convertir java.text.resources.DateFormatZoneData_sq.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sr
No se pudo convertir java.text.resources.DateFormatZoneData_sr.DateFormatZoneData_sr
No se pudo convertir java.text.resources.DateFormatZoneData_sr.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_sv
No se pudo convertir java.text.resources.DateFormatZoneData_sv.DateFormatZoneData_sv
No se pudo convertir java.text.resources.DateFormatZoneData_sv.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_th
No se pudo convertir java.text.resources.DateFormatZoneData_th.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_tr
No se pudo convertir java.text.resources.DateFormatZoneData_tr.DateFormatZoneData_tr
No se pudo convertir java.text.resources.DateFormatZoneData_tr.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_uk
No se pudo convertir java.text.resources.DateFormatZoneData_uk.DateFormatZoneData_uk
No se pudo convertir java.text.resources.DateFormatZoneData_uk.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_zh
No se pudo convertir java.text.resources.DateFormatZoneData_zh.DateFormatZoneData_zh
No se pudo convertir java.text.resources.DateFormatZoneData_zh.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_zh_HK
No se pudo convertir java.text.resources.DateFormatZoneData_zh_HK.getContents
No se pudo convertir java.text.resources.DateFormatZoneData_zh_TW
No se pudo convertir java.text.resources.DateFormatZoneData_zh_TW.DateFormatZoneData_zh_TW
No se pudo convertir java.text.resources.DateFormatZoneData_zh_TW.getContents
No se pudo convertir java.text.resources.LocaleData.getKeys
No se pudo convertir java.text.resources.LocaleData.init
No se pudo convertir java.text.resources.LocaleData.LocaleData
No se pudo convertir java.text.resources.LocaleElements.getContents
No se pudo convertir java.text.resources.LocaleElements.LocaleElements
No se pudo convertir java.text.resources.LocaleElements_ar
No se pudo convertir java.text.resources.LocaleElements_ar.LocaleElements_ar
No se pudo convertir java.text.resources.LocaleElements_ar_AE
No se pudo convertir java.text.resources.LocaleElements_ar_AE.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_AE.LocaleElements_ar_AE
No se pudo convertir java.text.resources.LocaleElements_ar_BH
No se pudo convertir java.text.resources.LocaleElements_ar_BH.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_BH.LocaleElements_ar_BH
No se pudo convertir java.text.resources.LocaleElements_ar_DZ
No se pudo convertir java.text.resources.LocaleElements_ar_DZ.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_DZ.LocaleElements_ar_DZ
No se pudo convertir java.text.resources.LocaleElements_ar_EG
No se pudo convertir java.text.resources.LocaleElements_ar_EG.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_EG.LocaleElements_ar_EG
No se pudo convertir java.text.resources.LocaleElements_ar_IQ
No se pudo convertir java.text.resources.LocaleElements_ar_IQ.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_IQ.LocaleElements_ar_IQ
No se pudo convertir java.text.resources.LocaleElements_ar_JO
No se pudo convertir java.text.resources.LocaleElements_ar_JO.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_JO.LocaleElements_ar_JO
No se pudo convertir java.text.resources.LocaleElements_ar_KW
No se pudo convertir java.text.resources.LocaleElements_ar_KW.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_KW.LocaleElements_ar_KW
No se pudo convertir java.text.resources.LocaleElements_ar_LB
No se pudo convertir java.text.resources.LocaleElements_ar_LB.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_LB.LocaleElements_ar_LB
No se pudo convertir java.text.resources.LocaleElements_ar_LY.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_LY.LocaleElements_ar_LY
No se pudo convertir java.text.resources.LocaleElements_ar_MA
No se pudo convertir java.text.resources.LocaleElements_ar_MA.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_MA.LocaleElements_ar_MA
No se pudo convertir java.text.resources.LocaleElements_ar_OM
No se pudo convertir java.text.resources.LocaleElements_ar_OM.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_OM.LocaleElements_ar_OM
No se pudo convertir java.text.resources.LocaleElements_ar_QA
No se pudo convertir java.text.resources.LocaleElements_ar_QA.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_QA.LocaleElements_ar_QA
No se pudo convertir java.text.resources.LocaleElements_ar_SA
No se pudo convertir java.text.resources.LocaleElements_ar_SA.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_SA.LocaleElements_ar_SA
No se pudo convertir java.text.resources.LocaleElements_ar_SD
No se pudo convertir java.text.resources.LocaleElements_ar_SD.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_SD.LocaleElements_ar_SD
No se pudo convertir java.text.resources.LocaleElements_ar_SY
No se pudo convertir java.text.resources.LocaleElements_ar_SY.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_SY.LocaleElements_ar_SY
No se pudo convertir java.text.resources.LocaleElements_ar_TN
No se pudo convertir java.text.resources.LocaleElements_ar_TN.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_TN.LocaleElements_ar_TN
No se pudo convertir java.text.resources.LocaleElements_ar_YE
No se pudo convertir java.text.resources.LocaleElements_ar_YE.getContents
No se pudo convertir java.text.resources.LocaleElements_ar_YE.LocaleElements_ar_YE
No se pudo convertir java.text.resources.LocaleElements_be
No se pudo convertir java.text.resources.LocaleElements_be.LocaleElements_be
No se pudo convertir java.text.resources.LocaleElements_be_BY
No se pudo convertir java.text.resources.LocaleElements_be_BY.getContents
No se pudo convertir java.text.resources.LocaleElements_be_BY.LocaleElements_be_BY
No se pudo convertir java.text.resources.LocaleElements_bg
No se pudo convertir java.text.resources.LocaleElements_bg.LocaleElements_bg
No se pudo convertir java.text.resources.LocaleElements_bg_BG
No se pudo convertir java.text.resources.LocaleElements_bg_BG.getContents
No se pudo convertir java.text.resources.LocaleElements_bg_BG.LocaleElements_bg_BG
No se pudo convertir java.text.resources.LocaleElements_ca
No se pudo convertir java.text.resources.LocaleElements_ca.LocaleElements_ca
No se pudo convertir java.text.resources.LocaleElements_ca_ES
No se pudo convertir java.text.resources.LocaleElements_ca_ES.getContents
No se pudo convertir java.text.resources.LocaleElements_ca_ES.LocaleElements_ca_ES
No se pudo convertir java.text.resources.LocaleElements_ca_ES_EURO
No se pudo convertir java.text.resources.LocaleElements_ca_ES_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_ca_ES_EURO.LocaleElements_ca_ES_EURO
No se pudo convertir java.text.resources.LocaleElements_cs
No se pudo convertir java.text.resources.LocaleElements_cs.LocaleElements_cs
No se pudo convertir java.text.resources.LocaleElements_cs_CZ
No se pudo convertir java.text.resources.LocaleElements_cs_CZ.getContents
No se pudo convertir java.text.resources.LocaleElements_cs_CZ.LocaleElements_cs_CZ
No se pudo convertir java.text.resources.LocaleElements_da
No se pudo convertir java.text.resources.LocaleElements_da.LocaleElements_da
No se pudo convertir java.text.resources.LocaleElements_da_DK
No se pudo convertir java.text.resources.LocaleElements_da_DK.getContents
No se pudo convertir java.text.resources.LocaleElements_da_DK.LocaleElements_da_DK
No se pudo convertir java.text.resources.LocaleElements_de
No se pudo convertir java.text.resources.LocaleElements_de.LocaleElements_de
No se pudo convertir java.text.resources.LocaleElements_de_AT
No se pudo convertir java.text.resources.LocaleElements_de_AT.LocaleElements_de_AT
No se pudo convertir java.text.resources.LocaleElements_de_AT_EURO
No se pudo convertir java.text.resources.LocaleElements_de_AT_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_de_AT_EURO.LocaleElements_de_AT_EURO
No se pudo convertir java.text.resources.LocaleElements_de_CH
No se pudo convertir java.text.resources.LocaleElements_de_CH.LocaleElements_de_CH
No se pudo convertir java.text.resources.LocaleElements_de_DE
No se pudo convertir java.text.resources.LocaleElements_de_DE.getContents
No se pudo convertir java.text.resources.LocaleElements_de_DE.LocaleElements_de_DE
No se pudo convertir java.text.resources.LocaleElements_de_DE_EURO
No se pudo convertir java.text.resources.LocaleElements_de_DE_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_de_DE_EURO.LocaleElements_de_DE_EURO
No se pudo convertir java.text.resources.LocaleElements_de_LU
No se pudo convertir java.text.resources.LocaleElements_de_LU.getContents
No se pudo convertir java.text.resources.LocaleElements_de_LU.LocaleElements_de_LU
No se pudo convertir java.text.resources.LocaleElements_de_LU_EURO
No se pudo convertir java.text.resources.LocaleElements_de_LU_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_de_LU_EURO.LocaleElements_de_LU_EURO
No se pudo convertir java.text.resources.LocaleElements_el
No se pudo convertir java.text.resources.LocaleElements_el.LocaleElements_el
No se pudo convertir java.text.resources.LocaleElements_el_GR
No se pudo convertir java.text.resources.LocaleElements_el_GR.getContents
No se pudo convertir java.text.resources.LocaleElements_el_GR.LocaleElements_el_GR
No se pudo convertir java.text.resources.LocaleElements_en
No se pudo convertir java.text.resources.LocaleElements_en.getContents
No se pudo convertir java.text.resources.LocaleElements_en.LocaleElements_en
No se pudo convertir java.text.resources.LocaleElements_en_AU
No se pudo convertir java.text.resources.LocaleElements_en_AU.LocaleElements_en_AU
No se pudo convertir java.text.resources.LocaleElements_en_CA
No se pudo convertir java.text.resources.LocaleElements_en_CA.LocaleElements_en_CA
No se pudo convertir java.text.resources.LocaleElements_en_GB
No se pudo convertir java.text.resources.LocaleElements_en_GB.LocaleElements_en_GB
No se pudo convertir java.text.resources.LocaleElements_en_IE
No se pudo convertir java.text.resources.LocaleElements_en_IE.LocaleElements_en_IE
No se pudo convertir java.text.resources.LocaleElements_en_IE_EURO
No se pudo convertir java.text.resources.LocaleElements_en_IE_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_en_IE_EURO.LocaleElements_en_IE_EURO
No se pudo convertir java.text.resources.LocaleElements_en_IR
No se pudo convertir java.text.resources.LocaleElements_en_IR.LocaleElements_en_IR
No se pudo convertir java.text.resources.LocaleElements_en_NZ
No se pudo convertir java.text.resources.LocaleElements_en_NZ.LocaleElements_en_NZ
No se pudo convertir java.text.resources.LocaleElements_en_US
No se pudo convertir java.text.resources.LocaleElements_en_US.getContents
No se pudo convertir java.text.resources.LocaleElements_en_US.LocaleElements_en_US
No se pudo convertir java.text.resources.LocaleElements_en_ZA
No se pudo convertir java.text.resources.LocaleElements_en_ZA.LocaleElements_en_ZA
No se pudo convertir java.text.resources.LocaleElements_es
No se pudo convertir java.text.resources.LocaleElements_es.LocaleElements_es
No se pudo convertir java.text.resources.LocaleElements_es_AR
No se pudo convertir java.text.resources.LocaleElements_es_AR.getContents
No se pudo convertir java.text.resources.LocaleElements_es_AR.LocaleElements_es_AR
No se pudo convertir java.text.resources.LocaleElements_es_BO
No se pudo convertir java.text.resources.LocaleElements_es_BO.getContents
No se pudo convertir java.text.resources.LocaleElements_es_BO.LocaleElements_es_BO
No se pudo convertir java.text.resources.LocaleElements_es_CL
No se pudo convertir java.text.resources.LocaleElements_es_CL.getContents
No se pudo convertir java.text.resources.LocaleElements_es_CL.LocaleElements_es_CL
No se pudo convertir java.text.resources.LocaleElements_es_CO
No se pudo convertir java.text.resources.LocaleElements_es_CO.getContents
No se pudo convertir java.text.resources.LocaleElements_es_CO.LocaleElements_es_CO
No se pudo convertir java.text.resources.LocaleElements_es_CR
No se pudo convertir java.text.resources.LocaleElements_es_CR.getContents
No se pudo convertir java.text.resources.LocaleElements_es_CR.LocaleElements_es_CR
No se pudo convertir java.text.resources.LocaleElements_es_DO
No se pudo convertir java.text.resources.LocaleElements_es_DO.getContents
No se pudo convertir java.text.resources.LocaleElements_es_DO.LocaleElements_es_DO
No se pudo convertir java.text.resources.LocaleElements_es_EC
No se pudo convertir java.text.resources.LocaleElements_es_EC.getContents
No se pudo convertir java.text.resources.LocaleElements_es_EC.LocaleElements_es_EC
No se pudo convertir java.text.resources.LocaleElements_es_ES
No se pudo convertir java.text.resources.LocaleElements_es_ES.getContents
No se pudo convertir java.text.resources.LocaleElements_es_ES.LocaleElements_es_ES
No se pudo convertir java.text.resources.LocaleElements_es_ES_EURO
No se pudo convertir java.text.resources.LocaleElements_es_ES_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_es_ES_EURO.LocaleElements_es_ES_EURO
No se pudo convertir java.text.resources.LocaleElements_es_GT
No se pudo convertir java.text.resources.LocaleElements_es_GT.getContents
No se pudo convertir java.text.resources.LocaleElements_es_GT.LocaleElements_es_GT
No se pudo convertir java.text.resources.LocaleElements_es_HN
No se pudo convertir java.text.resources.LocaleElements_es_HN.getContents
No se pudo convertir java.text.resources.LocaleElements_es_HN.LocaleElements_es_HN
No se pudo convertir java.text.resources.LocaleElements_es_MX
No se pudo convertir java.text.resources.LocaleElements_es_MX.LocaleElements_es_MX
No se pudo convertir java.text.resources.LocaleElements_es_NI
No se pudo convertir java.text.resources.LocaleElements_es_NI.getContents
No se pudo convertir java.text.resources.LocaleElements_es_NI.LocaleElements_es_NI
No se pudo convertir java.text.resources.LocaleElements_es_PA
No se pudo convertir java.text.resources.LocaleElements_es_PA.getContents
No se pudo convertir java.text.resources.LocaleElements_es_PA.LocaleElements_es_PA
No se pudo convertir java.text.resources.LocaleElements_es_PE
No se pudo convertir java.text.resources.LocaleElements_es_PE.getContents
No se pudo convertir java.text.resources.LocaleElements_es_PE.LocaleElements_es_PE
No se pudo convertir java.text.resources.LocaleElements_es_PR
No se pudo convertir java.text.resources.LocaleElements_es_PR.getContents
No se pudo convertir java.text.resources.LocaleElements_es_PR.LocaleElements_es_PR
No se pudo convertir java.text.resources.LocaleElements_es_PY
No se pudo convertir java.text.resources.LocaleElements_es_PY.getContents
No se pudo convertir java.text.resources.LocaleElements_es_PY.LocaleElements_es_PY
No se pudo convertir java.text.resources.LocaleElements_es_SV
No se pudo convertir java.text.resources.LocaleElements_es_SV.getContents
No se pudo convertir java.text.resources.LocaleElements_es_SV.LocaleElements_es_SV
No se pudo convertir java.text.resources.LocaleElements_es_UY
No se pudo convertir java.text.resources.LocaleElements_es_UY.getContents
No se pudo convertir java.text.resources.LocaleElements_es_UY.LocaleElements_es_UY
No se pudo convertir java.text.resources.LocaleElements_es_VE
No se pudo convertir java.text.resources.LocaleElements_es_VE.getContents
No se pudo convertir java.text.resources.LocaleElements_es_VE.LocaleElements_es_VE
No se pudo convertir java.text.resources.LocaleElements_et
No se pudo convertir java.text.resources.LocaleElements_et.LocaleElements_et
No se pudo convertir java.text.resources.LocaleElements_et_EE
No se pudo convertir java.text.resources.LocaleElements_et_EE.getContents
No se pudo convertir java.text.resources.LocaleElements_et_EE.LocaleElements_et_EE
No se pudo convertir java.text.resources.LocaleElements_fi
No se pudo convertir java.text.resources.LocaleElements_fi.LocaleElements_fi
No se pudo convertir java.text.resources.LocaleElements_fi_FI
No se pudo convertir java.text.resources.LocaleElements_fi_FI.getContents
No se pudo convertir java.text.resources.LocaleElements_fi_FI.LocaleElements_fi_FI
No se pudo convertir java.text.resources.LocaleElements_fi_FI_EURO
No se pudo convertir java.text.resources.LocaleElements_fi_FI_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_fi_FI_EURO.LocaleElements_fi_FI_EURO
No se pudo convertir java.text.resources.LocaleElements_fr
No se pudo convertir java.text.resources.LocaleElements_fr.LocaleElements_fr
No se pudo convertir java.text.resources.LocaleElements_fr_BE
No se pudo convertir java.text.resources.LocaleElements_fr_BE.LocaleElements_fr_BE
No se pudo convertir java.text.resources.LocaleElements_fr_BE_EURO
No se pudo convertir java.text.resources.LocaleElements_fr_BE_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_fr_BE_EURO.LocaleElements_fr_BE_EURO
No se pudo convertir java.text.resources.LocaleElements_fr_CA
No se pudo convertir java.text.resources.LocaleElements_fr_CA.LocaleElements_fr_CA
No se pudo convertir java.text.resources.LocaleElements_fr_CH
No se pudo convertir java.text.resources.LocaleElements_fr_CH.LocaleElements_fr_CH
No se pudo convertir java.text.resources.LocaleElements_fr_FR
No se pudo convertir java.text.resources.LocaleElements_fr_FR.getContents
No se pudo convertir java.text.resources.LocaleElements_fr_FR.LocaleElements_fr_FR
No se pudo convertir java.text.resources.LocaleElements_fr_FR_EURO
No se pudo convertir java.text.resources.LocaleElements_fr_FR_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_fr_FR_EURO.LocaleElements_fr_FR_EURO
No se pudo convertir java.text.resources.LocaleElements_fr_LU
No se pudo convertir java.text.resources.LocaleElements_fr_LU.getContents
No se pudo convertir java.text.resources.LocaleElements_fr_LU.LocaleElements_fr_LU
No se pudo convertir java.text.resources.LocaleElements_fr_LU_EURO
No se pudo convertir java.text.resources.LocaleElements_fr_LU_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_fr_LU_EURO.LocaleElements_fr_LU_EURO
No se pudo convertir java.text.resources.LocaleElements_he
No se pudo convertir java.text.resources.LocaleElements_he.LocaleElements_he
No se pudo convertir java.text.resources.LocaleElements_hr
No se pudo convertir java.text.resources.LocaleElements_hr.LocaleElements_hr
No se pudo convertir java.text.resources.LocaleElements_hr_HR
No se pudo convertir java.text.resources.LocaleElements_hr_HR.getContents
No se pudo convertir java.text.resources.LocaleElements_hr_HR.LocaleElements_hr_HR
No se pudo convertir java.text.resources.LocaleElements_hu
No se pudo convertir java.text.resources.LocaleElements_hu.LocaleElements_hu
No se pudo convertir java.text.resources.LocaleElements_hu_HU
No se pudo convertir java.text.resources.LocaleElements_hu_HU.getContents
No se pudo convertir java.text.resources.LocaleElements_hu_HU.LocaleElements_hu_HU
No se pudo convertir java.text.resources.LocaleElements_is
No se pudo convertir java.text.resources.LocaleElements_is.LocaleElements_is
No se pudo convertir java.text.resources.LocaleElements_is_IS
No se pudo convertir java.text.resources.LocaleElements_is_IS.getContents
No se pudo convertir java.text.resources.LocaleElements_is_IS.LocaleElements_is_IS
No se pudo convertir java.text.resources.LocaleElements_it
No se pudo convertir java.text.resources.LocaleElements_it.LocaleElements_it
No se pudo convertir java.text.resources.LocaleElements_it_CH
No se pudo convertir java.text.resources.LocaleElements_it_CH.LocaleElements_it_CH
No se pudo convertir java.text.resources.LocaleElements_it_IT
No se pudo convertir java.text.resources.LocaleElements_it_IT.getContents
No se pudo convertir java.text.resources.LocaleElements_it_IT.LocaleElements_it_IT
No se pudo convertir java.text.resources.LocaleElements_it_IT_EURO
No se pudo convertir java.text.resources.LocaleElements_it_IT_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_it_IT_EURO.LocaleElements_it_IT_EURO
No se pudo convertir java.text.resources.LocaleElements_iw
No se pudo convertir java.text.resources.LocaleElements_iw.LocaleElements_iw
No se pudo convertir java.text.resources.LocaleElements_iw_IL
No se pudo convertir java.text.resources.LocaleElements_iw_IL.getContents
No se pudo convertir java.text.resources.LocaleElements_iw_IL.LocaleElements_iw_IL
No se pudo convertir java.text.resources.LocaleElements_ja
No se pudo convertir java.text.resources.LocaleElements_ja.LocaleElements_ja
No se pudo convertir java.text.resources.LocaleElements_ja_JP
No se pudo convertir java.text.resources.LocaleElements_ja_JP.getContents
No se pudo convertir java.text.resources.LocaleElements_ja_JP.LocaleElements_ja_JP
No se pudo convertir java.text.resources.LocaleElements_ko
No se pudo convertir java.text.resources.LocaleElements_ko.LocaleElements_ko
No se pudo convertir java.text.resources.LocaleElements_ko_KR
No se pudo convertir java.text.resources.LocaleElements_ko_KR.getContents
No se pudo convertir java.text.resources.LocaleElements_ko_KR.LocaleElements_ko_KR
No se pudo convertir java.text.resources.LocaleElements_lt
No se pudo convertir java.text.resources.LocaleElements_lt.LocaleElements_lt
No se pudo convertir java.text.resources.LocaleElements_lt_LT
No se pudo convertir java.text.resources.LocaleElements_lt_LT.getContents
No se pudo convertir java.text.resources.LocaleElements_lt_LT.LocaleElements_lt_LT
No se pudo convertir java.text.resources.LocaleElements_lv
No se pudo convertir java.text.resources.LocaleElements_lv.LocaleElements_lv
No se pudo convertir java.text.resources.LocaleElements_lv_LV
No se pudo convertir java.text.resources.LocaleElements_lv_LV.getContents
No se pudo convertir java.text.resources.LocaleElements_lv_LV.LocaleElements_lv_LV
No se pudo convertir java.text.resources.LocaleElements_mk
No se pudo convertir java.text.resources.LocaleElements_mk.LocaleElements_mk
No se pudo convertir java.text.resources.LocaleElements_mk_MK
No se pudo convertir java.text.resources.LocaleElements_mk_MK.getContents
No se pudo convertir java.text.resources.LocaleElements_mk_MK.LocaleElements_mk_MK
No se pudo convertir java.text.resources.LocaleElements_nl
No se pudo convertir java.text.resources.LocaleElements_nl.LocaleElements_nl
No se pudo convertir java.text.resources.LocaleElements_nl_BE
No se pudo convertir java.text.resources.LocaleElements_nl_BE.LocaleElements_nl_BE
No se pudo convertir java.text.resources.LocaleElements_nl_BE_EURO
No se pudo convertir java.text.resources.LocaleElements_nl_BE_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_nl_BE_EURO.LocaleElements_nl_BE_EURO
No se pudo convertir java.text.resources.LocaleElements_nl_NL
No se pudo convertir java.text.resources.LocaleElements_nl_NL.getContents
No se pudo convertir java.text.resources.LocaleElements_nl_NL.LocaleElements_nl_NL
No se pudo convertir java.text.resources.LocaleElements_nl_NL_EURO
No se pudo convertir java.text.resources.LocaleElements_nl_NL_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_nl_NL_EURO.LocaleElements_nl_NL_EURO
No se pudo convertir java.text.resources.LocaleElements_no
No se pudo convertir java.text.resources.LocaleElements_no.LocaleElements_no
No se pudo convertir java.text.resources.LocaleElements_no_NO
No se pudo convertir java.text.resources.LocaleElements_no_NO.getContents
No se pudo convertir java.text.resources.LocaleElements_no_NO.LocaleElements_no_NO
No se pudo convertir java.text.resources.LocaleElements_no_NO_NY
No se pudo convertir java.text.resources.LocaleElements_no_NO_NY.LocaleElements_no_NO_NY
No se pudo convertir java.text.resources.LocaleElements_pl
No se pudo convertir java.text.resources.LocaleElements_pl.LocaleElements_pl
No se pudo convertir java.text.resources.LocaleElements_pl_PL
No se pudo convertir java.text.resources.LocaleElements_pl_PL.getContents
No se pudo convertir java.text.resources.LocaleElements_pl_PL.LocaleElements_pl_PL
No se pudo convertir java.text.resources.LocaleElements_pt
No se pudo convertir java.text.resources.LocaleElements_pt.LocaleElements_pt
No se pudo convertir java.text.resources.LocaleElements_pt_BR
No se pudo convertir java.text.resources.LocaleElements_pt_BR.getContents
No se pudo convertir java.text.resources.LocaleElements_pt_BR.LocaleElements_pt_BR
No se pudo convertir java.text.resources.LocaleElements_pt_BZ
No se pudo convertir java.text.resources.LocaleElements_pt_BZ.LocaleElements_pt_BZ
No se pudo convertir java.text.resources.LocaleElements_pt_PT
No se pudo convertir java.text.resources.LocaleElements_pt_PT.getContents
No se pudo convertir java.text.resources.LocaleElements_pt_PT.LocaleElements_pt_PT
No se pudo convertir java.text.resources.LocaleElements_pt_PT_EURO
No se pudo convertir java.text.resources.LocaleElements_pt_PT_EURO.getContents
No se pudo convertir java.text.resources.LocaleElements_pt_PT_EURO.LocaleElements_pt_PT_EURO
No se pudo convertir java.text.resources.LocaleElements_ro
No se pudo convertir java.text.resources.LocaleElements_ro.LocaleElements_ro
No se pudo convertir java.text.resources.LocaleElements_ro_RO
No se pudo convertir java.text.resources.LocaleElements_ro_RO.getContents
No se pudo convertir java.text.resources.LocaleElements_ro_RO.LocaleElements_ro_RO
No se pudo convertir java.text.resources.LocaleElements_ru
No se pudo convertir java.text.resources.LocaleElements_ru.LocaleElements_ru
No se pudo convertir java.text.resources.LocaleElements_ru_RU
No se pudo convertir java.text.resources.LocaleElements_ru_RU.getContents
No se pudo convertir java.text.resources.LocaleElements_ru_RU.LocaleElements_ru_RU
No se pudo convertir java.text.resources.LocaleElements_sh
No se pudo convertir java.text.resources.LocaleElements_sh.LocaleElements_sh
No se pudo convertir java.text.resources.LocaleElements_sh_YU
No se pudo convertir java.text.resources.LocaleElements_sh_YU.getContents
No se pudo convertir java.text.resources.LocaleElements_sh_YU.LocaleElements_sh_YU
No se pudo convertir java.text.resources.LocaleElements_sk
No se pudo convertir java.text.resources.LocaleElements_sk.LocaleElements_sk
No se pudo convertir java.text.resources.LocaleElements_sk_SK
No se pudo convertir java.text.resources.LocaleElements_sk_SK.getContents
No se pudo convertir java.text.resources.LocaleElements_sk_SK.LocaleElements_sk_SK
No se pudo convertir java.text.resources.LocaleElements_sl
No se pudo convertir java.text.resources.LocaleElements_sl.LocaleElements_sl
No se pudo convertir java.text.resources.LocaleElements_sl_SI
No se pudo convertir java.text.resources.LocaleElements_sl_SI.getContents
No se pudo convertir java.text.resources.LocaleElements_sl_SI.LocaleElements_sl_SI
No se pudo convertir java.text.resources.LocaleElements_sq
No se pudo convertir java.text.resources.LocaleElements_sq.LocaleElements_sq
No se pudo convertir java.text.resources.LocaleElements_sq_AL
No se pudo convertir java.text.resources.LocaleElements_sq_AL.getContents
No se pudo convertir java.text.resources.LocaleElements_sq_AL.LocaleElements_sq_AL
No se pudo convertir java.text.resources.LocaleElements_sr
No se pudo convertir java.text.resources.LocaleElements_sr.LocaleElements_sr
No se pudo convertir java.text.resources.LocaleElements_sr_YU
No se pudo convertir java.text.resources.LocaleElements_sr_YU.getContents
No se pudo convertir java.text.resources.LocaleElements_sr_YU.LocaleElements_sr_YU
No se pudo convertir java.text.resources.LocaleElements_sv
No se pudo convertir java.text.resources.LocaleElements_sv.LocaleElements_sv
No se pudo convertir java.text.resources.LocaleElements_sv_SE
No se pudo convertir java.text.resources.LocaleElements_sv_SE.getContents
No se pudo convertir java.text.resources.LocaleElements_sv_SE.LocaleElements_sv_SE
No se pudo convertir java.text.resources.LocaleElements_th
No se pudo convertir java.text.resources.LocaleElements_th.getContents
No se pudo convertir java.text.resources.LocaleElements_th.LocaleElements_th
No se pudo convertir java.text.resources.LocaleElements_th_TH
No se pudo convertir java.text.resources.LocaleElements_th_TH.getContents
No se pudo convertir java.text.resources.LocaleElements_th_TH.LocaleElements_th_TH
No se pudo convertir java.text.resources.LocaleElements_tr
No se pudo convertir java.text.resources.LocaleElements_tr.LocaleElements_tr
No se pudo convertir java.text.resources.LocaleElements_tr_TR
No se pudo convertir java.text.resources.LocaleElements_tr_TR.getContents
No se pudo convertir java.text.resources.LocaleElements_tr_TR.LocaleElements_tr_TR
No se pudo convertir java.text.resources.LocaleElements_uk
No se pudo convertir java.text.resources.LocaleElements_uk.LocaleElements_uk
No se pudo convertir java.text.resources.LocaleElements_uk_UA
No se pudo convertir java.text.resources.LocaleElements_uk_UA.getContents
No se pudo convertir java.text.resources.LocaleElements_uk_UA.LocaleElements_uk_UA
No se pudo convertir java.text.resources.LocaleElements_zh
No se pudo convertir java.text.resources.LocaleElements_zh.LocaleElements_zh
No se pudo convertir java.text.resources.LocaleElements_zh_CN
No se pudo convertir java.text.resources.LocaleElements_zh_CN.getContents
No se pudo convertir java.text.resources.LocaleElements_zh_CN.LocaleElements_zh_CN
No se pudo convertir java.text.resources.LocaleElements_zh_HK
No se pudo convertir java.text.resources.LocaleElements_zh_HK.getContents
No se pudo convertir java.text.resources.LocaleElements_zh_HK.LocaleElements_zh_HK
No se pudo convertir java.text.resources.LocaleElements_zh_SG
No se pudo convertir java.text.resources.LocaleElements_zh_SG.LocaleElements_zh_SG
No se pudo convertir java.text.resources.LocaleElements_zh_TW
No se pudo convertir java.text.resources.LocaleElements_zh_TW.LocaleElements_zh_TW
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.util


No se pudo convertir java.util.AbstractCollection.AbstractCollection
No se pudo convertir java.util.AbstractCollection.add
No se pudo convertir java.util.AbstractCollection.addAll
No se pudo convertir java.util.AbstractCollection.contains
No se pudo convertir java.util.AbstractCollection.containsAll
No se pudo convertir java.util.AbstractCollection.iterator
No se pudo convertir java.util.AbstractCollection.remove
No se pudo convertir java.util.AbstractCollection.removeAll
No se pudo convertir java.util.AbstractCollection.retainAll
No se pudo convertir java.util.AbstractCollection.toArray
No se pudo convertir java.util.AbstractCollection.toArray(Object[])
No se pudo convertir java.util.AbstractList.AbstractList
No se pudo convertir java.util.AbstractList.add
No se pudo convertir java.util.AbstractList.addAll
No se pudo convertir java.util.AbstractList.lastIndexOf
No se pudo convertir java.util.AbstractList.listIterator
No se pudo convertir java.util.AbstractList.listIterator(int)
No se pudo convertir java.util.AbstractList.modCount
No se pudo convertir java.util.AbstractList.remove
No se pudo convertir java.util.AbstractList.removeRange
No se pudo convertir java.util.AbstractList.subList
No se pudo convertir java.util.AbstractMap
No se pudo convertir java.util.AbstractMap.AbstractMap
No se pudo convertir java.util.AbstractMap.clear
No se pudo convertir java.util.AbstractMap.containsKey
No se pudo convertir java.util.AbstractMap.containsValue
No se pudo convertir java.util.AbstractMap.entrySet
No se pudo convertir java.util.AbstractMap.equals
No se pudo convertir java.util.AbstractMap.get
No se pudo convertir java.util.AbstractMap.hashCode
No se pudo convertir java.util.AbstractMap.keySet
No se pudo convertir java.util.AbstractMap.put
No se pudo convertir java.util.AbstractMap.putAll
No se pudo convertir java.util.AbstractMap.remove
No se pudo convertir java.util.AbstractMap.size
No se pudo convertir java.util.AbstractMap.values
No se pudo convertir java.util.AbstractSequentialList.AbstractSequentialList
No se pudo convertir java.util.AbstractSequentialList.addAll
No se pudo convertir java.util.AbstractSequentialList.listIterator
No se pudo convertir java.util.AbstractSequentialList.remove
No se pudo convertir java.util.AbstractSequentialList.set
No se pudo convertir java.util.AbstractSet.AbstractSet
No se pudo convertir java.util.AbstractSet.removeAll
No se pudo convertir java.util.ArrayList.add
No se pudo convertir java.util.ArrayList.toArray
No se pudo convertir java.util.Arrays.asList
No se pudo convertir java.util.Arrays.sort
No se pudo convertir java.util.BitSet.andNot
No se pudo convertir java.util.BitSet.equals
No se pudo convertir java.util.BitSet.length
No se pudo convertir java.util.Calendar.add
No se pudo convertir java.util.Calendar.after
No se pudo convertir java.util.Calendar.AM
No se pudo convertir java.util.Calendar.AM_PM
No se pudo convertir java.util.Calendar.APRIL
No se pudo convertir java.util.Calendar.areFieldsSet
No se pudo convertir java.util.Calendar.AUGUST
No se pudo convertir java.util.Calendar.before
No se pudo convertir java.util.Calendar.Calendar
No se pudo convertir java.util.Calendar.clear
No se pudo convertir java.util.Calendar.clone
No se pudo convertir java.util.Calendar.complete
No se pudo convertir java.util.Calendar.computeFields
No se pudo convertir java.util.Calendar.computeTime
No se pudo convertir java.util.Calendar.DAY_OF_MONTH
No se pudo convertir java.util.Calendar.DAY_OF_WEEK
No se pudo convertir java.util.Calendar.DAY_OF_WEEK_IN_MONTH
No se pudo convertir java.util.Calendar.DAY_OF_YEAR
No se pudo convertir java.util.Calendar.DECEMBER
No se pudo convertir java.util.Calendar.DST_OFFSET
No se pudo convertir java.util.Calendar.ERA
No se pudo convertir java.util.Calendar.FEBRUARY
No se pudo convertir java.util.Calendar.FIELD_COUNT
No se pudo convertir java.util.Calendar.fields
No se pudo convertir java.util.Calendar.get
No se pudo convertir java.util.Calendar.getActualMaximum
No se pudo convertir java.util.Calendar.getActualMinimum
No se pudo convertir java.util.Calendar.getAvailableLocales
No se pudo convertir java.util.Calendar.getGreatestMinimum
No se pudo convertir java.util.Calendar.getInstance
No se pudo convertir java.util.Calendar.getLeastMaximum
No se pudo convertir java.util.Calendar.getMaximum
No se pudo convertir java.util.Calendar.getMinimalDaysInFirstWeek
No se pudo convertir java.util.Calendar.getMinimum
No se pudo convertir java.util.Calendar.getTimeInMillis
No se pudo convertir java.util.Calendar.getTimeZone
No se pudo convertir java.util.Calendar.HOUR
No se pudo convertir java.util.Calendar.HOUR_OF_DAY
No se pudo convertir java.util.Calendar.internalGet
No se pudo convertir java.util.Calendar.isLenient
No se pudo convertir java.util.Calendar.isSet
No se pudo convertir java.util.Calendar.isSet~
No se pudo convertir java.util.Calendar.isTimeSet
No se pudo convertir java.util.Calendar.JANUARY
No se pudo convertir java.util.Calendar.JULY
No se pudo convertir java.util.Calendar.JUNE
No se pudo convertir java.util.Calendar.MARCH
No se pudo convertir java.util.Calendar.MAY
No se pudo convertir java.util.Calendar.NOVEMBER
No se pudo convertir java.util.Calendar.OCTOBER
No se pudo convertir java.util.Calendar.PM
No se pudo convertir java.util.Calendar.roll
No se pudo convertir java.util.Calendar.roll(int, boolean)
No se pudo convertir java.util.Calendar.roll(int, int)
No se pudo convertir java.util.Calendar.SEPTEMBER
No se pudo convertir java.util.Calendar.setLenient
No se pudo convertir java.util.Calendar.setMinimalDaysInFirstWeek
No se pudo convertir java.util.Calendar.setTimeInMillis
No se pudo convertir java.util.Calendar.setTimeZone
No se pudo convertir java.util.Calendar.time
No se pudo convertir java.util.Calendar.UNDECIMBER
No se pudo convertir java.util.Calendar.WEEK_OF_MONTH
No se pudo convertir java.util.Calendar.WEEK_OF_YEAR
No se pudo convertir java.util.Calendar.ZONE_OFFSET
No se pudo convertir java.util.Collection.add
No se pudo convertir java.util.Collection.addAll
No se pudo convertir java.util.Collection.clear
No se pudo convertir java.util.Collection.contains
No se pudo convertir java.util.Collection.containsAll
No se pudo convertir java.util.Collection.remove
No se pudo convertir java.util.Collection.removeAll
No se pudo convertir java.util.Collection.retainAll
No se pudo convertir java.util.Collection.toArray
No se pudo convertir java.util.Collections
No se pudo convertir java.util.Collections.EMPTY_MAP
No se pudo convertir java.util.Collections.EMPTY_SET
No se pudo convertir java.util.Collections.max(Collection)
No se pudo convertir java.util.Collections.max(Collection, Comparator)
No se pudo convertir java.util.Collections.min(Collection)
No se pudo convertir java.util.Collections.min(Collection, Comparator)
No se pudo convertir java.util.Collections.reverseOrder
No se pudo convertir java.util.Collections.sort(Comparator)
No se pudo convertir java.util.Collections.sort(List)
No se pudo convertir java.util.Collections.synchronizedMap
No se pudo convertir java.util.Collections.synchronizedSortedSet
No se pudo convertir java.util.Collections.unmodifiableMap
No se pudo convertir java.util.Collections.unmodifiableSortedMap
No se pudo convertir java.util.Collections.unmodifiableSortedSet
No se pudo convertir java.util.Date.clone
No se pudo convertir java.util.Date.Date(int, int, int)
No se pudo convertir java.util.Date.Date(int, int, int, int, int)
No se pudo convertir java.util.Date.Date(int, int, int, int, int, int)
No se pudo convertir java.util.Date.Date(long)
No se pudo convertir java.util.Date.Date(String)
No se pudo convertir java.util.Date.getMonth
No se pudo convertir java.util.Date.getTime
No se pudo convertir java.util.Date.getTimezoneOffset
No se pudo convertir java.util.Date.getYear
No se pudo convertir java.util.Date.hashCode
No se pudo convertir java.util.Date.parse
No se pudo convertir java.util.Date.setTime
No se pudo convertir java.util.Date.toGMTString
No se pudo convertir java.util.Date.toLocaleString
No se pudo convertir java.util.Date.toString
No se pudo convertir java.util.Date.UTC
No se pudo convertir java.util.Dictionary.Dictionary
No se pudo convertir java.util.Dictionary.get
No se pudo convertir java.util.Dictionary.isEmpty
No se pudo convertir java.util.Dictionary.keys
No se pudo convertir java.util.Dictionary.put
No se pudo convertir java.util.Dictionary.remove
No se pudo convertir java.util.Enumeration.hasMoreElements
No se pudo convertir java.util.Enumeration.nextElement
No se pudo convertir java.util.Entry.setValue
No se pudo convertir java.util.EventListener
No se pudo convertir java.util.EventObject
No se pudo convertir java.util.EventObject.source
No se pudo convertir java.util.GregorianCalendar.add
No se pudo convertir java.util.GregorianCalendar.after
No se pudo convertir java.util.GregorianCalendar.before
No se pudo convertir java.util.GregorianCalendar.computeFields
No se pudo convertir java.util.GregorianCalendar.computeTime
No se pudo convertir java.util.GregorianCalendar.getActualMaximum
No se pudo convertir java.util.GregorianCalendar.getActualMinimum
No se pudo convertir java.util.GregorianCalendar.getGreatestMinimum
No se pudo convertir java.util.GregorianCalendar.getGregorianChange
No se pudo convertir java.util.GregorianCalendar.getLeastMaximum
No se pudo convertir java.util.GregorianCalendar.getMaximum
No se pudo convertir java.util.GregorianCalendar.getMinimum
No se pudo convertir java.util.GregorianCalendar.GregorianCalendar
No se pudo convertir java.util.GregorianCalendar.roll
No se pudo convertir java.util.GregorianCalendar.roll(int, boolean)
No se pudo convertir java.util.GregorianCalendar.setGregorianChange
No se pudo convertir java.util.HashMap
No se pudo convertir java.util.HashMap.entrySet
No se pudo convertir java.util.HashMap.get
No se pudo convertir java.util.HashMap.keySet
No se pudo convertir java.util.HashMap.putAll
No se pudo convertir java.util.HashSet
No se pudo convertir java.util.HashSet.add
No se pudo convertir java.util.HashSet.clear
No se pudo convertir java.util.HashSet.clone
No se pudo convertir java.util.HashSet.contains
No se pudo convertir java.util.HashSet.HashSet
No se pudo convertir java.util.HashSet.HashSet(Collection)
No se pudo convertir java.util.HashSet.HashSet(int)
No se pudo convertir java.util.HashSet.HashSet(int, float)
No se pudo convertir java.util.HashSet.remove
No se pudo convertir java.util.Hashtable.entrySet
No se pudo convertir java.util.Hashtable.putAll
No se pudo convertir java.util.Hashtable.rehash
No se pudo convertir java.util.HashtableEntry
No se pudo convertir java.util.HashtableEnumerator
No se pudo convertir java.util.Iterator.hasNext
No se pudo convertir java.util.Iterator.next
No se pudo convertir java.util.Iterator.remove
No se pudo convertir java.util.LinkedList
No se pudo convertir java.util.LinkedList.add
No se pudo convertir java.util.LinkedList.listIterator
No se pudo convertir java.util.List.add
No se pudo convertir java.util.List.addAll
No se pudo convertir java.util.List.containsAll
No se pudo convertir java.util.List.lastIndexOf
No se pudo convertir java.util.List.listIterator
No se pudo convertir java.util.List.remove
No se pudo convertir java.util.List.removeAll
No se pudo convertir java.util.List.retainAll
No se pudo convertir java.util.List.subList
No se pudo convertir java.util.List.toArray
No se pudo convertir java.util.ListIterator.add
No se pudo convertir java.util.ListIterator.hasNext
No se pudo convertir java.util.ListIterator.hasPrevious
No se pudo convertir java.util.ListIterator.next
No se pudo convertir java.util.ListIterator.nextIndex
No se pudo convertir java.util.ListIterator.previous
No se pudo convertir java.util.ListIterator.previousIndex
No se pudo convertir java.util.ListIterator.remove
No se pudo convertir java.util.ListIterator.set
No se pudo convertir java.util.ListResourceBundle.getContents
No se pudo convertir java.util.ListResourceBundle.getKeys
No se pudo convertir java.util.ListResourceBundle.handleGetObject
No se pudo convertir java.util.ListResourceBundle.ListResourceBundle
No se pudo convertir java.util.Locale.CHINESE
No se pudo convertir java.util.Locale.getDefault
No se pudo convertir java.util.Locale.getDisplayName
No se pudo convertir java.util.Locale.getDisplayVariant
No se pudo convertir java.util.Locale.getISOCountries
No se pudo convertir java.util.Locale.getLanguage
No se pudo convertir java.util.Locale.getVariant
No se pudo convertir java.util.Locale.hashCode
No se pudo convertir java.util.Locale.setDefault
No se pudo convertir java.util.Map.containsValue
No se pudo convertir java.util.Map.entrySet
No se pudo convertir java.util.Map.get
No se pudo convertir java.util.Map.isEmpty
No se pudo convertir java.util.Map.keySet
No se pudo convertir java.util.Map.putAll
No se pudo convertir java.util.MissingResourceException.getClassName
No se pudo convertir java.util.MissingResourceException.getKey
No se pudo convertir java.util.MissingResourceException.MissingResourceException
No se pudo convertir java.util.Properties.defaults
No se pudo convertir java.util.Properties.list
No se pudo convertir java.util.Properties.load
No se pudo convertir java.util.Properties.save
No se pudo convertir java.util.Properties.setProperty
No se pudo convertir java.util.Properties.store
No se pudo convertir java.util.PropertyPermission
No se pudo convertir java.util.PropertyResourceBundle.getKeys
No se pudo convertir java.util.PropertyResourceBundle.PropertyResourceBundle
No se pudo convertir java.util.Random.nextLong
No se pudo convertir java.util.Random.nextBoolean
No se pudo convertir java.util.Random.nextGaussian
No se pudo convertir java.util.ResourceBundle.getKeys
No se pudo convertir java.util.ResourceBundle.getObject
No se pudo convertir java.util.ResourceBundle.getString
No se pudo convertir java.util.ResourceBundle.getStringArray
No se pudo convertir java.util.ResourceBundle.handleGetObject
No se pudo convertir java.util.ResourceBundle.parent
No se pudo convertir java.util.ResourceBundle.ResourceBundle
No se pudo convertir java.util.ResourceBundle.setParent
No se pudo convertir java.util.Set.add
No se pudo convertir java.util.Set.addAll
No se pudo convertir java.util.Set.clear
No se pudo convertir java.util.Set.contains
No se pudo convertir java.util.Set.containsAll
No se pudo convertir java.util.Set.remove
No se pudo convertir java.util.Set.removeAll
No se pudo convertir java.util.Set.retainAll
No se pudo convertir java.util.Set.toArray
No se pudo convertir java.util.Set.toArray(Object[])
No se pudo convertir java.util.SimpleTimeZone
No se pudo convertir java.util.SimpleTimeZone.clone
No se pudo convertir java.util.SimpleTimeZone.getRawOffset
No se pudo convertir java.util.SimpleTimeZone.setEndRule
No se pudo convertir java.util.SimpleTimeZone.setRawOffset
No se pudo convertir java.util.SimpleTimeZone.setStartRule
No se pudo convertir java.util.SimpleTimeZone.setStartYear
No se pudo convertir java.util.SimpleTimeZone.SimpleTimeZone
No se pudo convertir java.util.SortedMap
No se pudo convertir java.util.SortedMap.comparator
No se pudo convertir java.util.SortedMap.headMap
No se pudo convertir java.util.SortedMap.subMap
No se pudo convertir java.util.SortedMap.tailMap
No se pudo convertir java.util.SortedSet.comparator
No se pudo convertir java.util.Stack.addElement
No se pudo convertir java.util.Stack.elements
No se pudo convertir java.util.StringTokenizer.StringTokenizer
No se pudo convertir java.util.SystemClassLoader
No se pudo convertir java.util.Timer.cancel
No se pudo convertir java.util.Timer.schedule(TimerTask, Date)
No se pudo convertir java.util.Timer.schedule(TimerTask, Date, long)
No se pudo convertir java.util.Timer.schedule(TimerTask, long)
No se pudo convertir java.util.Timer.schedule(TimerTask, long, long)
No se pudo convertir java.util.Timer.scheduleAtFixedRate(TimerTask, Date, long)
No se pudo convertir java.util.Timer.scheduleAtFixedRate(TimerTask, long, long)
No se pudo convertir java.util.Timer.Timer
No se pudo convertir java.util.TimerTask
No se pudo convertir java.util.TimeZone.clone
No se pudo convertir java.util.TimeZone.getAvailableIDs
No se pudo convertir java.util.TimeZone.getDisplayName(boolean, int)
No se pudo convertir java.util.TimeZone.getDisplayName(boolean, int, Locale)
No se pudo convertir java.util.TimeZone.getDisplayName(Locale)
No se pudo convertir java.util.TimeZone.getRawOffset
No se pudo convertir java.util.TimeZone.getTimeZone
No se pudo convertir java.util.TimeZone.hasSameRules
No se pudo convertir java.util.TimeZone.setDefault
No se pudo convertir java.util.TimeZone.setID
No se pudo convertir java.util.TimeZone.setRawOffset
No se pudo convertir java.util.TimeZone.TimeZone
No se pudo convertir java.util.TreeMap.comparator
No se pudo convertir java.util.TreeMap.entrySet
No se pudo convertir java.util.TreeMap.headMap
No se pudo convertir java.util.TreeMap.keySet
No se pudo convertir java.util.TreeMap.putAll
No se pudo convertir java.util.TreeMap.subMap
No se pudo convertir java.util.TreeMap.tailMap
No se pudo convertir java.util.TreeMap.TreeMap
No se pudo convertir java.util.TreeMap.TreeMap(Map)
No se pudo convertir java.util.TreeMap.TreeMap(SortedMap)
No se pudo convertir java.util.TreeMap.values
No se pudo convertir java.util.TreeSet
No se pudo convertir java.util.TreeSet.comparator
No se pudo convertir java.util.TreeSet.TreeSet(Comparator)
No se pudo convertir java.util.TreeSet.TreeSet(SortedMap)
No se pudo convertir java.util.TreeSet.TreeSet(SortedSet)
No se pudo convertir java.util.Vector.add
No se pudo convertir java.util.Vector.capacityIncrement
No se pudo convertir java.util.Vector.containsAll
No se pudo convertir java.util.Vector.elementData
No se pudo convertir java.util.Vector.removeAll
No se pudo convertir java.util.Vector.retainAll
No se pudo convertir java.util.Vector.toArray
No se pudo convertir java.util.Vector.Vector
No se pudo convertir java.util.VectorEnumerator
No se pudo convertir java.util.WeakHashMap
No se pudo convertir java.util.WeakHashMap.entrySet
No se pudo convertir java.util.WeakHashMap.WeakHashMap
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.util.cab


No se pudo convertir com.ms.util.cab.CabConstants
No se pudo convertir com.ms.util.cab.CabCorruptException
No se pudo convertir com.ms.util.cab.CabCreator
No se pudo convertir com.ms.util.cab.CabDecoder
No se pudo convertir com.ms.util.cab.CabDecoderInterface
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.util.jar


No se pudo convertir java.util.jar.Attributes
No se pudo convertir java.util.jar.Attributes.Name
No se pudo convertir java.util.jar.JarEntry
No se pudo convertir java.util.jar.JarException
No se pudo convertir java.util.jar.JarFile
No se pudo convertir java.util.jar.JarInputStream
No se pudo convertir java.util.jar.JarOutputStream
No se pudo convertir java.util.jar.Manifest
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de java.util.zip


No se pudo convertir java.util.zip.Adler32
No se pudo convertir java.util.zip.CheckedInputStream
No se pudo convertir java.util.zip.CheckedInputStream.CheckedInputStream
No se pudo convertir java.util.zip.CheckedInputStream.getChecksum
No se pudo convertir java.util.zip.CheckedOutputStream
No se pudo convertir java.util.zip.CheckedOutputStream.CheckedOutputStream
No se pudo convertir java.util.zip.CheckedOutputStream.getChecksum
No se pudo convertir java.util.zip.Checksum
No se pudo convertir java.util.zip.CRC32
No se pudo convertir java.util.zip.DataFormatException
No se pudo convertir java.util.zip.Deflater
No se pudo convertir java.util.zip.DeflaterOutputStream
No se pudo convertir java.util.zip.GZIPInputStream
No se pudo convertir java.util.zip.GZIPOutputStream
No se pudo convertir java.util.zip.Inflater
No se pudo convertir java.util.zip.InflaterInputStream
No se pudo convertir java.util.zip.ZipEntry
No se pudo convertir java.util.zip.ZipFile
No se pudo convertir java.util.zip.ZipInputStream
No se pudo convertir java.util.zip.ZipOutputStream
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.accessibility


No se pudo convertir javax.accessibility.AccessibleAction
No se pudo convertir javax.accessibility.AccessibleAction.doAccessibleAction
No se pudo convertir javax.accessibility.AccessibleAction.getAccessibleActionCount
No se pudo convertir javax.accessibility.AccessibleAction.getAccessibleActionDescription
No se pudo convertir javax.accessibility.AccessibleBundle
No se pudo convertir javax.accessibility.AccessibleComponent
No se pudo convertir javax.accessibility.AccessibleComponent.addFocusListener
No se pudo convertir javax.accessibility.AccessibleComponent.isVisible
No se pudo convertir javax.accessibility.AccessibleComponent.removeFocusListener
No se pudo convertir javax.accessibility.AccessibleComponent.setBounds
No se pudo convertir javax.accessibility.AccessibleContext.<EventoCambioPropiedad>
No se pudo convertir javax.accessibility.AccessibleContext.accessibleDescription
No se pudo convertir javax.accessibility.AccessibleContext.accessibleName
No se pudo convertir javax.accessibility.AccessibleContext.accessibleParent
No se pudo convertir javax.accessibility.AccessibleContext.addPropertyChangeListener
No se pudo convertir javax.accessibility.AccessibleContext.firePropertyChange
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleIcon
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleIndexInParent
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleParent
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleRelationSet
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleTable
No se pudo convertir javax.accessibility.AccessibleContext.getAccessibleText
No se pudo convertir javax.accessibility.AccessibleContext.removePropertyChangeListener
No se pudo convertir javax.accessibility.AccessibleContext.setAccessibleParent
No se pudo convertir javax.accessibility.AccessibleHyperlink
No se pudo convertir javax.accessibility.AccessibleHypertext
No se pudo convertir javax.accessibility.AccessibleIcon
No se pudo convertir javax.accessibility.AccessibleRelation
No se pudo convertir javax.accessibility.AccessibleRelationSet
No se pudo convertir javax.accessibility.AccessibleResourceBundle
No se pudo convertir javax.accessibility.AccessibleRole.AccessibleRole
No se pudo convertir javax.accessibility.AccessibleSelection
No se pudo convertir javax.accessibility.AccessibleSelection.addAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleSelection.clearAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleSelection.getAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleSelection.getAccessibleSelectionCount
No se pudo convertir javax.accessibility.AccessibleSelection.isAccessibleChildSelected
No se pudo convertir javax.accessibility.AccessibleSelection.removeAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleSelection.selectAllAccessibleSelection
No se pudo convertir javax.accessibility.AccessibleState.<NombreEstado>
No se pudo convertir javax.accessibility.AccessibleState.AccessibleState
No se pudo convertir javax.accessibility.AccessibleStateSet.states
No se pudo convertir javax.accessibility.AccessibleStateSet.toArray
No se pudo convertir javax.accessibility.AccessibleTable
No se pudo convertir javax.accessibility.AccessibleTableModelChange
No se pudo convertir javax.accessibility.AccessibleText
No se pudo convertir javax.accessibility.AccessibleText.<TipoTexto>
No se pudo convertir javax.accessibility.AccessibleText.getAfterIndex
No se pudo convertir javax.accessibility.AccessibleText.getAtIndex
No se pudo convertir javax.accessibility.AccessibleText.getBeforeIndex
No se pudo convertir javax.accessibility.AccessibleText.getCaretPosition
No se pudo convertir javax.accessibility.AccessibleText.getCharacterAttribute
No se pudo convertir javax.accessibility.AccessibleText.getCharacterBounds
No se pudo convertir javax.accessibility.AccessibleText.getCharCount
No se pudo convertir javax.accessibility.AccessibleText.getIndexAtPoint
No se pudo convertir javax.accessibility.AccessibleText.getSelectedText
No se pudo convertir javax.accessibility.AccessibleText.getSelectionEnd
No se pudo convertir javax.accessibility.AccessibleText.getSelectionStart
No se pudo convertir javax.accessibility.AccessibleValue
No se pudo convertir javax.accessibility.AccessibleValue.getCurrentAccessibleValue
No se pudo convertir javax.accessibility.AccessibleValue.getMaximumAccessibleValue
No se pudo convertir javax.accessibility.AccessibleValue.getMinimumAccessibleValue
No se pudo convertir javax.accessibility.AccessibleValue.setCurrentAccessibleValue
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Javax.crypto


No se pudo convertir javax.crypto.Cipher.<TipoClave>
No se pudo convertir javax.crypto.Cipher.Cipher
No se pudo convertir javax.crypto.Cipher.doFinal
No se pudo convertir javax.crypto.Cipher.getExemptionMechanism
No se pudo convertir javax.crypto.Cipher.getInstance
No se pudo convertir javax.crypto.Cipher.getParameters
No se pudo convertir javax.crypto.Cipher.getProvider
No se pudo convertir javax.crypto.Cipher.init
No se pudo convertir javax.crypto.Cipher.t
No se pudo convertir javax.crypto.Cipher.unwrap
No se pudo convertir javax.crypto.Cipher.UNWRAP_MODE
No se pudo convertir javax.crypto.Cipher.wrap
No se pudo convertir javax.crypto.Cipher.WRAP_MODE
No se pudo convertir javax.crypto.CipherInputStream.available
No se pudo convertir javax.crypto.CipherInputStream.CipherInputStream(Stream)
No se pudo convertir javax.crypto.CipherInputStream.CipherInputStream(Stream, Cipher)
No se pudo convertir javax.crypto.CipherInputStream.skip
No se pudo convertir javax.crypto.CipherOutputStream.CipherOutputStream(OutputStream)
No se pudo convertir javax.crypto.CipherOutputStream.CipherOutputStream(OutputStream, Cipher)
No se pudo convertir javax.crypto.CipherSpi
No se pudo convertir javax.crypto.ExemptionMechanism
No se pudo convertir javax.crypto.ExemptionMechanismSpi
No se pudo convertir javax.crypto.interfaces.DHKey
No se pudo convertir javax.crypto.interfaces.DHPrivateKey
No se pudo convertir javax.crypto.interfaces.DHPublicKey
No se pudo convertir javax.crypto.KeyAgreement
No se pudo convertir javax.crypto.KeyAgreementSpi
No se pudo convertir javax.crypto.KeyGenerator.generateKey
No se pudo convertir javax.crypto.KeyGenerator.getAlgorithm
No se pudo convertir javax.crypto.KeyGenerator.getProvider
No se pudo convertir javax.crypto.KeyGenerator.init
No se pudo convertir javax.crypto.KeyGeneratorSpi.engineGenerateKey
No se pudo convertir javax.crypto.KeyGeneratorSpi.engineInit
No se pudo convertir javax.crypto.Mac.clone
No se pudo convertir javax.crypto.Mac.doFinal
No se pudo convertir javax.crypto.Mac.getInstance
No se pudo convertir javax.crypto.Mac.getProvider
No se pudo convertir javax.crypto.Mac.Mac
No se pudo convertir javax.crypto.MacSpi.clone
No se pudo convertir javax.crypto.MacSpi.engineDoFinal
No se pudo convertir javax.crypto.MacSpi.MacSpi
No se pudo convertir javax.crypto.NullCipher.NullCipher
No se pudo convertir javax.crypto.SealedObject
No se pudo convertir javax.crypto.SealedObject.encodedParams
No se pudo convertir javax.crypto.SealedObject.getAlgorithm
No se pudo convertir javax.crypto.SealedObject.getObject
No se pudo convertir javax.crypto.SealedObject.SealedObject
No se pudo convertir javax.crypto.SecretKey
No se pudo convertir javax.crypto.SecretKeyFactory.generateSecret
No se pudo convertir javax.crypto.SecretKeyFactory.getAlgorithm
No se pudo convertir javax.crypto.SecretKeyFactory.getKeySpec
No se pudo convertir javax.crypto.SecretKeyFactory.getProvider
No se pudo convertir javax.crypto.SecretKeyFactory.translateKey
No se pudo convertir javax.crypto.SecretKeyFactorySpi.engineGenerateSecret
No se pudo convertir javax.crypto.SecretKeyFactorySpi.engineGetKeySpec
No se pudo convertir javax.crypto.SecretKeyFactorySpi.engineTranslateKey
No se pudo convertir javax.crypto.ShortBufferException.a
No se pudo convertir javax.crypto.spec.DESedeKeySpec.isParityAdjusted
No se pudo convertir javax.crypto.spec.DESKeySpec.isParityAdjusted
No se pudo convertir javax.crypto.spec.DESKeySpec.isWeak
No se pudo convertir javax.crypto.spec.DHGenParameterSpec
No se pudo convertir javax.crypto.spec.DHParameterSpec
No se pudo convertir javax.crypto.spec.DHPrivateKeySpec
No se pudo convertir javax.crypto.spec.DHPublicKeySpec
No se pudo convertir javax.crypto.spec.IvParameterSpec.IvParameterSpec
No se pudo convertir javax.crypto.spec.PBEKeySpec.getPassword
No se pudo convertir javax.crypto.spec.PBEParameterSpec
No se pudo convertir javax.crypto.spec.RC5ParameterSpec
No se pudo convertir javax.crypto.spec.SecretKeySpec.getAlgorithm
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.ejb


No se pudo convertir javax.ejb.deployment.AccessControlEntry
No se pudo convertir javax.ejb.deployment.ControlDescriptor
No se pudo convertir javax.ejb.deployment.DeploymentDescriptor
No se pudo convertir javax.ejb.deployment.EntityDescriptor
No se pudo convertir javax.ejb.deployment.SessionDescriptor
No se pudo convertir javax.ejb.EJBContext
No se pudo convertir javax.ejb.EJBContext.getCallerIdentity
No se pudo convertir javax.ejb.EJBContext.getCallerPrincipal
No se pudo convertir javax.ejb.EJBContext.getEJBHome
No se pudo convertir javax.ejb.EJBContext.getEJBLocalHome
No se pudo convertir javax.ejb.EJBContext.getEnvironment
No se pudo convertir javax.ejb.EJBContext.getRollbackOnly
No se pudo convertir javax.ejb.EJBContext.getUserTransaction
No se pudo convertir javax.ejb.EJBContext.isCallerInRole
No se pudo convertir javax.ejb.EJBContext.setRollbackOnly
No se pudo convertir javax.ejb.EJBHome
No se pudo convertir javax.ejb.EJBHome.getEJBMetaData
No se pudo convertir javax.ejb.EJBHome.getHomeHandle
No se pudo convertir javax.ejb.EJBLocalHome
No se pudo convertir javax.ejb.EJBLocalObject
No se pudo convertir javax.ejb.EJBLocalObject.getEJBLocalHome
No se pudo convertir javax.ejb.EJBMetaData
No se pudo convertir javax.ejb.EJBObject
No se pudo convertir javax.ejb.EJBObject.getEJBHome
No se pudo convertir javax.ejb.EJBObject.getHandle
No se pudo convertir javax.ejb.EntityBean.setEntityContext
No se pudo convertir javax.ejb.EntityBean.unsetEntityContext
No se pudo convertir javax.ejb.EntityContext
No se pudo convertir javax.ejb.EntityContext.getEJBLocalObject
No se pudo convertir javax.ejb.EntityContext.getEJBObject
No se pudo convertir javax.ejb.Handle
No se pudo convertir javax.ejb.HomeHandle
No se pudo convertir javax.ejb.MessageDrivenBean.setMessageDrivenContext
No se pudo convertir javax.ejb.MessageDrivenContext
No se pudo convertir javax.ejb.SessionBean.setSessionContext
No se pudo convertir javax.ejb.SessionContext
No se pudo convertir javax.ejb.SessionContext.getEJBLocalObject
No se pudo convertir javax.ejb.SessionContext.getEJBObject
No se pudo convertir javax.ejb.SessionSynchronization
No se pudo convertir javax.ejb.spi.HandleDelegate
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Javax.jms


No se pudo convertir javax.jms.BytesMessage.readBytes
No se pudo convertir javax.jms.BytesMessage.readUTF
No se pudo convertir javax.jms.BytesMessage.reset
No se pudo convertir javax.jms.BytesMessage.writeBytes
No se pudo convertir javax.jms.BytesMessage.writeObject
No se pudo convertir javax.jms.BytesMessage.writeUTF
No se pudo convertir javax.jms.Connection
No se pudo convertir javax.jms.Connection.close
No se pudo convertir javax.jms.Connection.getClientID
No se pudo convertir javax.jms.Connection.getExceptionListener
No se pudo convertir javax.jms.Connection.getMetaData
No se pudo convertir javax.jms.Connection.setClientID
No se pudo convertir javax.jms.Connection.setExceptionListener
No se pudo convertir javax.jms.Connection.start
No se pudo convertir javax.jms.Connection.stop
No se pudo convertir javax.jms.ConnectionConsumer
No se pudo convertir javax.jms.ConnectionFactory
No se pudo convertir javax.jms.ConnectionMetaData
No se pudo convertir javax.jms.DeliveryMode
No se pudo convertir javax.jms.ExceptionListener
No se pudo convertir javax.jms.IllegalStateException.IllegalStateException
No se pudo convertir javax.jms.InvalidClientIDException
No se pudo convertir javax.jms.InvalidDestinationException.InvalidDestinationException(String)
No se pudo convertir javax.jms.InvalidDestinationException.InvalidDestinationException(String, String)
No se pudo convertir javax.jms.InvalidSelectorException
No se pudo convertir javax.jms.JMSException.getLinkedException
No se pudo convertir javax.jms.JMSException.JMSException(String)
No se pudo convertir javax.jms.JMSException.JMSException(String, String)
No se pudo convertir javax.jms.JMSException.setLinkedException
No se pudo convertir javax.jms.JMSSecurityException.JMSSecurityException(String)
No se pudo convertir javax.jms.JMSSecurityException.JMSSecurityException(String, String)
No se pudo convertir javax.jms.MapMessage.getFloat
No se pudo convertir javax.jms.MapMessage.setBytes
No se pudo convertir javax.jms.Message.acknowledge
No se pudo convertir javax.jms.Message.clearProperties
No se pudo convertir javax.jms.Message.getBooleanProperty
No se pudo convertir javax.jms.Message.getByteProperty
No se pudo convertir javax.jms.Message.getDoubleProperty
No se pudo convertir javax.jms.Message.getFloatProperty
No se pudo convertir javax.jms.Message.getIntProperty
No se pudo convertir javax.jms.Message.getJMSCorrelationIDAsBytes
No se pudo convertir javax.jms.Message.getJMSDestination
No se pudo convertir javax.jms.Message.getJMSPriority
No se pudo convertir javax.jms.Message.getJMSRedelivered
No se pudo convertir javax.jms.Message.getJMSReplyTo
No se pudo convertir javax.jms.Message.getJMSTimestamp
No se pudo convertir javax.jms.Message.getJMSType
No se pudo convertir javax.jms.Message.getLongProperty
No se pudo convertir javax.jms.Message.getObjectProperty
No se pudo convertir javax.jms.Message.getPropertyNames
No se pudo convertir javax.jms.Message.getShortProperty
No se pudo convertir javax.jms.Message.getStringProperty
No se pudo convertir javax.jms.Message.propertyExists
No se pudo convertir javax.jms.Message.setBooleanProperty
No se pudo convertir javax.jms.Message.setByteProperty
No se pudo convertir javax.jms.Message.setDoubleProperty
No se pudo convertir javax.jms.Message.setFloatProperty
No se pudo convertir javax.jms.Message.setIntProperty
No se pudo convertir javax.jms.Message.setJMSCorrelationID
No se pudo convertir javax.jms.Message.setJMSCorrelationIDAsBytes
No se pudo convertir javax.jms.Message.setJMSDestination
No se pudo convertir javax.jms.Message.setJMSMessageID
No se pudo convertir javax.jms.Message.setJMSPriority
No se pudo convertir javax.jms.Message.setJMSRedelivered
No se pudo convertir javax.jms.Message.setJMSTimestamp
No se pudo convertir javax.jms.Message.setJMSType
No se pudo convertir javax.jms.Message.setLongProperty
No se pudo convertir javax.jms.Message.setObjectProperty
No se pudo convertir javax.jms.Message.setShortProperty
No se pudo convertir javax.jms.Message.setStringProperty
No se pudo convertir javax.jms.MessageConsumer.setMessageListener
No se pudo convertir javax.jms.MessageConsumer.getMessageSelector
No se pudo convertir javax.jms.MessageEOFException.MessageEOFException
No se pudo convertir javax.jms.MessageFormatException
No se pudo convertir javax.jms.MessageListener
No se pudo convertir javax.jms.MessageNotReadableException
No se pudo convertir javax.jms.MessageNotWriteableException
No se pudo convertir javax.jms.MessageProducer.getDisableMessageID
No se pudo convertir javax.jms.MessageProducer.getDisableMessageTimestamp
No se pudo convertir javax.jms.MessageProducer.setDeliveryMode
No se pudo convertir javax.jms.MessageProducer.setDisableMessageID
No se pudo convertir javax.jms.MessageProducer.setDisableMessageTimestamp
No se pudo convertir javax.jms.MessageProducer.setPriority
No se pudo convertir javax.jms.MessageProducer.setTimeToLive
No se pudo convertir javax.jms.QueueConnection
No se pudo convertir javax.jms.QueueConnection.createConnectionConsumer
No se pudo convertir javax.jms.QueueConnection.createQueueSession
No se pudo convertir javax.jms.QueueConnectionFactory
No se pudo convertir javax.jms.QueueConnectionFactory.createQueueConnection
No se pudo convertir javax.jms.QueueConnectionFactory.createQueueConnection(String, String)
No se pudo convertir javax.jms.QueueRequestor
No se pudo convertir javax.jms.QueueSession
No se pudo convertir javax.jms.QueueSession.createBrowser
No se pudo convertir javax.jms.QueueSession.createReceiver
No se pudo convertir javax.jms.QueueBrowser.getMessageSelector
No se pudo convertir javax.jms.QueueConnection
No se pudo convertir javax.jms.QueueConnection.createQueueSession
No se pudo convertir javax.jms.QueueConnectionFactory
No se pudo convertir javax.jms.QueueConnectionFactory.createQueueConnection
No se pudo convertir javax.jms.QueueConnectionFactory.createQueueConnection(String, String)
No se pudo convertir javax.jms.QueueSession
No se pudo convertir javax.jms.ResourceAllocationException.ResourceAllocationException
No se pudo convertir javax.jms.ServerSession
No se pudo convertir javax.jms.ServerSessionPool
No se pudo convertir javax.jms.Session
No se pudo convertir javax.jms.Session.AUTO_ACKNOWLEDGE
No se pudo convertir javax.jms.Session.CLIENT_ACKNOWLEDGE
No se pudo convertir javax.jms.Session.close
No se pudo convertir javax.jms.Session.commit
No se pudo convertir javax.jms.Session.DUPS_OK_ACKNOWLEDGE
No se pudo convertir javax.jms.Session.getMessageListener
No se pudo convertir javax.jms.Session.getTransacted
No se pudo convertir javax.jms.Session.recover
No se pudo convertir javax.jms.Session.rollback
No se pudo convertir javax.jms.Session.run
No se pudo convertir javax.jms.Session.setMessageListener
No se pudo convertir javax.jms.StreamMessage
No se pudo convertir javax.jms.StreamMessage.readBytes
No se pudo convertir javax.jms.StreamMessage.readObject
No se pudo convertir javax.jms.StreamMessage.reset
No se pudo convertir javax.jms.StreamMessage.writeBytes
No se pudo convertir javax.jms.StreamMessage.writeObject
No se pudo convertir javax.jms.TemporaryQueue
No se pudo convertir javax.jms.TemporaryTopic
No se pudo convertir javax.jms.TopicConnection
No se pudo convertir javax.jms.TopicConnection.createConnectionConsumer
No se pudo convertir javax.jms.TopicConnection.createDurableConnectionConsumer
No se pudo convertir javax.jms.TopicConnection.createTopicSession
No se pudo convertir javax.jms.TopicConnectionFactory
No se pudo convertir javax.jms.TopicConnectionFactory.createTopicConnection
No se pudo convertir javax.jms.TopicRequestor
No se pudo convertir javax.jms.TopicSession
No se pudo convertir javax.jms.TopicSession.createDurableSubscriber
No se pudo convertir javax.jms.TopicSession.createSubscriber
No se pudo convertir javax.jms.TopicSession.createTemporaryTopic
No se pudo convertir javax.jms.TopicSession.unsubscribe
No se pudo convertir javax.jms.TopicSubscriber.getNoLocal
No se pudo convertir javax.jms.TransactionInProgressException.TransactionInProgressException
No se pudo convertir javax.jms.TransactionRolledBackException.TransactionRolledBackException
No se pudo convertir javax.jms.XAConnection
No se pudo convertir javax.jms.XAConnectionFactory
No se pudo convertir javax.jms.XAQueueConnection
No se pudo convertir javax.jms.XAQueueConnectionFactory
No se pudo convertir javax.jms.XAQueueSession
No se pudo convertir javax.jms.XASession
No se pudo convertir javax.jms.XATopicConnection
No se pudo convertir javax.jms.XATopicConnectionFactory
No se pudo convertir javax.jms.XATopicSession
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.mail


No se pudo convertir javax.mail.Address.getType
No se pudo convertir javax.mail.AuthenticationFailedException
No se pudo convertir javax.mail.Authenticator
No se pudo convertir javax.mail.BodyPart.addHeader
No se pudo convertir javax.mail.BodyPart.BodyPart
No se pudo convertir javax.mail.BodyPart.getAllHeaders
No se pudo convertir javax.mail.BodyPart.getContent
No se pudo convertir javax.mail.BodyPart.getContentType
No se pudo convertir javax.mail.BodyPart.getDataHandler
No se pudo convertir javax.mail.BodyPart.getDescription
No se pudo convertir javax.mail.BodyPart.getDisposition
No se pudo convertir javax.mail.BodyPart.getHeader
No se pudo convertir javax.mail.BodyPart.getLineCount
No se pudo convertir javax.mail.BodyPart.getMatchingHeaders
No se pudo convertir javax.mail.BodyPart.getParent
No se pudo convertir javax.mail.BodyPart.getSize
No se pudo convertir javax.mail.BodyPart.isMimeType
No se pudo convertir javax.mail.BodyPart.parent
No se pudo convertir javax.mail.BodyPart.removeHeader
No se pudo convertir javax.mail.BodyPart.setContent(Multipart)
No se pudo convertir javax.mail.BodyPart.setContent(Object, String)
No se pudo convertir javax.mail.BodyPart.setDataHandler
No se pudo convertir javax.mail.BodyPart.setDescription
No se pudo convertir javax.mail.BodyPart.setDisposition
No se pudo convertir javax.mail.BodyPart.setFileName
No se pudo convertir javax.mail.BodyPart.setHeader
No se pudo convertir javax.mail.BodyPart.writeTo
No se pudo convertir javax.mail.event.ConnectionAdapter
No se pudo convertir javax.mail.event.ConnectionEvent
No se pudo convertir javax.mail.event.ConnectionListener
No se pudo convertir javax.mail.event.FolderAdapter
No se pudo convertir javax.mail.event.FolderEvent
No se pudo convertir javax.mail.event.FolderListener
No se pudo convertir javax.mail.event.MailEvent
No se pudo convertir javax.mail.event.MessageChangedEvent
No se pudo convertir javax.mail.event.MessageChangedListener
No se pudo convertir javax.mail.event.MessageCountAdapter
No se pudo convertir javax.mail.event.MessageCountEvent
No se pudo convertir javax.mail.event.MessageCountListener
No se pudo convertir javax.mail.event.StoreEvent
No se pudo convertir javax.mail.event.StoreListener
No se pudo convertir javax.mail.event.TransportAdapter
No se pudo convertir javax.mail.event.TransportEvent
No se pudo convertir javax.mail.event.TransportListener
No se pudo convertir javax.mail.FetchProfile
No se pudo convertir javax.mail.FetchProfile.Item
No se pudo convertir javax.mail.Flags
No se pudo convertir javax.mail.Flags.Flag
No se pudo convertir javax.mail.Folder
No se pudo convertir javax.mail.FolderClosedException
No se pudo convertir javax.mail.FolderNotFoundException
No se pudo convertir javax.mail.Header.Header
No se pudo convertir javax.mail.IllegalWriteException
No se pudo convertir javax.mail.internet.AddressException
No se pudo convertir javax.mail.internet.AddressException.getPos
No se pudo convertir javax.mail.internet.AddressException.getRef
No se pudo convertir javax.mail.internet.AddressException.pos
No se pudo convertir javax.mail.internet.AddressException.ref
No se pudo convertir javax.mail.internet.ContentDisposition
No se pudo convertir javax.mail.internet.ContentType
No se pudo convertir javax.mail.internet.HeaderTokenizer
No se pudo convertir javax.mail.internet.HeaderTokenizer.Token
No se pudo convertir javax.mail.internet.InternetAddress.clone
No se pudo convertir javax.mail.internet.InternetAddress.encodedPersonal
No se pudo convertir javax.mail.internet.InternetHeaders.getHeader
No se pudo convertir javax.mail.internet.InternetAddress.getLocalAddress
No se pudo convertir javax.mail.internet.InternetAddress.getPersonal
No se pudo convertir javax.mail.internet.InternetAddress.InternetAddress
No se pudo convertir javax.mail.internet.InternetAddress.personal
No se pudo convertir javax.mail.internet.InternetAddress.setAddress
No se pudo convertir javax.mail.internet.InternetAddress.setPersonal
No se pudo convertir javax.mail.internet.InternetHeaders.addHeader
No se pudo convertir javax.mail.internet.InternetHeaders.getMatchingHeaderLines
No se pudo convertir javax.mail.internet.InternetHeaders.getMatchingHeaders
No se pudo convertir javax.mail.internet.InternetHeaders.getNonMatchingHeaderLines
No se pudo convertir javax.mail.internet.InternetHeaders.getNonMatchingHeaders
No se pudo convertir javax.mail.internet.InternetHeaders.InternetHeaders
No se pudo convertir javax.mail.internet.InternetHeaders.load
No se pudo convertir javax.mail.internet.MailDateFormat
No se pudo convertir javax.mail.internet.MimeBodyPart.addHeader
No se pudo convertir javax.mail.internet.MimeBodyPart.addHeaderLine
No se pudo convertir javax.mail.internet.MimeBodyPart.content
No se pudo convertir javax.mail.internet.MimeBodyPart.contentStream
No se pudo convertir javax.mail.internet.MimeBodyPart.dh
No se pudo convertir javax.mail.internet.MimeBodyPart.getAllHeaderLines
No se pudo convertir javax.mail.internet.MimeBodyPart.getAllHeaders
No se pudo convertir javax.mail.internet.MimeBodyPart.getContent
No se pudo convertir javax.mail.internet.MimeBodyPart.getContentID
No se pudo convertir javax.mail.internet.MimeBodyPart.getContentLanguage
No se pudo convertir javax.mail.internet.MimeBodyPart.getContentMD5
No se pudo convertir javax.mail.internet.MimeBodyPart.getContentStream
No se pudo convertir javax.mail.internet.MimeBodyPart.getContentType
No se pudo convertir javax.mail.internet.MimeBodyPart.getDataHandler
No se pudo convertir javax.mail.internet.MimeBodyPart.getDescription
No se pudo convertir javax.mail.internet.MimeBodyPart.getDisposition
No se pudo convertir javax.mail.internet.MimeBodyPart.getEncoding
No se pudo convertir javax.mail.internet.MimeBodyPart.getHeader(String)
No se pudo convertir javax.mail.internet.MimeBodyPart.getHeader(String, String)
No se pudo convertir javax.mail.internet.MimeBodyPart.getLineCount
No se pudo convertir javax.mail.internet.MimeBodyPart.getMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimeBodyPart.getMatchingHeaders
No se pudo convertir javax.mail.internet.MimeBodyPart.getNonMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimeBodyPart.getNonMatchingHeaders
No se pudo convertir javax.mail.internet.MimeBodyPart.getRawInputStream
No se pudo convertir javax.mail.internet.MimeBodyPart.getSize
No se pudo convertir javax.mail.internet.MimeBodyPart.headers
No se pudo convertir javax.mail.internet.MimeBodyPart.isMimeType
No se pudo convertir javax.mail.internet.MimeBodyPart.MimeBodyPart
No se pudo convertir javax.mail.internet.MimeBodyPart.MimeBodyPart(InputStream)
No se pudo convertir javax.mail.internet.MimeBodyPart.MimeBodyPart(InternetHeaders, byte[])
No se pudo convertir javax.mail.internet.MimeBodyPart.removeHeader
No se pudo convertir javax.mail.internet.MimeBodyPart.setContent(Multipart)
No se pudo convertir javax.mail.internet.MimeBodyPart.setContent(Object, String)
No se pudo convertir javax.mail.internet.MimeBodyPart.setContentLanguage
No se pudo convertir javax.mail.internet.MimeBodyPart.setContentMD5
No se pudo convertir javax.mail.internet.MimeBodyPart.setDataHandler
No se pudo convertir javax.mail.internet.MimeBodyPart.setDescription
No se pudo convertir javax.mail.internet.MimeBodyPart.setDisposition
No se pudo convertir javax.mail.internet.MimeBodyPart.setHeader
No se pudo convertir javax.mail.internet.MimeBodyPart.setText
No se pudo convertir javax.mail.internet.MimeBodyPart.updateHeaders
No se pudo convertir javax.mail.internet.MimeBodyPart.writeTo
No se pudo convertir javax.mail.internet.MimeMessage.addHeader
No se pudo convertir javax.mail.internet.MimeMessage.addHeaderLine
No se pudo convertir javax.mail.internet.MimeMessage.addRecipients
No se pudo convertir javax.mail.internet.MimeMessage.content
No se pudo convertir javax.mail.internet.MimeMessage.contentStream
No se pudo convertir javax.mail.internet.MimeMessage.createInternetHeaders
No se pudo convertir javax.mail.internet.MimeMessage.dh
No se pudo convertir javax.mail.internet.MimeMessage.flags
No se pudo convertir javax.mail.internet.MimeMessage.getAllHeaderLines
No se pudo convertir javax.mail.internet.MimeMessage.getAllRecipients
No se pudo convertir javax.mail.internet.MimeMessage.getContentID
No se pudo convertir javax.mail.internet.MimeMessage.getContentLanguage
No se pudo convertir javax.mail.internet.MimeMessage.getContentMD5
No se pudo convertir javax.mail.internet.MimeMessage.getContentStream
No se pudo convertir javax.mail.internet.MimeMessage.getContentType
No se pudo convertir javax.mail.internet.MimeMessage.getDataHandler
No se pudo convertir javax.mail.internet.MimeMessage.getDescription
No se pudo convertir javax.mail.internet.MimeMessage.getDisposition
No se pudo convertir javax.mail.internet.MimeMessage.getEncoding
No se pudo convertir javax.mail.internet.MimeMessage.getFileName
No se pudo convertir javax.mail.internet.MimeMessage.getFlags
No se pudo convertir javax.mail.internet.MimeMessage.getFrom
No se pudo convertir javax.mail.internet.MimeMessage.getHeader
No se pudo convertir javax.mail.internet.MimeMessage.getInputStream
No se pudo convertir javax.mail.internet.MimeMessage.getLineCount
No se pudo convertir javax.mail.internet.MimeMessage.getMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimeMessage.getMatchingHeaders
No se pudo convertir javax.mail.internet.MimeMessage.getMessageID
No se pudo convertir javax.mail.internet.MimeMessage.getNonMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimeMessage.getRawInputStream
No se pudo convertir javax.mail.internet.MimeMessage.getReceivedDate
No se pudo convertir javax.mail.internet.MimeMessage.getRecipients
No se pudo convertir javax.mail.internet.MimeMessage.getReplyTo
No se pudo convertir javax.mail.internet.MimeMessage.getSentDate
No se pudo convertir javax.mail.internet.MimeMessage.getSize
No se pudo convertir javax.mail.internet.MimeMessage.headers
No se pudo convertir javax.mail.internet.MimeMessage.isMimeType
No se pudo convertir javax.mail.internet.MimeMessage.isSet
No se pudo convertir javax.mail.internet.MimeMessage.MimeMessage
No se pudo convertir javax.mail.internet.MimeMessage.modified
No se pudo convertir javax.mail.internet.MimeMessage.parse
No se pudo convertir javax.mail.internet.MimeMessage.RecipientType
No se pudo convertir javax.mail.internet.MimeMessage.reply
No se pudo convertir javax.mail.internet.MimeMessage.saveChanges
No se pudo convertir javax.mail.internet.MimeMessage.saved
No se pudo convertir javax.mail.internet.MimeMessage.setContent
No se pudo convertir javax.mail.internet.MimeMessage.setContentID
No se pudo convertir javax.mail.internet.MimeMessage.setContentLanguage
No se pudo convertir javax.mail.internet.MimeMessage.setContentMD5
No se pudo convertir javax.mail.internet.MimeMessage.setDataHandler
No se pudo convertir javax.mail.internet.MimeMessage.setDescription
No se pudo convertir javax.mail.internet.MimeMessage.setDisposition
No se pudo convertir javax.mail.internet.MimeMessage.setFileName
No se pudo convertir javax.mail.internet.MimeMessage.setFlags
No se pudo convertir javax.mail.internet.MimeMessage.setFrom
No se pudo convertir javax.mail.internet.MimeMessage.setRecipients
No se pudo convertir javax.mail.internet.MimeMessage.setSentDate
No se pudo convertir javax.mail.internet.MimeMessage.setSubject
No se pudo convertir javax.mail.internet.MimeMessage.setText
No se pudo convertir javax.mail.internet.MimeMessage.updateHeaders
No se pudo convertir javax.mail.internet.MimeMessage.writeTo
No se pudo convertir javax.mail.internet.MimeMultipart.createInternetHeaders
No se pudo convertir javax.mail.internet.MimeMultipart.createMimeBodyPart
No se pudo convertir javax.mail.internet.MimeMultipart.ds
No se pudo convertir javax.mail.internet.MimeMultipart.getBodyPart
No se pudo convertir javax.mail.internet.MimeMultipart.MimeMultipart(DataSource)
No se pudo convertir javax.mail.internet.MimeMultipart.MimeMultipart(String)
No se pudo convertir javax.mail.internet.MimeMultipart.parse
No se pudo convertir javax.mail.internet.MimeMultipart.parsed
No se pudo convertir javax.mail.internet.MimeMultipart.setSubType
No se pudo convertir javax.mail.internet.MimeMultipart.updateHeaders
No se pudo convertir javax.mail.internet.MimeMultipart.writeTo
No se pudo convertir javax.mail.internet.MimePart.getContentID
No se pudo convertir javax.mail.internet.MimePart.getContentLanguage
No se pudo convertir javax.mail.internet.MimePart.getContentMD5
No se pudo convertir javax.mail.internet.MimePart.getMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimePart.getNonMatchingHeaderLines
No se pudo convertir javax.mail.internet.MimePart.setContentLanguage
No se pudo convertir javax.mail.internet.MimePart.setContentMD5
No se pudo convertir javax.mail.internet.MimePart.setText
No se pudo convertir javax.mail.internet.MimePartDataSource
No se pudo convertir javax.mail.internet.MimeUtility
No se pudo convertir javax.mail.internet.NewsAddress
No se pudo convertir javax.mail.internet.ParameterList
No se pudo convertir javax.mail.internet.ParseException
No se pudo convertir javax.mail.internet.SharedInputStream
No se pudo convertir javax.mail.Message.addHeader
No se pudo convertir javax.mail.Message.expunged
No se pudo convertir javax.mail.Message.folder
No se pudo convertir javax.mail.Message.getAllRecipients
No se pudo convertir javax.mail.Message.getContentType
No se pudo convertir javax.mail.Message.getDataHandler
No se pudo convertir javax.mail.Message.getDescription
No se pudo convertir javax.mail.Message.getDisposition
No se pudo convertir javax.mail.Message.getFileName
No se pudo convertir javax.mail.Message.getFlags
No se pudo convertir javax.mail.Message.getFolder
No se pudo convertir javax.mail.Message.getFrom
No se pudo convertir javax.mail.Message.getInputStream
No se pudo convertir javax.mail.Message.getLineCount
No se pudo convertir javax.mail.Message.getMatchingHeaders
No se pudo convertir javax.mail.Message.getMessageNumber
No se pudo convertir javax.mail.Message.getNonMatchingHeaders
No se pudo convertir javax.mail.Message.getReceivedDate
No se pudo convertir javax.mail.Message.getRecipients
No se pudo convertir javax.mail.Message.getReplyTo
No se pudo convertir javax.mail.Message.getSentDate
No se pudo convertir javax.mail.Message.getSize
No se pudo convertir javax.mail.Message.isExpunged
No se pudo convertir javax.mail.Message.isMimeType
No se pudo convertir javax.mail.Message.isSet
No se pudo convertir javax.mail.Message.match
No se pudo convertir javax.mail.Message.Message
No se pudo convertir javax.mail.Message.msgnum
No se pudo convertir javax.mail.Message.RecipientType.readResolve
No se pudo convertir javax.mail.Message.RecipientType.type
No se pudo convertir javax.mail.Message.reply
No se pudo convertir javax.mail.Message.saveChanges
No se pudo convertir javax.mail.Message.session
No se pudo convertir javax.mail.Message.setContent
No se pudo convertir javax.mail.Message.setDataHandler
No se pudo convertir javax.mail.Message.setDescription
No se pudo convertir javax.mail.Message.setDisposition
No se pudo convertir javax.mail.Message.setExpunged
No se pudo convertir javax.mail.Message.setFileName
No se pudo convertir javax.mail.Message.setFlag
No se pudo convertir javax.mail.Message.setFlags
No se pudo convertir javax.mail.Message.setFrom
No se pudo convertir javax.mail.Message.setMessageNumber
No se pudo convertir javax.mail.Message.setSentDate
No se pudo convertir javax.mail.Message.writeTo
No se pudo convertir javax.mail.MessageAware
No se pudo convertir javax.mail.MessageContext
No se pudo convertir javax.mail.MessageRemovedException
No se pudo convertir javax.mail.MessagingException.setNextException
No se pudo convertir javax.mail.MethodNotSupportedException
No se pudo convertir javax.mail.Multipart.contentType
No se pudo convertir javax.mail.Multipart.getContentType
No se pudo convertir javax.mail.Multipart.getParent
No se pudo convertir javax.mail.Multipart.parent
No se pudo convertir javax.mail.Multipart.setMultipartDataSource
No se pudo convertir javax.mail.Multipart.setParent
No se pudo convertir javax.mail.Multipart.writeTo
No se pudo convertir javax.mail.MultipartDataSource
No se pudo convertir javax.mail.NoSuchProviderException
No se pudo convertir javax.mail.Part.addHeader
No se pudo convertir javax.mail.Part.ATTACHMENT
No se pudo convertir javax.mail.Part.getContentType
No se pudo convertir javax.mail.Part.getDataHandler
No se pudo convertir javax.mail.Part.getDescription
No se pudo convertir javax.mail.Part.getDisposition
No se pudo convertir javax.mail.Part.getFileName
No se pudo convertir javax.mail.Part.getInputStream
No se pudo convertir javax.mail.Part.getLineCount
No se pudo convertir javax.mail.Part.getMatchingHeaders
No se pudo convertir javax.mail.Part.getNonMatchingHeaders
No se pudo convertir javax.mail.Part.getSize
No se pudo convertir javax.mail.Part.INLINE
No se pudo convertir javax.mail.Part.isMimeType
No se pudo convertir javax.mail.Part.setContent
No se pudo convertir javax.mail.Part.setDataHandler
No se pudo convertir javax.mail.Part.setDescription
No se pudo convertir javax.mail.Part.setDisposition
No se pudo convertir javax.mail.Part.setFileName
No se pudo convertir javax.mail.Part.writeTo
No se pudo convertir javax.mail.PasswordAuthentication
No se pudo convertir javax.mail.Provider
No se pudo convertir javax.mail.Provider.Type
No se pudo convertir javax.mail.ReadOnlyFolderException
No se pudo convertir javax.mail.search.AddressStringTerm
No se pudo convertir javax.mail.search.AddressTerm
No se pudo convertir javax.mail.search.AndTerm
No se pudo convertir javax.mail.search.BodyTerm
No se pudo convertir javax.mail.search.ComparisonTerm
No se pudo convertir javax.mail.search.DateTerm
No se pudo convertir javax.mail.search.FlagTerm
No se pudo convertir javax.mail.search.FromStringTerm
No se pudo convertir javax.mail.search.FromTerm
No se pudo convertir javax.mail.search.HeaderTerm
No se pudo convertir javax.mail.search.IntegerComparisonTerm
No se pudo convertir javax.mail.search.MessageIDTerm
No se pudo convertir javax.mail.search.MessageNumberTerm
No se pudo convertir javax.mail.search.NotTerm
No se pudo convertir javax.mail.search.OrTerm
No se pudo convertir javax.mail.search.ReceivedDateTerm
No se pudo convertir javax.mail.search.RecipientStringTerm
No se pudo convertir javax.mail.search.RecipientTerm
No se pudo convertir javax.mail.search.SearchException
No se pudo convertir javax.mail.search.SearchTerm
No se pudo convertir javax.mail.search.SentDateTerm
No se pudo convertir javax.mail.search.SizeTerm
No se pudo convertir javax.mail.search.StringTerm
No se pudo convertir javax.mail.search.SubjectTerm
No se pudo convertir javax.mail.SendFailedException.getInvalidAddresses
No se pudo convertir javax.mail.SendFailedException.getValidSentAddresses
No se pudo convertir javax.mail.SendFailedException.getValidUnsentAddresses
No se pudo convertir javax.mail.SendFailedException.invalid
No se pudo convertir javax.mail.SendFailedException.validSent
No se pudo convertir javax.mail.SendFailedException.validUnsent
No se pudo convertir javax.mail.Service
No se pudo convertir javax.mail.Session
No se pudo convertir javax.mail.Store
No se pudo convertir javax.mail.StoreClosedException
No se pudo convertir javax.mail.Transport.addTransportListener
No se pudo convertir javax.mail.Transport.notifyTransportListeners
No se pudo convertir javax.mail.Transport.removeTransportListener
No se pudo convertir javax.mail.Transport.send
No se pudo convertir javax.mail.Transport.Transport
No se pudo convertir javax.mail.UIDFolder
No se pudo convertir javax.mail.UIDFolder.FetchProfileItem
No se pudo convertir javax.mail.URLName.fullURL
No se pudo convertir javax.mail.URLName.getFile
No se pudo convertir javax.mail.URLName.getRef
No se pudo convertir javax.mail.URLName.parseString
No se pudo convertir javax.mail.URLName.URLName
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.naming


No se pudo convertir javax.naming.BinaryRefAddr
No se pudo convertir javax.naming.BinaryRefAddr.BinaryRefAddr (String, byte [])
No se pudo convertir javax.naming.BinaryRefAddr.BinaryRefAddr(String, byte[], int, int)
No se pudo convertir javax.naming.Binding
No se pudo convertir javax.naming.Binding.Binding(String, Object)
No se pudo convertir javax.naming.Binding.Binding(String, Object, boolean)
No se pudo convertir javax.naming.Binding.Binding(String, String, Object)
No se pudo convertir javax.naming.Binding.Binding(String, String, Object, boolean)
No se pudo convertir javax.naming.Binding.setObject
No se pudo convertir javax.naming.CannotProceedException.altName
No se pudo convertir javax.naming.CannotProceedException.altNameCtx
No se pudo convertir javax.naming.CannotProceedException.environment
No se pudo convertir javax.naming.CannotProceedException.getAltName
No se pudo convertir javax.naming.CannotProceedException.getAltNameCtx
No se pudo convertir javax.naming.CannotProceedException.getEnvironment
No se pudo convertir javax.naming.CannotProceedException.getRemainingNewName
No se pudo convertir javax.naming.CannotProceedException.remainingNewName
No se pudo convertir javax.naming.CannotProceedException.setAltName
No se pudo convertir javax.naming.CannotProceedException.setAltNameCtx
No se pudo convertir javax.naming.CannotProceedException.setEnvironment
No se pudo convertir javax.naming.CannotProceedException.setRemainingNewName
No se pudo convertir javax.naming.CompositeName
No se pudo convertir javax.naming.CompositeName.CompositeName
No se pudo convertir javax.naming.CompoundName
No se pudo convertir javax.naming.CompoundName.CompoundName(Enumeration, Properties)
No se pudo convertir javax.naming.CompoundName.CompoundName(String, Properties)
No se pudo convertir javax.naming.CompoundName.impl
No se pudo convertir javax.naming.CompoundName.mySyntax
No se pudo convertir javax.naming.Context.<PropiedadEntorno>
No se pudo convertir javax.naming.Context.addToEnvironment
No se pudo convertir javax.naming.Context.bind(Name, Object)
No se pudo convertir javax.naming.Context.bind(String, Object)
No se pudo convertir javax.naming.Context.composeName
No se pudo convertir javax.naming.Context.createSubcontext
No se pudo convertir javax.naming.Context.destroySubcontext
No se pudo convertir javax.naming.Context.getEnvironment
No se pudo convertir javax.naming.Context.getNameInNamespace
No se pudo convertir javax.naming.Context.getNameParser
No se pudo convertir javax.naming.Context.list
No se pudo convertir javax.naming.Context.listBindings
No se pudo convertir javax.naming.Context.lookup
No se pudo convertir javax.naming.Context.lookupLink
No se pudo convertir javax.naming.Context.rebind
No se pudo convertir javax.naming.Context.removeFromEnvironment
No se pudo convertir javax.naming.Context.rename
No se pudo convertir javax.naming.Context.unbind
No se pudo convertir javax.naming.directory.Attribute
No se pudo convertir javax.naming.directory.Attribute.clone
No se pudo convertir javax.naming.directory.Attribute.get
No se pudo convertir javax.naming.directory.Attribute.getAttributeDefinition
No se pudo convertir javax.naming.directory.Attribute.getAttributeSyntaxDefinition
No se pudo convertir javax.naming.directory.Attribute.getID
No se pudo convertir javax.naming.directory.Attribute.isOrdered
No se pudo convertir javax.naming.directory.Attribute.serialVersionUID
No se pudo convertir javax.naming.directory.AttributeModificationException.getUnexecutedModifications
No se pudo convertir javax.naming.directory.AttributeModificationException.setUnexecutedModifications
No se pudo convertir javax.naming.directory.Attributes
No se pudo convertir javax.naming.directory.Attributes.clone
No se pudo convertir javax.naming.directory.Attributes.isCaseIgnored
No se pudo convertir javax.naming.directory.Attributes.put
No se pudo convertir javax.naming.directory.Attributes.remove
No se pudo convertir javax.naming.directory.BasicAttribute
No se pudo convertir javax.naming.directory.BasicAttribute.attrID
No se pudo convertir javax.naming.directory.BasicAttribute.BasicAttribute(String)
No se pudo convertir javax.naming.directory.BasicAttribute.BasicAttribute(String, boolean)
No se pudo convertir javax.naming.directory.BasicAttribute.BasicAttribute(String, Object)
No se pudo convertir javax.naming.directory.BasicAttribute.BasicAttribute(String, Object, boolean)
No se pudo convertir javax.naming.directory.BasicAttribute.clone
No se pudo convertir javax.naming.directory.BasicAttribute.get
No se pudo convertir javax.naming.directory.BasicAttribute.getAttributeDefinition
No se pudo convertir javax.naming.directory.BasicAttribute.getAttributeSyntaxDefinition
No se pudo convertir javax.naming.directory.BasicAttribute.getID
No se pudo convertir javax.naming.directory.BasicAttribute.isOrdered
No se pudo convertir javax.naming.directory.BasicAttribute.ordered
No se pudo convertir javax.naming.directory.BasicAttribute.values
No se pudo convertir javax.naming.directory.BasicAttributes
No se pudo convertir javax.naming.directory.BasicAttributes.BasicAttributes
No se pudo convertir javax.naming.directory.BasicAttributes.clone
No se pudo convertir javax.naming.directory.BasicAttributes.isCaseIgnored
No se pudo convertir javax.naming.directory.BasicAttributes.put
No se pudo convertir javax.naming.directory.BasicAttributes.remove
No se pudo convertir javax.naming.directory.DirContext
No se pudo convertir javax.naming.directory.DirContext.<TipoOperación>
No se pudo convertir javax.naming.directory.DirContext.bind(Name, Object, Attributes)
No se pudo convertir javax.naming.directory.DirContext.bind(String, Object, Attributes)
No se pudo convertir javax.naming.directory.DirContext.createSubcontext
No se pudo convertir javax.naming.directory.DirContext.getAttributes
No se pudo convertir javax.naming.directory.DirContext.getSchema
No se pudo convertir javax.naming.directory.DirContext.getSchemaClassDefinition
No se pudo convertir javax.naming.directory.DirContext.modifyAttributes
No se pudo convertir javax.naming.directory.DirContext.rebind
No se pudo convertir javax.naming.directory.DirContext.search
No se pudo convertir javax.naming.directory.InitialDirContext.bind
No se pudo convertir javax.naming.directory.InitialDirContext.createSubcontext
No se pudo convertir javax.naming.directory.InitialDirContext.getAttributes
No se pudo convertir javax.naming.directory.InitialDirContext.getSchema
No se pudo convertir javax.naming.directory.InitialDirContext.getSchemaClassDefinition
No se pudo convertir javax.naming.directory.InitialDirContext.InitialDirContext(boolean)
No se pudo convertir javax.naming.directory.InitialDirContext.InitialDirContext(Hashtable)
No se pudo convertir javax.naming.directory.InitialDirContext.modifyAttributes
No se pudo convertir javax.naming.directory.InitialDirContext.rebind
No se pudo convertir javax.naming.directory.InitialDirContext.search
No se pudo convertir javax.naming.directory.SearchControls.getDerefLinkFlag
No se pudo convertir javax.naming.directory.SearchControls.getReturningObjFlag
No se pudo convertir javax.naming.directory.SearchControls.SearchControls
No se pudo convertir javax.naming.directory.SearchControls.setDerefLinkFlag
No se pudo convertir javax.naming.directory.SearchControls.setReturningObjFlag
No se pudo convertir javax.naming.directory.SearchResult.getAttributes
No se pudo convertir javax.naming.directory.SearchResult.SearchResult(String, Object, Attributes)
No se pudo convertir javax.naming.directory.SearchResult.SearchResult(String, Object, Attributes, boolean)
No se pudo convertir javax.naming.directory.SearchResult.SearchResult(String, String, Object, Attributes)
No se pudo convertir javax.naming.directory.SearchResult.SearchResult(String, String, Object, Attributes, boolean)
No se pudo convertir javax.naming.directory.SearchResult.setAttributes
No se pudo convertir javax.naming.event.EventContext
No se pudo convertir javax.naming.event.EventDirContext
No se pudo convertir javax.naming.event.NamespaceChangeListener
No se pudo convertir javax.naming.event.NamingEvent
No se pudo convertir javax.naming.event.NamingExceptionEvent
No se pudo convertir javax.naming.event.NamingListener
No se pudo convertir javax.naming.event.ObjectChangeListener
No se pudo convertir javax.naming.InitialContext.addToEnvironment
No se pudo convertir javax.naming.InitialContext.bind
No se pudo convertir javax.naming.InitialContext.composeName
No se pudo convertir javax.naming.InitialContext.createSubcontext
No se pudo convertir javax.naming.InitialContext.destroySubcontext
No se pudo convertir javax.naming.InitialContext.getDefaultInitCtx
No se pudo convertir javax.naming.InitialContext.getEnvironment
No se pudo convertir javax.naming.InitialContext.getNameInNamespace
No se pudo convertir javax.naming.InitialContext.getNameParser
No se pudo convertir javax.naming.InitialContext.getURLOrDefaultInitCtx
No se pudo convertir javax.naming.InitialContext.gotDefault
No se pudo convertir javax.naming.InitialContext.init
No se pudo convertir javax.naming.InitialContext.InitialContext
No se pudo convertir javax.naming.InitialContext.InitialContext(boolean)
No se pudo convertir javax.naming.InitialContext.InitialContext(Hashtable)
No se pudo convertir javax.naming.InitialContext.list
No se pudo convertir javax.naming.InitialContext.listBindings
No se pudo convertir javax.naming.InitialContext.lookup
No se pudo convertir javax.naming.InitialContext.lookupLink
No se pudo convertir javax.naming.InitialContext.myProps
No se pudo convertir javax.naming.InitialContext.rebind
No se pudo convertir javax.naming.InitialContext.removeFromEnvironment
No se pudo convertir javax.naming.InitialContext.rename
No se pudo convertir javax.naming.InitialContext.unbind
No se pudo convertir javax.naming.ldap.Control
No se pudo convertir javax.naming.ldap.ControlFactory
No se pudo convertir javax.naming.ldap.ExtendedRequest
No se pudo convertir javax.naming.ldap.ExtendedResponse
No se pudo convertir javax.naming.ldap.HasControls
No se pudo convertir javax.naming.ldap.InitialLdapContext
No se pudo convertir javax.naming.ldap.InitialLdapContext.extendedOperation
No se pudo convertir javax.naming.ldap.InitialLdapContext.getConnectControls
No se pudo convertir javax.naming.ldap.InitialLdapContext.getRequestControls
No se pudo convertir javax.naming.ldap.InitialLdapContext.getResponseControls
No se pudo convertir javax.naming.ldap.InitialLdapContext.InitialLdapContext
No se pudo convertir javax.naming.ldap.InitialLdapContext.newInstance
No se pudo convertir javax.naming.ldap.InitialLdapContext.reconnect
No se pudo convertir javax.naming.ldap.InitialLdapContext.setRequestControls
No se pudo convertir javax.naming.ldap.LdapContext
No se pudo convertir javax.naming.ldap.LdapContext.CONTROL_FACTORIES
No se pudo convertir javax.naming.ldap.LdapContext.extendedOperation
No se pudo convertir javax.naming.ldap.LdapContext.getConnectControls
No se pudo convertir javax.naming.ldap.LdapContext.getRequestControls
No se pudo convertir javax.naming.ldap.LdapContext.getResponseControls
No se pudo convertir javax.naming.ldap.LdapContext.newInstance
No se pudo convertir javax.naming.ldap.LdapContext.reconnect
No se pudo convertir javax.naming.ldap.LdapContext.setRequestControls
No se pudo convertir javax.naming.ldap.LdapReferralException
No se pudo convertir javax.naming.ldap.UnsolicitedNotification
No se pudo convertir javax.naming.ldap.UnsolicitedNotificationEvent
No se pudo convertir javax.naming.ldap.UnsolicitedNotificationListener
No se pudo convertir javax.naming.LinkException.getLinkRemainingName
No se pudo convertir javax.naming.LinkException.getLinkResolvedName
No se pudo convertir javax.naming.LinkException.getLinkResolvedObj
No se pudo convertir javax.naming.LinkException.linkRemainingName
No se pudo convertir javax.naming.LinkException.linkResolvedName
No se pudo convertir javax.naming.LinkException.linkResolvedObj
No se pudo convertir javax.naming.LinkException.setLinkRemainingName
No se pudo convertir javax.naming.LinkException.setLinkResolvedName
No se pudo convertir javax.naming.LinkException.setLinkResolvedObj
No se pudo convertir javax.naming.LinkException.toString
No se pudo convertir javax.naming.LinkRef
No se pudo convertir javax.naming.Name
No se pudo convertir javax.naming.NameClassPair.isRelative
No se pudo convertir javax.naming.NameClassPair.NameClassPair(String, String)
No se pudo convertir javax.naming.NameClassPair.NameClassPair(String, String, boolean)
No se pudo convertir javax.naming.NameClassPair.setClassName
No se pudo convertir javax.naming.NameClassPair.setRelative
No se pudo convertir javax.naming.NameParser
No se pudo convertir javax.naming.NamingEnumeration.close
No se pudo convertir javax.naming.NamingEnumeration.hasMore
No se pudo convertir javax.naming.NamingEnumeration.next
No se pudo convertir javax.naming.NamingException.appendRemainingComponent
No se pudo convertir javax.naming.NamingException.appendRemainingName
No se pudo convertir javax.naming.NamingException.getRemainingName
No se pudo convertir javax.naming.NamingException.getResolvedName
No se pudo convertir javax.naming.NamingException.getResolvedObj
No se pudo convertir javax.naming.NamingException.printStackTrace
No se pudo convertir javax.naming.NamingException.remainingName
No se pudo convertir javax.naming.NamingException.resolvedName
No se pudo convertir javax.naming.NamingException.resolvedObj
No se pudo convertir javax.naming.NamingException.rootException
No se pudo convertir javax.naming.NamingException.setRemainingName
No se pudo convertir javax.naming.NamingException.setResolvedName
No se pudo convertir javax.naming.NamingException.setResolvedObj
No se pudo convertir javax.naming.NamingException.setRootCause
No se pudo convertir javax.naming.NamingException.toString
No se pudo convertir javax.naming.RefAddr
No se pudo convertir javax.naming.RefAddr.addrType
No se pudo convertir javax.naming.RefAddr.RefAddr
No se pudo convertir javax.naming.Reference.addrs
No se pudo convertir javax.naming.Reference.classFactory
No se pudo convertir javax.naming.Reference.classFactoryLocation
No se pudo convertir javax.naming.Reference.className
No se pudo convertir javax.naming.Reference.get
No se pudo convertir javax.naming.Reference.getClassName
No se pudo convertir javax.naming.Reference.getFactoryClassLocation
No se pudo convertir javax.naming.Reference.getFactoryClassName
No se pudo convertir javax.naming.Reference.Reference
No se pudo convertir javax.naming.Referenceable
No se pudo convertir javax.naming.ReferralException.getReferralContext
No se pudo convertir javax.naming.ReferralException.getReferralInfo
No se pudo convertir javax.naming.ReferralException.retryReferral
No se pudo convertir javax.naming.ReferralException.skipReferral
No se pudo convertir javax.naming.spi.DirectoryManager
No se pudo convertir javax.naming.spi.DirObjectFactory
No se pudo convertir javax.naming.spi.DirStateFactory
No se pudo convertir javax.naming.spi.DirStateFactory.Result
No se pudo convertir javax.naming.spi.InitialContextFactory
No se pudo convertir javax.naming.spi.InitialContextFactoryBuilder
No se pudo convertir javax.naming.spi.NamingManager
No se pudo convertir javax.naming.spi.ObjectFactory
No se pudo convertir javax.naming.spi.ObjectFactoryBuilder
No se pudo convertir javax.naming.spi.Resolver
No se pudo convertir javax.naming.spi.ResolveResult
No se pudo convertir javax.naming.spi.StateFactory
No se pudo convertir javax.naming.StringRefAddr
No se pudo convertir javax.naming.StringRefAddr.StringRefAddr
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.rmi


No se pudo convertir javax.rmi.CORBA.ClassDesc
No se pudo convertir javax.rmi.CORBA.PortableRemoteObjectDelegate
No se pudo convertir javax.rmi.CORBA.Stub
No se pudo convertir javax.rmi.CORBA.StubDelegate
No se pudo convertir javax.rmi.CORBA.Tie
No se pudo convertir javax.rmi.CORBA.Util
No se pudo convertir javax.rmi.CORBA.UtilDelegate
No se pudo convertir javax.rmi.CORBA.ValueHandler
No se pudo convertir javax.rmi.PortableRemoteObject
No se pudo convertir javax.rmi.PortableRemoteObject.narrow
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.security


No se pudo convertir javax.security.auth.AuthPermission
No se pudo convertir javax.security.auth.callback.ChoiceCallback.ChoiceCallback
No se pudo convertir javax.security.auth.callback.ChoiceCallback.getPrompt
No se pudo convertir javax.security.auth.callback.LanguageCallback.LanguageCallback
No se pudo convertir javax.security.auth.callback.NameCallback.getDefaultName
No se pudo convertir javax.security.auth.callback.NameCallback.getPrompt
No se pudo convertir javax.security.auth.callback.NameCallback.NameCallback(String)
No se pudo convertir javax.security.auth.callback.NameCallback.NameCallback(String, String)
No se pudo convertir javax.security.auth.callback.PasswordCallback.getPrompt
No se pudo convertir javax.security.auth.callback.PasswordCallback.isEchoOn
No se pudo convertir javax.security.auth.callback.PasswordCallback.PasswordCallback
No se pudo convertir javax.security.auth.callback.UnsupportedCallbackException
No se pudo convertir javax.security.auth.callback.UnsupportedCallbackException.getCallback
No se pudo convertir javax.security.auth.callback.UnsupportedCallbackException.UnsupportedCallbackException
No se pudo convertir javax.security.auth.Destroyable.isDestroyed
No se pudo convertir javax.security.auth.DestroyFailedException
No se pudo convertir javax.security.auth.DestroyFailedException.DestroyFailedException
No se pudo convertir javax.security.auth.login.AccountExpiredException
No se pudo convertir javax.security.auth.login.AccountExpiredException.AccountExpiredException
No se pudo convertir javax.security.auth.login.AppConfigurationEntry
No se pudo convertir javax.security.auth.login.AppConfigurationEntry.AppConfigurationEntry
No se pudo convertir javax.security.auth.login.AppConfigurationEntry.getControlFlag
No se pudo convertir javax.security.auth.login.AppConfigurationEntry.getLoginModuleName
No se pudo convertir javax.security.auth.login.Configuration
No se pudo convertir javax.security.auth.login.Configuration.Configuration
No se pudo convertir javax.security.auth.login.Configuration.refresh
No se pudo convertir javax.security.auth.login.Configuration.setConfiguration
No se pudo convertir javax.security.auth.login.CredentialExpiredException
No se pudo convertir javax.security.auth.login.CredentialExpiredException.CredentialExpiredException
No se pudo convertir javax.security.auth.login.FailedLoginException
No se pudo convertir javax.security.auth.login.FailedLoginException.FailedLoginException
No se pudo convertir javax.security.auth.login.LoginContext.getSubject
No se pudo convertir javax.security.auth.login.LoginContext.login
No se pudo convertir javax.security.auth.login.LoginContext.LoginContext
No se pudo convertir javax.security.auth.login.LoginContext.logout
No se pudo convertir javax.security.auth.login.LoginException
No se pudo convertir javax.security.auth.login.LoginException.LoginException
No se pudo convertir javax.security.auth.Policy
No se pudo convertir javax.security.auth.Policy.getPolicy
No se pudo convertir javax.security.auth.Policy.Policy
No se pudo convertir javax.security.auth.Policy.refresh
No se pudo convertir javax.security.auth.Policy.setPolicy
No se pudo convertir javax.security.auth.PrivateCredentialPermission
No se pudo convertir javax.security.auth.PrivateCredentialPermission.getActions
No se pudo convertir javax.security.auth.PrivateCredentialPermission.getCredentialClass
No se pudo convertir javax.security.auth.PrivateCredentialPermission.getPrincipals
No se pudo convertir javax.security.auth.PrivateCredentialPermission.implies
No se pudo convertir javax.security.auth.PrivateCredentialPermission.newPermissionCollection
No se pudo convertir javax.security.auth.PrivateCredentialPermission.PrivateCredentialPermission
No se pudo convertir javax.security.auth.Refreshable
No se pudo convertir javax.security.auth.RefreshFailedException
No se pudo convertir javax.security.auth.RefreshFailedException.RefreshFailedException
No se pudo convertir javax.security.auth.spi.LoginModule.abort
No se pudo convertir javax.security.auth.spi.LoginModule.commit
No se pudo convertir javax.security.auth.spi.LoginModule.initialize
No se pudo convertir javax.security.auth.spi.LoginModule.login
No se pudo convertir javax.security.auth.spi.LoginModule.logout
No se pudo convertir javax.security.auth.Subject.doAs
No se pudo convertir javax.security.auth.Subject.doAsPrivileged
No se pudo convertir javax.security.auth.Subject.getPrincipals
No se pudo convertir javax.security.auth.Subject.getPrivateCredentials
No se pudo convertir javax.security.auth.Subject.getPublicCredentials
No se pudo convertir javax.security.auth.Subject.getSubject
No se pudo convertir javax.security.auth.Subject.isReadOnly
No se pudo convertir javax.security.auth.Subject.setReadOnly
No se pudo convertir javax.security.auth.Subject.Subject
No se pudo convertir javax.security.auth.SubjectDomainCombiner
No se pudo convertir javax.security.cert.Certificate.Certificate
No se pudo convertir javax.security.cert.Certificate.getEncoded
No se pudo convertir javax.security.cert.Certificate.verify(PublicKey)
No se pudo convertir javax.security.cert.Certificate.verify(PublicKey, String)
No se pudo convertir javax.security.cert.X509Certificate.getInstance
No se pudo convertir javax.security.cert.X509Certificate.getNotAfter
No se pudo convertir javax.security.cert.X509Certificate.getNotBefore
No se pudo convertir javax.security.cert.X509Certificate.getSigAlgName
No se pudo convertir javax.security.cert.X509Certificate.getVersion
No se pudo convertir javax.security.cert.X509Certificate.X509Certificate
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.servlet


No se pudo convertir javax.servlet.FilterConfig
No se pudo convertir javax.servlet.GenericServlet.destroy
No se pudo convertir javax.servlet.GenericServlet.getInitParameter
No se pudo convertir javax.servlet.GenericServlet.getInitParameterNames
No se pudo convertir javax.servlet.GenericServlet.getServletConfig
No se pudo convertir javax.servlet.GenericServlet.getServletContext
No se pudo convertir javax.servlet.GenericServlet.getServletInfo
No se pudo convertir javax.servlet.GenericServlet.getServletName
No se pudo convertir javax.servlet.GenericServlet.init
No se pudo convertir javax.servlet.GenericServlet.log(String)
No se pudo convertir javax.servlet.GenericServlet.log(String, Throwable)
No se pudo convertir javax.servlet.GenericServlet.service
No se pudo convertir javax.servlet.HttpDummyBase.Config
No se pudo convertir javax.servlet.HttpDummyBase.HttpDummyBase
No se pudo convertir javax.servlet.RequestDispatcher
No se pudo convertir javax.servlet.RequestDispatcher.forward
No se pudo convertir javax.servlet.RequestDispatcher.include
No se pudo convertir javax.servlet.Servlet.destroy
No se pudo convertir javax.servlet.Servlet.getServletConfig
No se pudo convertir javax.servlet.Servlet.getServletInfo
No se pudo convertir javax.servlet.Servlet.init
No se pudo convertir javax.servlet.Servlet.service
No se pudo convertir javax.servlet.ServletConfig
No se pudo convertir javax.servlet.ServletContext.getContext
No se pudo convertir javax.servlet.ServletContext.getInitParameter
No se pudo convertir javax.servlet.ServletContext.getInitParameterNames
No se pudo convertir javax.servlet.ServletContext.getMajorVersion
No se pudo convertir javax.servlet.ServletContext.getMimeType
No se pudo convertir javax.servlet.ServletContext.getMinorVersion
No se pudo convertir javax.servlet.ServletContext.getNamedDispatcher
No se pudo convertir javax.servlet.ServletContext.getRequestDispatcher
No se pudo convertir javax.servlet.ServletContext.getResource
No se pudo convertir javax.servlet.ServletContext.getResourceAsStream
No se pudo convertir javax.servlet.ServletContext.getResourcePaths
No se pudo convertir javax.servlet.ServletContext.getServerInfo
No se pudo convertir javax.servlet.ServletContext.getServlet
No se pudo convertir javax.servlet.ServletContext.getServletContextName
No se pudo convertir javax.servlet.ServletContext.getServletNames
No se pudo convertir javax.servlet.ServletContext.getServlets
No se pudo convertir javax.servlet.ServletContext.log
No se pudo convertir javax.servlet.ServletContext.setAttribute
No se pudo convertir javax.servlet.ServletContextAttributeEvent
No se pudo convertir javax.servlet.ServletContextAttributeListener
No se pudo convertir javax.servlet.ServletContextEvent
No se pudo convertir javax.servlet.ServletContextListener
No se pudo convertir javax.servlet.ServletInputStream
No se pudo convertir javax.servlet.ServletInputStream.readLine
No se pudo convertir javax.servlet.ServletRequest.getAttribute
No se pudo convertir javax.servlet.ServletRequest.getAttributeNames
No se pudo convertir javax.servlet.ServletRequest.getLocale
No se pudo convertir javax.servlet.ServletRequest.getLocales
No se pudo convertir javax.servlet.ServletRequest.getParameter
No se pudo convertir javax.servlet.ServletRequest.getParameterMap
No se pudo convertir javax.servlet.ServletRequest.getParameterNames
No se pudo convertir javax.servlet.ServletRequest.getParameterValues
No se pudo convertir javax.servlet.ServletRequest.getProtocol
No se pudo convertir javax.servlet.ServletRequest.getReader
No se pudo convertir javax.servlet.ServletRequest.getRealPath
No se pudo convertir javax.servlet.ServletRequest.getRequestDispatcher
No se pudo convertir javax.servlet.ServletRequest.getScheme
No se pudo convertir javax.servlet.ServletRequest.getServerPort
No se pudo convertir javax.servlet.ServletRequest.removeAttribute
No se pudo convertir javax.servlet.ServletRequest.setAttribute
No se pudo convertir javax.servlet.ServletRequest.setCharacterEncoding
No se pudo convertir javax.servlet.ServletRequestWrapper.getAttribute
No se pudo convertir javax.servlet.ServletRequestWrapper.getAttributeNames
No se pudo convertir javax.servlet.ServletRequestWrapper.getLocale
No se pudo convertir javax.servlet.ServletRequestWrapper.getLocales
No se pudo convertir javax.servlet.ServletRequestWrapper.getParameter
No se pudo convertir javax.servlet.ServletRequestWrapper.getParameterMap
No se pudo convertir javax.servlet.ServletRequestWrapper.getReader
No se pudo convertir javax.servlet.ServletRequestWrapper.getRequestDispatcher
No se pudo convertir javax.servlet.ServletRequestWrapper.getScheme
No se pudo convertir javax.servlet.ServletResponse
No se pudo convertir javax.servlet.ServletResponse.flushBuffer
No se pudo convertir javax.servlet.ServletResponse.getBufferSize
No se pudo convertir javax.servlet.ServletResponse.getLocale
No se pudo convertir javax.servlet.ServletResponse.isCommitted
No se pudo convertir javax.servlet.ServletResponse.resetBuffer
No se pudo convertir javax.servlet.ServletResponse.setBufferSize
No se pudo convertir javax.servlet.ServletResponse.setContentLength
No se pudo convertir javax.servlet.ServletResponseWrapper.flushBuffer
No se pudo convertir javax.servlet.ServletResponseWrapper.getBufferSize
No se pudo convertir javax.servlet.ServletResponseWrapper.getLocale
No se pudo convertir javax.servlet.ServletResponseWrapper.isCommitted
No se pudo convertir javax.servlet.ServletResponseWrapper.setBufferSize
No se pudo convertir javax.servlet.ServletResponseWrapper.setContentLength
No se pudo convertir javax.servlet.ServletResponseWrapper.setLocale
No se pudo convertir javax.servlet.UnavailableException.getServlet
No se pudo convertir javax.servlet.UnavailableException.getUnavailableSeconds
No se pudo convertir javax.servlet.UnavailableException.isPermanent
No se pudo convertir javax.servlet.UnavailableException.UnavailableException
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.servlet.http


No se pudo convertir javax.servlet.http.Cookie.clone
No se pudo convertir javax.servlet.http.Cookie.getComment
No se pudo convertir javax.servlet.http.Cookie.getMaxAge
No se pudo convertir javax.servlet.http.Cookie.getSecure
No se pudo convertir javax.servlet.http.Cookie.getVersion
No se pudo convertir javax.servlet.http.Cookie.setComment
No se pudo convertir javax.servlet.http.Cookie.setMaxAge
No se pudo convertir javax.servlet.http.Cookie.setSecure
No se pudo convertir javax.servlet.http.Cookie.setVersion
No se pudo convertir javax.servlet.http.HttpServlet.getLastModified
No se pudo convertir javax.servlet.http.HttpServlet.HttpServlet
No se pudo convertir javax.servlet.http.HttpServlet.service(HttpServletRequest, HttpServletResponse)
No se pudo convertir javax.servlet.http.HttpServlet.service(ServletRequest, ServletResponse)
No se pudo convertir javax.servlet.http.HttpServletRequest.BASIC_AUTH
No se pudo convertir javax.servlet.http.HttpServletRequest.CLIENT_CERT_AUTH
No se pudo convertir javax.servlet.http.HttpServletRequest.DIGEST_AUTH
No se pudo convertir javax.servlet.http.HttpServletRequest.FORM_AUTH
No se pudo convertir javax.servlet.http.HttpServletRequest.getQueryString
No se pudo convertir javax.servlet.http.HttpServletRequest.getSession
No se pudo convertir javax.servlet.http.HttpServletRequest.isRequestedSessionIdFromCookie
No se pudo convertir javax.servlet.http.HttpServletRequest.isRequestedSessionIdFromURL
No se pudo convertir javax.servlet.http.HttpServletRequest.isRequestedSessionIdValid
No se pudo convertir javax.servlet.http.HttpServletRequestWrapper.getSession
No se pudo convertir javax.servlet.http.HttpServletRequestWrapper.isRequestedSessionIdFromCookie
No se pudo convertir javax.servlet.http.HttpServletRequestWrapper.isRequestedSessionIdFromURL
No se pudo convertir javax.servlet.http.HttpServletRequestWrapper.isRequestedSessionIdValid
No se pudo convertir javax.servlet.http.HttpServletResponse.addDateHeader
No se pudo convertir javax.servlet.http.HttpServletResponse.containsHeader
No se pudo convertir javax.servlet.http.HttpServletResponse.encodeRedirectURL
No se pudo convertir javax.servlet.http.HttpServletResponse.encodeURL
No se pudo convertir javax.servlet.http.HttpServletResponse.SC_TEMPORARY_REDIRECT
No se pudo convertir javax.servlet.http.HttpServletResponse.setDateHeader
No se pudo convertir javax.servlet.http.HttpServletResponseWrapper.containsHeader
No se pudo convertir javax.servlet.http.HttpServletResponseWrapper.setDateHeader
No se pudo convertir javax.servlet.http.HttpServletResponseWrapper.setHeader
No se pudo convertir javax.servlet.http.HttpServletResponseWrapper.setIntHeader
No se pudo convertir javax.servlet.http.HttpSession.getCreationTime
No se pudo convertir javax.servlet.http.HttpSession.getLastAccessedTime
No se pudo convertir javax.servlet.http.HttpSession.getMaxInactiveInterval
No se pudo convertir javax.servlet.http.HttpSession.getSessionContext
No se pudo convertir javax.servlet.http.HttpSession.getValue
No se pudo convertir javax.servlet.http.HttpSession.invalidate
No se pudo convertir javax.servlet.http.HttpSession.putValue
No se pudo convertir javax.servlet.http.HttpSession.removeValue
No se pudo convertir javax.servlet.http.HttpSession.setMaxInactiveInterval
No se pudo convertir javax.servlet.http.HttpSessionActivationListener
No se pudo convertir javax.servlet.http.HttpSessionAttributeListener
No se pudo convertir javax.servlet.http.HttpSessionBindingEvent
No se pudo convertir javax.servlet.http.HttpSessionBindingListener
No se pudo convertir javax.servlet.http.HttpSessionContext
No se pudo convertir javax.servlet.http.HttpSessionEvent
No se pudo convertir javax.servlet.http.HttpSessionListener
No se pudo convertir javax.servlet.http.HttpUtils
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.servlet.jsp


No se pudo convertir javax.servlet.jsp.HttpJspPage
No se pudo convertir javax.servlet.jsp.JspEngineInfo
No se pudo convertir javax.servlet.jsp.JspFactory
No se pudo convertir javax.servlet.jsp.JspPage
No se pudo convertir javax.servlet.jsp.JspWriter.bufferSize
No se pudo convertir javax.servlet.jsp.JspWriter.DEFAULT_BUFFER
No se pudo convertir javax.servlet.jsp.JspWriter.getBufferSize
No se pudo convertir javax.servlet.jsp.JspWriter.getRemaining
No se pudo convertir javax.servlet.jsp.JspWriter.NO_BUFFER
No se pudo convertir javax.servlet.jsp.JspWriter.UNBOUNDED_BUFFER
No se pudo convertir javax.servlet.jsp.PageContext.APPLICATION
No se pudo convertir javax.servlet.jsp.PageContext.APPLICATION_SCOPE
No se pudo convertir javax.servlet.jsp.PageContext.CONFIG
No se pudo convertir javax.servlet.jsp.PageContext.EXCEPTION
No se pudo convertir javax.servlet.jsp.PageContext.findAttribute
No se pudo convertir javax.servlet.jsp.PageContext.getAttribute
No se pudo convertir javax.servlet.jsp.PageContext.getAttributeNamesInScope
No se pudo convertir javax.servlet.jsp.PageContext.getAttributesScope
No se pudo convertir javax.servlet.jsp.PageContext.getServletConfig
No se pudo convertir javax.servlet.jsp.PageContext.handlePageException
No se pudo convertir javax.servlet.jsp.PageContext.initialize
No se pudo convertir javax.servlet.jsp.PageContext.OUT
No se pudo convertir javax.servlet.jsp.PageContext.PAGE
No se pudo convertir javax.servlet.jsp.PageContext.PageContext
No se pudo convertir javax.servlet.jsp.PageContext.PAGECONTEXT
No se pudo convertir javax.servlet.jsp.PageContext.PAGE_SCOPE
No se pudo convertir javax.servlet.jsp.PageContext.popBody
No se pudo convertir javax.servlet.jsp.PageContext.pushBody
No se pudo convertir javax.servlet.jsp.PageContext.release
No se pudo convertir javax.servlet.jsp.PageContext.removeAttribute
No se pudo convertir javax.servlet.jsp.PageContext.REQUEST
No se pudo convertir javax.servlet.jsp.PageContext.REQUEST_SCOPE
No se pudo convertir javax.servlet.jsp.PageContext.RESPONSE
No se pudo convertir javax.servlet.jsp.PageContext.SESSION
No se pudo convertir javax.servlet.jsp.PageContext.SESSION_SCOPE
No se pudo convertir javax.servlet.jsp.PageContext.setAttribute
No se pudo convertir javax.servlet.jsp.tagext.BodyContent.flush
No se pudo convertir javax.servlet.jsp.tagext.PageData
No se pudo convertir javax.servlet.jsp.tagext.Tag.setParent
No se pudo convertir javax.servlet.jsp.tagext.TagAttributeInfo
No se pudo convertir javax.servlet.jsp.tagext.TagData
No se pudo convertir javax.servlet.jsp.tagext.TagExtraInfo
No se pudo convertir javax.servlet.jsp.tagext.TagInfo
No se pudo convertir javax.servlet.jsp.tagext.TagLibraryInfo
No se pudo convertir javax.servlet.jsp.tagext.TagLibraryValidator
No se pudo convertir javax.servlet.jsp.tagext.TagSupport.setParent
No se pudo convertir javax.servlet.jsp.tagext.TagVariableInfo
No se pudo convertir javax.servlet.jsp.tagext.TryCatchFinally
No se pudo convertir javax.servlet.jsp.tagext.ValidationMessage
No se pudo convertir javax.servlet.jsp.tagext.VariableInfo
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.sound


No se pudo convertir javax.sound.midi.ControllerEventListener
No se pudo convertir javax.sound.midi.Instrument
No se pudo convertir javax.sound.midi.InvalidMidiDataException
No se pudo convertir javax.sound.midi.MetaEventListener
No se pudo convertir javax.sound.midi.MetaMessage
No se pudo convertir javax.sound.midi.MidiChannel
No se pudo convertir javax.sound.midi.MidiDevice
No se pudo convertir javax.sound.midi.MidiDevice.Info
No se pudo convertir javax.sound.midi.MidiEvent
No se pudo convertir javax.sound.midi.MidiFileFormat
No se pudo convertir javax.sound.midi.MidiMessage
No se pudo convertir javax.sound.midi.MidiSystem
No se pudo convertir javax.sound.midi.MidiUnavailableException
No se pudo convertir javax.sound.midi.Patch
No se pudo convertir javax.sound.midi.Receiver
No se pudo convertir javax.sound.midi.Sequence
No se pudo convertir javax.sound.midi.Sequencer
No se pudo convertir javax.sound.midi.Sequencer.SyncMode
No se pudo convertir javax.sound.midi.ShortMessage
No se pudo convertir javax.sound.midi.Soundbank
No se pudo convertir javax.sound.midi.SoundbankResource
No se pudo convertir javax.sound.midi.spi.MidiDeviceProvider
No se pudo convertir javax.sound.midi.spi.MidiFileReader
No se pudo convertir javax.sound.midi.spi.MidiFileWriter
No se pudo convertir javax.sound.midi.spi.SoundbankReader
No se pudo convertir javax.sound.midi.Synthesizer
No se pudo convertir javax.sound.midi.SysexMessage
No se pudo convertir javax.sound.midi.Track
No se pudo convertir javax.sound.midi.Transmitter
No se pudo convertir javax.sound.midi.VoiceStatus
No se pudo convertir javax.sound.sampled.AudioFileFormat
No se pudo convertir javax.sound.sampled.AudioFileFormat.Type
No se pudo convertir javax.sound.sampled.AudioFormat.bigEndian
No se pudo convertir javax.sound.sampled.AudioFormat.Encoding.<TipoCodificación>
No se pudo convertir javax.sound.sampled.AudioFormat.Encoding.Encoding
No se pudo convertir javax.sound.sampled.AudioFormat.isBigEndian
No se pudo convertir javax.sound.sampled.AudioFormat.matches
No se pudo convertir javax.sound.sampled.AudioInputStream.AudioInputStream
No se pudo convertir javax.sound.sampled.AudioInputStream.available
No se pudo convertir javax.sound.sampled.AudioInputStream.format
No se pudo convertir javax.sound.sampled.AudioInputStream.frameLength
No se pudo convertir javax.sound.sampled.AudioInputStream.framePos
No se pudo convertir javax.sound.sampled.AudioInputStream.frameSize
No se pudo convertir javax.sound.sampled.AudioInputStream.getFormat
No se pudo convertir javax.sound.sampled.AudioInputStream.getFrameLength
No se pudo convertir javax.sound.sampled.AudioInputStream.mark
No se pudo convertir javax.sound.sampled.AudioInputStream.markSupported
No se pudo convertir javax.sound.sampled.AudioPermission
No se pudo convertir javax.sound.sampled.AudioSystem
No se pudo convertir javax.sound.sampled.BooleanControl
No se pudo convertir javax.sound.sampled.BooleanControl.Type
No se pudo convertir javax.sound.sampled.Clip.getFrameLength
No se pudo convertir javax.sound.sampled.Clip.getMicrosecondLength
No se pudo convertir javax.sound.sampled.Clip.loop
No se pudo convertir javax.sound.sampled.Clip.open
No se pudo convertir javax.sound.sampled.Clip.setLoopPoints
No se pudo convertir javax.sound.sampled.Clip.setMicrosecondPosition
No se pudo convertir javax.sound.sampled.CompoundControl
No se pudo convertir javax.sound.sampled.CompoundControl.Type
No se pudo convertir javax.sound.sampled.Control
No se pudo convertir javax.sound.sampled.Control.Type
No se pudo convertir javax.sound.sampled.DataLine.available
No se pudo convertir javax.sound.sampled.DataLine.drain
No se pudo convertir javax.sound.sampled.DataLine.flush
No se pudo convertir javax.sound.sampled.DataLine.getMicrosecondPosition
No se pudo convertir javax.sound.sampled.DataLine.Info
No se pudo convertir javax.sound.sampled.DataLine.start
No se pudo convertir javax.sound.sampled.EnumControl
No se pudo convertir javax.sound.sampled.EnumControl.Type
No se pudo convertir javax.sound.sampled.FloatControl
No se pudo convertir javax.sound.sampled.FloatControl.Type
No se pudo convertir javax.sound.sampled.Line
No se pudo convertir javax.sound.sampled.Line.Info
No se pudo convertir javax.sound.sampled.LineEvent
No se pudo convertir javax.sound.sampled.LineEvent.Type
No se pudo convertir javax.sound.sampled.LineListener
No se pudo convertir javax.sound.sampled.Mixer
No se pudo convertir javax.sound.sampled.Mixer.Info
No se pudo convertir javax.sound.sampled.Port
No se pudo convertir javax.sound.sampled.Port.Info
No se pudo convertir javax.sound.sampled.ReverbType
No se pudo convertir javax.sound.sampled.SourceDataLine
No se pudo convertir javax.sound.sampled.SourceDataLine.open
No se pudo convertir javax.sound.sampled.SourceDataLine.write
No se pudo convertir javax.sound.sampled.spi.AudioFileReader
No se pudo convertir javax.sound.sampled.spi.AudioFileWriter
No se pudo convertir javax.sound.sampled.spi.FormatConversionProvider
No se pudo convertir javax.sound.sampled.spi.MixerProvider
No se pudo convertir javax.sound.sampled.TargetDataLine
No se pudo convertir javax.sound.sampled.TargetDataLine.open
No se pudo convertir javax.sound.sampled.TargetDataLine.read
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.sql


No se pudo convertir javax.sql.ConnectionEvent
No se pudo convertir javax.sql.ConnectionEventListener
No se pudo convertir javax.sql.ConnectionPoolDataSource
No se pudo convertir javax.sql.DataSource
No se pudo convertir javax.sql.PooledConnection.addConnectionEventListener
No se pudo convertir javax.sql.PooledConnection.removeConnectionEventListener
No se pudo convertir javax.sql.RowSet.addRowSetListener
No se pudo convertir javax.sql.RowSet.getEscapeProcessing
No se pudo convertir javax.sql.RowSet.getMaxFieldSize
No se pudo convertir javax.sql.RowSet.getMaxRows
No se pudo convertir javax.sql.RowSet.getPassword
No se pudo convertir javax.sql.RowSet.getTypeMap
No se pudo convertir javax.sql.RowSet.getUrl
No se pudo convertir javax.sql.RowSet.getUsername
No se pudo convertir javax.sql.RowSet.isReadOnly
No se pudo convertir javax.sql.RowSet.removeRowSetListener
No se pudo convertir javax.sql.RowSet.setAsciiStream
No se pudo convertir javax.sql.RowSet.setBinaryStream
No se pudo convertir javax.sql.RowSet.setBlob
No se pudo convertir javax.sql.RowSet.setCharacterStream
No se pudo convertir javax.sql.RowSet.setClob
No se pudo convertir javax.sql.RowSet.setConcurrency
No se pudo convertir javax.sql.RowSet.setDataSourceName
No se pudo convertir javax.sql.RowSet.setEscapeProcessing
No se pudo convertir javax.sql.RowSet.setMaxFieldSize
No se pudo convertir javax.sql.RowSet.setMaxRows
No se pudo convertir javax.sql.RowSet.setObject
No se pudo convertir javax.sql.RowSet.setPassword
No se pudo convertir javax.sql.RowSet.setReadOnly
No se pudo convertir javax.sql.RowSet.setType
No se pudo convertir javax.sql.RowSet.setTypeMap
No se pudo convertir javax.sql.RowSet.setUrl
No se pudo convertir javax.sql.RowSet.setUsername
No se pudo convertir javax.sql.RowSetEvent
No se pudo convertir javax.sql.RowSetInternal
No se pudo convertir javax.sql.RowSetListener
No se pudo convertir javax.sql.RowSetMetaData.setCatalogName
No se pudo convertir javax.sql.RowSetMetaData.setColumnCount
No se pudo convertir javax.sql.RowSetMetaData.setCurrency
No se pudo convertir javax.sql.RowSetMetaData.setPrecision
No se pudo convertir javax.sql.RowSetMetaData.setScale
No se pudo convertir javax.sql.RowSetMetaData.setSearchable
No se pudo convertir javax.sql.RowSetMetaData.setSigned
No se pudo convertir javax.sql.RowSetReader
No se pudo convertir javax.sql.RowSetWriter
No se pudo convertir javax.sql.XAConnection
No se pudo convertir javax.sql.XAConnection.getXAResource
No se pudo convertir javax.sql.XADataSource
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing


No se pudo convertir javax.swing.<NombreClase>.addNotify
No se pudo convertir javax.swing.<NombreClase>.process*Event
No se pudo convertir javax.swing.<NombreClase>.removeNotify
No se pudo convertir javax.swing.<NombreClase>.setLayout
No se pudo convertir javax.swing.<NombreClase>BeanInfo
No se pudo convertir javax.swing.AbstractAction.AbstractAction(String)
No se pudo convertir javax.swing.AbstractAction.AbstractAction(String, Icon)
No se pudo convertir javax.swing.AbstractAction.addPropertyChangeListener
No se pudo convertir javax.swing.AbstractAction.changeSupport
No se pudo convertir javax.swing.AbstractAction.enabled
No se pudo convertir javax.swing.AbstractAction.firePropertyChange
No se pudo convertir javax.swing.AbstractAction.getKeys
No se pudo convertir javax.swing.AbstractAction.getValue
No se pudo convertir javax.swing.AbstractAction.isEnabled
No se pudo convertir javax.swing.AbstractAction.putValue
No se pudo convertir javax.swing.AbstractAction.removePropertyChangeListener
No se pudo convertir javax.swing.AbstractAction.setEnabled
No se pudo convertir javax.swing.AbstractButton.<PropiedadCambiada>
No se pudo convertir javax.swing.AbstractButton.AbstractButton
No se pudo convertir javax.swing.AbstractButton.actionListener
No se pudo convertir javax.swing.AbstractButton.addChangeListener
No se pudo convertir javax.swing.AbstractButton.changeEvent
No se pudo convertir javax.swing.AbstractButton.changeListener
No se pudo convertir javax.swing.AbstractButton.checkHorizontalKey
No se pudo convertir javax.swing.AbstractButton.checkVerticalKey
No se pudo convertir javax.swing.AbstractButton.configurePropertiesFromAction
No se pudo convertir javax.swing.AbstractButton.createActionListener
No se pudo convertir javax.swing.AbstractButton.createActionPropertyChangeListener
No se pudo convertir javax.swing.AbstractButton.createChangeListener
No se pudo convertir javax.swing.AbstractButton.createItemListener
No se pudo convertir javax.swing.AbstractButton.doClick
No se pudo convertir javax.swing.AbstractButton.fireItemStateChanged
No se pudo convertir javax.swing.AbstractButton.fireStateChanged
No se pudo convertir javax.swing.AbstractButton.get<Estado>Icon
No se pudo convertir javax.swing.AbstractButton.getAction
No se pudo convertir javax.swing.AbstractButton.getActionCommand
No se pudo convertir javax.swing.AbstractButton.getHorizontalAlignment
No se pudo convertir javax.swing.AbstractButton.getHorizontalTextPosition
No se pudo convertir javax.swing.AbstractButton.getIcon
No se pudo convertir javax.swing.AbstractButton.getMargin
No se pudo convertir javax.swing.AbstractButton.getMnemonic
No se pudo convertir javax.swing.AbstractButton.getModel
No se pudo convertir javax.swing.AbstractButton.getSelectedObjects
No se pudo convertir javax.swing.AbstractButton.getUI
No se pudo convertir javax.swing.AbstractButton.getVerticalAlignment
No se pudo convertir javax.swing.AbstractButton.getVerticalTextPosition
No se pudo convertir javax.swing.AbstractButton.imageUpdate
No se pudo convertir javax.swing.AbstractButton.init
No se pudo convertir javax.swing.AbstractButton.isBorderPainted
No se pudo convertir javax.swing.AbstractButton.isContentAreaFilled
No se pudo convertir javax.swing.AbstractButton.isFocusPainted
No se pudo convertir javax.swing.AbstractButton.isRolloverEnabled
No se pudo convertir javax.swing.AbstractButton.itemListener
No se pudo convertir javax.swing.AbstractButton.model
No se pudo convertir javax.swing.AbstractButton.paintBorder
No se pudo convertir javax.swing.AbstractButton.removeChangeListener
No se pudo convertir javax.swing.AbstractButton.set<Estado>Icon
No se pudo convertir javax.swing.AbstractButton.setActionCommand
No se pudo convertir javax.swing.AbstractButton.setBorderPainted
No se pudo convertir javax.swing.AbstractButton.setContentAreaFilled
No se pudo convertir javax.swing.AbstractButton.setFocusPainted
No se pudo convertir javax.swing.AbstractButton.setHorizontalAlignment
No se pudo convertir javax.swing.AbstractButton.setHorizontalTextPosition
No se pudo convertir javax.swing.AbstractButton.setIcon
No se pudo convertir javax.swing.AbstractButton.setMargin
No se pudo convertir javax.swing.AbstractButton.setMnemonic
No se pudo convertir javax.swing.AbstractButton.setModel
No se pudo convertir javax.swing.AbstractButton.setRolloverEnabled
No se pudo convertir javax.swing.AbstractButton.setSelected
No se pudo convertir javax.swing.AbstractButton.setUI
No se pudo convertir javax.swing.AbstractButton.setVerticalAlignment
No se pudo convertir javax.swing.AbstractButton.setVerticalTextPosition
No se pudo convertir javax.swing.AbstractButton.updateUI
No se pudo convertir javax.swing.AbstractCellEditor
No se pudo convertir javax.swing.AbstractListModel
No se pudo convertir javax.swing.AbstractListModel.addListDataListener
No se pudo convertir javax.swing.AbstractListModel.fireContentsChanged
No se pudo convertir javax.swing.AbstractListModel.fireIntervalAdded
No se pudo convertir javax.swing.AbstractListModel.fireIntervalRemoved
No se pudo convertir javax.swing.AbstractListModel.getListeners
No se pudo convertir javax.swing.AbstractListModel.listenerList
No se pudo convertir javax.swing.AbstractListModel.removeListDataListener
No se pudo convertir javax.swing.Action.ACCELERATOR_KEY
No se pudo convertir javax.swing.Action.ACTION_COMMAND_KEY
No se pudo convertir javax.swing.Action.addPropertyChangeListener
No se pudo convertir javax.swing.Action.DEFAULT
No se pudo convertir javax.swing.Action.getValue
No se pudo convertir javax.swing.Action.isEnabled
No se pudo convertir javax.swing.Action.LONG_DESCRIPTION
No se pudo convertir javax.swing.Action.MNEMONIC_KEY
No se pudo convertir javax.swing.Action.NAME
No se pudo convertir javax.swing.Action.putValue
No se pudo convertir javax.swing.Action.removePropertyChangeListener
No se pudo convertir javax.swing.Action.setEnabled
No se pudo convertir javax.swing.Action.SHORT_DESCRIPTION
No se pudo convertir javax.swing.Action.SMALL_ICON
No se pudo convertir javax.swing.ActionMap
No se pudo convertir javax.swing.ActionMap.allKeys
No se pudo convertir javax.swing.ActionMap.get
No se pudo convertir javax.swing.ActionMap.getParent
No se pudo convertir javax.swing.ActionMap.keys
No se pudo convertir javax.swing.ActionMap.setParent
No se pudo convertir javax.swing.ActionMap.size
No se pudo convertir javax.swing.BorderFactory
No se pudo convertir javax.swing.BorderFactory.BorderFactory
No se pudo convertir javax.swing.BorderFactory.createCompoundBorder
No se pudo convertir javax.swing.BorderFactory.createEtchedBorder
No se pudo convertir javax.swing.BorderFactory.createMatteBorder
No se pudo convertir javax.swing.BorderFactory.createTitledBorder
No se pudo convertir javax.swing.BoundedRangeModel
No se pudo convertir javax.swing.Box
No se pudo convertir javax.swing.Box.Filler
No se pudo convertir javax.swing.BoxLayout
No se pudo convertir javax.swing.ButtonGroup
No se pudo convertir javax.swing.ButtonGroup.add
No se pudo convertir javax.swing.ButtonModel
No se pudo convertir javax.swing.ButtonModel.addActionListener
No se pudo convertir javax.swing.ButtonModel.addChangeListener
No se pudo convertir javax.swing.ButtonModel.addItemListener
No se pudo convertir javax.swing.ButtonModel.getActionCommand
No se pudo convertir javax.swing.ButtonModel.getMnemonic
No se pudo convertir javax.swing.ButtonModel.isArmed
No se pudo convertir javax.swing.ButtonModel.isPressed
No se pudo convertir javax.swing.ButtonModel.isRollover
No se pudo convertir javax.swing.ButtonModel.isSelected
No se pudo convertir javax.swing.ButtonModel.removeActionListener
No se pudo convertir javax.swing.ButtonModel.removeChangeListener
No se pudo convertir javax.swing.ButtonModel.removeItemListener
No se pudo convertir javax.swing.ButtonModel.setActionCommand
No se pudo convertir javax.swing.ButtonModel.setArmed
No se pudo convertir javax.swing.ButtonModel.setGroup
No se pudo convertir javax.swing.ButtonModel.setMnemonic
No se pudo convertir javax.swing.ButtonModel.setPressed
No se pudo convertir javax.swing.ButtonModel.setRollover
No se pudo convertir javax.swing.ButtonModel.setSelected
No se pudo convertir javax.swing.CellEditor
No se pudo convertir javax.swing.CellRendererPane
No se pudo convertir javax.swing.ComboBoxEditor
No se pudo convertir javax.swing.ComboBoxModel.getSelectedItem
No se pudo convertir javax.swing.ComboBoxModel.setSelectedItem
No se pudo convertir javax.swing.ComponentInputMap
No se pudo convertir javax.swing.DebugGraphics
No se pudo convertir javax.swing.DebugGraphics.BUFFERED_OPTION
No se pudo convertir javax.swing.DebugGraphics.clearRect
No se pudo convertir javax.swing.DebugGraphics.clipRect
No se pudo convertir javax.swing.DebugGraphics.copyArea
No se pudo convertir javax.swing.DebugGraphics.create
No se pudo convertir javax.swing.DebugGraphics.DebugGraphics
No se pudo convertir javax.swing.DebugGraphics.DebugGraphics(Graphics)
No se pudo convertir javax.swing.DebugGraphics.DebugGraphics (Graphics, IComponent)
No se pudo convertir javax.swing.DebugGraphics.dispose
No se pudo convertir javax.swing.DebugGraphics.draw3DRect
No se pudo convertir javax.swing.DebugGraphics.drawArc
No se pudo convertir javax.swing.DebugGraphics.drawBytes
No se pudo convertir javax.swing.DebugGraphics.drawChars
No se pudo convertir javax.swing.DebugGraphics.drawImage
No se pudo convertir javax.swing.DebugGraphics.drawLine
No se pudo convertir javax.swing.DebugGraphics.drawOval
No se pudo convertir javax.swing.DebugGraphics.drawPolygon
No se pudo convertir javax.swing.DebugGraphics.drawPolyline
No se pudo convertir javax.swing.DebugGraphics.drawRect
No se pudo convertir javax.swing.DebugGraphics.drawRoundRect
No se pudo convertir javax.swing.DebugGraphics.drawString(AttributedCharacterIterator, int, int)
No se pudo convertir javax.swing.DebugGraphics.drawString(String, int, int)
No se pudo convertir javax.swing.DebugGraphics.fill3DRect
No se pudo convertir javax.swing.DebugGraphics.fillArc
No se pudo convertir javax.swing.DebugGraphics.fillOval
No se pudo convertir javax.swing.DebugGraphics.fillPolygon
No se pudo convertir javax.swing.DebugGraphics.fillRect
No se pudo convertir javax.swing.DebugGraphics.fillRoundRect
No se pudo convertir javax.swing.DebugGraphics.FLASH_OPTION
No se pudo convertir javax.swing.DebugGraphics.flashColor
No se pudo convertir javax.swing.DebugGraphics.flashCount
No se pudo convertir javax.swing.DebugGraphics.flashTime
No se pudo convertir javax.swing.DebugGraphics.getClip
No se pudo convertir javax.swing.DebugGraphics.getClipBounds
No se pudo convertir javax.swing.DebugGraphics.getColor
No se pudo convertir javax.swing.DebugGraphics.getDebugOptions
No se pudo convertir javax.swing.DebugGraphics.getFont
No se pudo convertir javax.swing.DebugGraphics.getFontMetrics
No se pudo convertir javax.swing.DebugGraphics.isDrawingBuffer
No se pudo convertir javax.swing.DebugGraphics.LOG_OPTION
No se pudo convertir javax.swing.DebugGraphics.logStream
No se pudo convertir javax.swing.DebugGraphics.NONE_OPTION
No se pudo convertir javax.swing.DebugGraphics.setClip
No se pudo convertir javax.swing.DebugGraphics.setColor
No se pudo convertir javax.swing.DebugGraphics.setDebugOptions
No se pudo convertir javax.swing.DebugGraphics.setFlashColor
No se pudo convertir javax.swing.DebugGraphics.setFlashCount
No se pudo convertir javax.swing.DebugGraphics.setFlashTime
No se pudo convertir javax.swing.DebugGraphics.setFont
No se pudo convertir javax.swing.DebugGraphics.setLogStream
No se pudo convertir javax.swing.DebugGraphics.setPaintMode
No se pudo convertir javax.swing.DebugGraphics.setXORMode
No se pudo convertir javax.swing.DebugGraphics.translate
No se pudo convertir javax.swing.DefaultBoundedRangeModel
No se pudo convertir javax.swing.DefaultButtonModel
No se pudo convertir javax.swing.DefaultButtonModel.actionCommand
No se pudo convertir javax.swing.DefaultButtonModel.addActionListener
No se pudo convertir javax.swing.DefaultButtonModel.addChangeListener
No se pudo convertir javax.swing.DefaultButtonModel.addItemListener
No se pudo convertir javax.swing.DefaultButtonModel.ARMED
No se pudo convertir javax.swing.DefaultButtonModel.changeEvent
No se pudo convertir javax.swing.DefaultButtonModel.DefaultButtonModel
No se pudo convertir javax.swing.DefaultButtonModel.ENABLED
No se pudo convertir javax.swing.DefaultButtonModel.fireActionPerformed
No se pudo convertir javax.swing.DefaultButtonModel.fireItemStateChanged
No se pudo convertir javax.swing.DefaultButtonModel.fireStateChanged
No se pudo convertir javax.swing.DefaultButtonModel.getActionCommand
No se pudo convertir javax.swing.DefaultButtonModel.getGroup
No se pudo convertir javax.swing.DefaultButtonModel.setArmed
No se pudo convertir javax.swing.DefaultButtonModel.getMnemonic
No se pudo convertir javax.swing.DefaultButtonModel.getSelectedObjects
No se pudo convertir javax.swing.DefaultButtonModel.group
No se pudo convertir javax.swing.DefaultButtonModel.isArmed
No se pudo convertir javax.swing.DefaultButtonModel.isPressed
No se pudo convertir javax.swing.DefaultButtonModel.isRollover
No se pudo convertir javax.swing.DefaultButtonModel.isSelected
No se pudo convertir javax.swing.DefaultButtonModel.listenerList
No se pudo convertir javax.swing.DefaultButtonModel.mnemonic
No se pudo convertir javax.swing.DefaultButtonModel.PRESSED
No se pudo convertir javax.swing.DefaultButtonModel.removeActionListener
No se pudo convertir javax.swing.DefaultButtonModel.removeChangeListener
No se pudo convertir javax.swing.DefaultButtonModel.removeItemListener
No se pudo convertir javax.swing.DefaultButtonModel.ROLLOVER
No se pudo convertir javax.swing.DefaultButtonModel.SELECTED
No se pudo convertir javax.swing.DefaultButtonModel.setActionCommand
No se pudo convertir javax.swing.DefaultButtonModel.setArmed
No se pudo convertir javax.swing.DefaultButtonModel.setGroup
No se pudo convertir javax.swing.DefaultButtonModel.setMnemonic
No se pudo convertir javax.swing.DefaultButtonModel.setPressed
No se pudo convertir javax.swing.DefaultButtonModel.setRollover
No se pudo convertir javax.swing.DefaultButtonModel.setSelected
No se pudo convertir javax.swing.DefaultButtonModel.stateMask
No se pudo convertir javax.swing.DefaultCellEditor
No se pudo convertir javax.swing.DefaultComboBoxModel
No se pudo convertir javax.swing.DefaultComboBoxModel.DefaultComboBoxModel
No se pudo convertir javax.swing.DefaultComboBoxModel.DefaultComboBoxModel(Object[])
No se pudo convertir javax.swing.DefaultComboBoxModel.DefaultComboBoxModel(Vector)
No se pudo convertir javax.swing.DefaultComboBoxModel.getSelectedItem
No se pudo convertir javax.swing.DefaultComboBoxModel.setSelectedItem
No se pudo convertir javax.swing.DefaultDesktopManager
No se pudo convertir javax.swing.DefaultDesktopManager.deiconifyFrame
No se pudo convertir javax.swing.DefaultDesktopManager.iconifyFrame
No se pudo convertir javax.swing.DefaultDesktopManager.maximizeFrame
No se pudo convertir javax.swing.DefaultDesktopManager.minimizeFrame
No se pudo convertir javax.swing.DefaultFocusManager
No se pudo convertir javax.swing.DefaultListCellRenderer
No se pudo convertir javax.swing.DefaultListCellRenderer.UIResource
No se pudo convertir javax.swing.DefaultListModel
No se pudo convertir javax.swing.DefaultListModel.capacity
No se pudo convertir javax.swing.DefaultListModel.ensureCapacity
No se pudo convertir javax.swing.DefaultListModel.setSize
No se pudo convertir javax.swing.DefaultListModel.trimToSize
No se pudo convertir javax.swing.DefaultListSelectionModel
No se pudo convertir javax.swing.DefaultListSelectionModel.addListSelectionListener
No se pudo convertir javax.swing.DefaultListSelectionModel.addSelectionInterval
No se pudo convertir javax.swing.DefaultListSelectionModel.clone
No se pudo convertir javax.swing.DefaultListSelectionModel.DefaultListSelectionModel
No se pudo convertir javax.swing.DefaultListSelectionModel.fireValueChanged(boolean)
No se pudo convertir javax.swing.DefaultListSelectionModel.fireValueChanged(int, int)
No se pudo convertir javax.swing.DefaultListSelectionModel.fireValueChanged(int, int, boolean)
No se pudo convertir javax.swing.DefaultListSelectionModel.getAnchorSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.getLeadSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.getListeners
No se pudo convertir javax.swing.DefaultListSelectionModel.getMaxSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.getMinSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.getSelectionMode
No se pudo convertir javax.swing.DefaultListSelectionModel.getValueIsAdjusting
No se pudo convertir javax.swing.DefaultListSelectionModel.insertIndexInterval
No se pudo convertir javax.swing.DefaultListSelectionModel.isLeadAnchorNotificationEnabled
No se pudo convertir javax.swing.DefaultListSelectionModel.leadAnchorNotificationEnabled
No se pudo convertir javax.swing.DefaultListSelectionModel.listenerList
No se pudo convertir javax.swing.DefaultListSelectionModel.removeIndexInterval
No se pudo convertir javax.swing.DefaultListSelectionModel.removeListSelectionListener
No se pudo convertir javax.swing.DefaultListSelectionModel.removeSelectionInterval
No se pudo convertir javax.swing.DefaultListSelectionModel.setAnchorSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.setLeadAnchorNotificationEnabled
No se pudo convertir javax.swing.DefaultListSelectionModel.setLeadSelectionIndex
No se pudo convertir javax.swing.DefaultListSelectionModel.setSelectionInterval
No se pudo convertir javax.swing.DefaultListSelectionModel.setSelectionMode
No se pudo convertir javax.swing.DefaultListSelectionModel.setValueIsAdjusting
No se pudo convertir javax.swing.DefaultSingleSelectionModel
No se pudo convertir javax.swing.DefaultSingleSelectionModel.addChangeListener
No se pudo convertir javax.swing.DefaultSingleSelectionModel.changeEvent
No se pudo convertir javax.swing.DefaultSingleSelectionModel.DefaultSingleSelectionModel
No se pudo convertir javax.swing.DefaultSingleSelectionModel.fireStateChanged
No se pudo convertir javax.swing.DefaultSingleSelectionModel.getListeners
No se pudo convertir javax.swing.DefaultSingleSelectionModel.listenerList
No se pudo convertir javax.swing.DefaultSingleSelectionModel.removeChangeListener
No se pudo convertir javax.swing.DesktopManager
No se pudo convertir javax.swing.DesktopManager.deiconifyFrame
No se pudo convertir javax.swing.DesktopManager.iconifyFrame
No se pudo convertir javax.swing.DesktopManager.maximizeFrame
No se pudo convertir javax.swing.DesktopManager.minimizeFrame
No se pudo convertir javax.swing.FocusManager
No se pudo convertir javax.swing.GrayFilter
No se pudo convertir javax.swing.GrayFilter.createDisabledImage
No se pudo convertir javax.swing.Icon.paintIcon
No se pudo convertir javax.swing.ImageIcon
No se pudo convertir javax.swing.ImageIcon.component
No se pudo convertir javax.swing.ImageIcon.getAccessibleContext
No se pudo convertir javax.swing.ImageIcon.getDescription
No se pudo convertir javax.swing.ImageIcon.getImageLoadStatus
No se pudo convertir javax.swing.ImageIcon.getImageObserver
No se pudo convertir javax.swing.ImageIcon.ImageIcon
No se pudo convertir javax.swing.ImageIcon.ImageIcon(byte[])
No se pudo convertir javax.swing.ImageIcon.ImageIcon(byte[], String)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(Image)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(Image, String)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(String)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(String, String)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(URL)
No se pudo convertir javax.swing.ImageIcon.ImageIcon(URL, String)
No se pudo convertir javax.swing.ImageIcon.loadImage
No se pudo convertir javax.swing.ImageIcon.paintIcon
No se pudo convertir javax.swing.ImageIcon.setDescription
No se pudo convertir javax.swing.ImageIcon.setImageObserver
No se pudo convertir javax.swing.ImageIcon.tracker
No se pudo convertir javax.swing.InputMap
No se pudo convertir javax.swing.InputMap.allKeys
No se pudo convertir javax.swing.InputMap.get
No se pudo convertir javax.swing.InputMap.getParent
No se pudo convertir javax.swing.InputMap.keys
No se pudo convertir javax.swing.InputMap.setParent
No se pudo convertir javax.swing.InputVerifier
No se pudo convertir javax.swing.JApplet
No se pudo convertir javax.swing.JApplet.accessibleContext
No se pudo convertir javax.swing.JApplet.addImpl
No se pudo convertir javax.swing.JApplet.createRootPane
No se pudo convertir javax.swing.JApplet.getGlassPane
No se pudo convertir javax.swing.JApplet.getJMenuBar
No se pudo convertir javax.swing.JApplet.getLayeredPane
No se pudo convertir javax.swing.JApplet.getRootPane
No se pudo convertir javax.swing.JApplet.isRootPaneCheckingEnabled
No se pudo convertir javax.swing.JApplet.paramString
No se pudo convertir javax.swing.JApplet.rootPane
No se pudo convertir javax.swing.JApplet.rootPaneCheckingEnabled
No se pudo convertir javax.swing.JApplet.setContentPane
No se pudo convertir javax.swing.JApplet.setGlassPane
No se pudo convertir javax.swing.JApplet.setJMenuBar
No se pudo convertir javax.swing.JApplet.setLayeredPane
No se pudo convertir javax.swing.JApplet.setRootPane
No se pudo convertir javax.swing.JApplet.setRootPaneCheckingEnabled
No se pudo convertir javax.swing.JButton.configurePropertiesFromAction
No se pudo convertir javax.swing.JButton.isDefaultButton
No se pudo convertir javax.swing.JButton.isDefaultCapable
No se pudo convertir javax.swing.JButton.JButton
No se pudo convertir javax.swing.JButton.paramString
No se pudo convertir javax.swing.JButton.setDefaultCapable
No se pudo convertir javax.swing.JButton.updateUI
No se pudo convertir javax.swing.JCheckBox.configurePropertiesFromAction
No se pudo convertir javax.swing.JCheckBox.createActionPropertyChangeListener
No se pudo convertir javax.swing.JCheckBox.JCheckBox
No se pudo convertir javax.swing.JCheckBox.updateUI
No se pudo convertir javax.swing.JCheckBoxMenuItem.getAccessibleContext
No se pudo convertir javax.swing.JCheckBoxMenuItem.getUIClassID
No se pudo convertir javax.swing.JCheckBoxMenuItem.JCheckBoxMenuItem(Action)
No se pudo convertir javax.swing.JCheckBoxMenuItem.JCheckBoxMenuItem(Icon)
No se pudo convertir javax.swing.JCheckBoxMenuItem.JCheckBoxMenuItem(String, boolean)
No se pudo convertir javax.swing.JCheckBoxMenuItem.JCheckBoxMenuItem(String, Icon)
No se pudo convertir javax.swing.JCheckBoxMenuItem.JCheckBoxMenuItem(String, Icon, boolean)
No se pudo convertir javax.swing.JCheckBoxMenuItem.requestFocus
No se pudo convertir javax.swing.JColorChooser.accessibleContext
No se pudo convertir javax.swing.JColorChooser.addChooserPanel
No se pudo convertir javax.swing.JColorChooser.CHOOSER_PANELS_PROPERTY
No se pudo convertir javax.swing.JColorChooser.createDialog
No se pudo convertir javax.swing.JColorChooser.getAccessibleContext
No se pudo convertir javax.swing.JColorChooser.getChooserPanels
No se pudo convertir javax.swing.JColorChooser.getPreviewPanel
No se pudo convertir javax.swing.JColorChooser.getSelectionModel
No se pudo convertir javax.swing.JColorChooser.getUI
No se pudo convertir javax.swing.JColorChooser.getUIClassID
No se pudo convertir javax.swing.JColorChooser.JColorChooser
No se pudo convertir javax.swing.JColorChooser.PREVIEW_PANEL_PROPERTY
No se pudo convertir javax.swing.JColorChooser.removeChooserPanel
No se pudo convertir javax.swing.JColorChooser.SELECTION_MODEL_PROPERTY
No se pudo convertir javax.swing.JColorChooser.setChooserPanels
No se pudo convertir javax.swing.JColorChooser.setPreviewPanel
No se pudo convertir javax.swing.JColorChooser.setSelectionModel
No se pudo convertir javax.swing.JColorChooser.setUI
No se pudo convertir javax.swing.JColorChooser.showDialog
No se pudo convertir javax.swing.JColorChooser.updateUI
No se pudo convertir javax.swing.JComboBox.actionCommand
No se pudo convertir javax.swing.JComboBox.actionPerformed
No se pudo convertir javax.swing.JComboBox.configureEditor
No se pudo convertir javax.swing.JComboBox.configurePropertiesFromAction
No se pudo convertir javax.swing.JComboBox.contentsChanged
No se pudo convertir javax.swing.JComboBox.createActionPropertyChangeListener
No se pudo convertir javax.swing.JComboBox.createDefaultKeySelectionManager
No se pudo convertir javax.swing.JComboBox.editor
No se pudo convertir javax.swing.JComboBox.getAction
No se pudo convertir javax.swing.JComboBox.getActionCommand
No se pudo convertir javax.swing.JComboBox.getEditor
No se pudo convertir javax.swing.JComboBox.getKeySelectionManager
No se pudo convertir javax.swing.JComboBox.getRenderer
No se pudo convertir javax.swing.JComboBox.getUI
No se pudo convertir javax.swing.JComboBox.getUIClassID
No se pudo convertir javax.swing.JComboBox.installAncestorListener
No se pudo convertir javax.swing.JComboBox.intervalAdded
No se pudo convertir javax.swing.JComboBox.intervalRemoved
No se pudo convertir javax.swing.JComboBox.isLightWeightPopupEnabled
No se pudo convertir javax.swing.JComboBox.JComboBox
No se pudo convertir javax.swing.JComboBox.keySelectionManager
No se pudo convertir javax.swing.JComboBox.KeySelectionManager
No se pudo convertir javax.swing.JComboBox.lightWeightPopupEnabled
No se pudo convertir javax.swing.JComboBox.renderer
No se pudo convertir javax.swing.JComboBox.selectedItemReminder
No se pudo convertir javax.swing.JComboBox.selectWithKeyChar
No se pudo convertir javax.swing.JComboBox.setActionCommand
No se pudo convertir javax.swing.JComboBox.setEditor
No se pudo convertir javax.swing.JComboBox.setKeySelectionManager
No se pudo convertir javax.swing.JComboBox.setLightWeightPopupEnabled
No se pudo convertir javax.swing.JComboBox.setModel
No se pudo convertir javax.swing.JComboBox.setRenderer
No se pudo convertir javax.swing.JComboBox.setUI
No se pudo convertir javax.swing.JComboBox.updateUI
No se pudo convertir javax.swing.JComponent.accessibleContext
No se pudo convertir javax.swing.JComponent.AccessibleJComponent
No se pudo convertir javax.swing.JComponent.addAncestorListener
No se pudo convertir javax.swing.JComponent.addNotify
No se pudo convertir javax.swing.JComponent.addPropertyChangeListener
No se pudo convertir javax.swing.JComponent.addVetoableChangeListener
No se pudo convertir javax.swing.JComponent.computeVisibleRect
No se pudo convertir javax.swing.JComponent.createToolTip
No se pudo convertir javax.swing.JComponent.disable
No se pudo convertir javax.swing.JComponent.firePropertyChange
No se pudo convertir javax.swing.JComponent.fireVetoableChange
No se pudo convertir javax.swing.JComponent.getActionForKeyStroke
No se pudo convertir javax.swing.JComponent.getActionMap
No se pudo convertir javax.swing.JComponent.getAlignmentX
No se pudo convertir javax.swing.JComponent.getAlignmentY
No se pudo convertir javax.swing.JComponent.getAutoscrolls
No se pudo convertir javax.swing.JComponent.getBorder
No se pudo convertir javax.swing.JComponent.getClientProperty
No se pudo convertir javax.swing.JComponent.getConditionForKeyStroke
No se pudo convertir javax.swing.JComponent.getDebugGraphicsOptions
No se pudo convertir javax.swing.JComponent.getInputMap
No se pudo convertir javax.swing.JComponent.getInputVerifier
No se pudo convertir javax.swing.JComponent.getListeners
No se pudo convertir javax.swing.JComponent.getLocation
No se pudo convertir javax.swing.JComponent.getMaximumSize
No se pudo convertir javax.swing.JComponent.getMinimumSize
No se pudo convertir javax.swing.JComponent.getNextFocusableComponent
No se pudo convertir javax.swing.JComponent.getPreferredSize
No se pudo convertir javax.swing.JComponent.getRegisteredKeyStrokes
No se pudo convertir javax.swing.JComponent.getRootPane
No se pudo convertir javax.swing.JComponent.getSize
No se pudo convertir javax.swing.JComponent.getToolTipLocation
No se pudo convertir javax.swing.JComponent.getToolTipText
No se pudo convertir javax.swing.JComponent.getTopLevelAncestor
No se pudo convertir javax.swing.JComponent.getVerifyInputWhenFocusTarget
No se pudo convertir javax.swing.JComponent.getVisibleRect
No se pudo convertir javax.swing.JComponent.isDoubleBuffered
No se pudo convertir javax.swing.JComponent.isFocusCycleRoot
No se pudo convertir javax.swing.JComponent.isLightweightComponent
No se pudo convertir javax.swing.JComponent.isManagingFocus
No se pudo convertir javax.swing.JComponent.isMaximumSizeSet
No se pudo convertir javax.swing.JComponent.isMinimumSizeSet
No se pudo convertir javax.swing.JComponent.isOpaque
No se pudo convertir javax.swing.JComponent.isOptimizedDrawingEnabled
No se pudo convertir javax.swing.JComponent.isPaintingTile
No se pudo convertir javax.swing.JComponent.isPreferredSizeSet
No se pudo convertir javax.swing.JComponent.isValidateRoot
No se pudo convertir javax.swing.JComponent.listenerList
No se pudo convertir javax.swing.JComponent.paint
No se pudo convertir javax.swing.JComponent.paintBorder
No se pudo convertir javax.swing.JComponent.paintChildren
No se pudo convertir javax.swing.JComponent.paintComponent
No se pudo convertir javax.swing.JComponent.paintImmediately
No se pudo convertir javax.swing.JComponent.print
No se pudo convertir javax.swing.JComponent.printAll
No se pudo convertir javax.swing.JComponent.printBorder
No se pudo convertir javax.swing.JComponent.printChildren
No se pudo convertir javax.swing.JComponent.printComponent
No se pudo convertir javax.swing.JComponent.processKeyBinding
No se pudo convertir javax.swing.JComponent.putClientProperty
No se pudo convertir javax.swing.JComponent.registerKeyboardAction
No se pudo convertir javax.swing.JComponent.removeAncestorListener
No se pudo convertir javax.swing.JComponent.removePropertyChangeListener
No se pudo convertir javax.swing.JComponent.removeVetoableChangeListener
No se pudo convertir javax.swing.JComponent.repaint
No se pudo convertir javax.swing.JComponent.requestDefaultFocus
No se pudo convertir javax.swing.JComponent.requestFocus
No se pudo convertir javax.swing.JComponent.resetKeyboardActions
No se pudo convertir javax.swing.JComponent.scrollRectToVisible
No se pudo convertir javax.swing.JComponent.setActionMap
No se pudo convertir javax.swing.JComponent.setAlignmentX
No se pudo convertir javax.swing.JComponent.setAlignmentY
No se pudo convertir javax.swing.JComponent.setAutoscrolls
No se pudo convertir javax.swing.JComponent.setBorder
No se pudo convertir javax.swing.JComponent.setDebugGraphicsOptions
No se pudo convertir javax.swing.JComponent.setDoubleBuffered
No se pudo convertir javax.swing.JComponent.setEnabled
No se pudo convertir javax.swing.JComponent.setInputMap
No se pudo convertir javax.swing.JComponent.setInputVerifier
No se pudo convertir javax.swing.JComponent.setMaximumSize
No se pudo convertir javax.swing.JComponent.setMinimumSize
No se pudo convertir javax.swing.JComponent.setNextFocusableComponent
No se pudo convertir javax.swing.JComponent.setOpaque
No se pudo convertir javax.swing.JComponent.setPreferredSize
No se pudo convertir javax.swing.JComponent.setRequestFocusEnabled
No se pudo convertir javax.swing.JComponent.setToolTipText
No se pudo convertir javax.swing.JComponent.setUI
No se pudo convertir javax.swing.JComponent.setVerifyInputWhenFocusTarget
No se pudo convertir javax.swing.JComponent.setVisible
No se pudo convertir javax.swing.JComponent.TOOL_TIP_TEXT_KEY
No se pudo convertir javax.swing.JComponent.ui
No se pudo convertir javax.swing.JComponent.unregisterKeyboardAction
No se pudo convertir javax.swing.JComponent.updateUI
No se pudo convertir javax.swing.JDesktopPane
No se pudo convertir javax.swing.JDesktopPane.<ModoArrastre>
No se pudo convertir javax.swing.JDesktopPane.getDesktopManager
No se pudo convertir javax.swing.JDesktopPane.getDragMode
No se pudo convertir javax.swing.JDesktopPane.getUI
No se pudo convertir javax.swing.JDesktopPane.getUIClassID
No se pudo convertir javax.swing.JDesktopPane.isOpaque
No se pudo convertir javax.swing.JDesktopPane.JDesktopPane
No se pudo convertir javax.swing.JDesktopPane.setDesktopManager
No se pudo convertir javax.swing.JDesktopPane.setDragMode
No se pudo convertir javax.swing.JDesktopPane.setSelectedFrame
No se pudo convertir javax.swing.JDesktopPane.setUI
No se pudo convertir javax.swing.JDesktopPane.updateUI
No se pudo convertir javax.swing.JDialog.accessibleContext
No se pudo convertir javax.swing.JDialog.addImpl
No se pudo convertir javax.swing.JDialog.dialogInit
No se pudo convertir javax.swing.JDialog.getDefaultCloseOperation
No se pudo convertir javax.swing.JDialog.getGlassPane
No se pudo convertir javax.swing.JDialog.getLayeredPane
No se pudo convertir javax.swing.JDialog.getRootPane
No se pudo convertir javax.swing.JDialog.isRootPaneCheckingEnabled
No se pudo convertir javax.swing.JDialog.JDialog
No se pudo convertir javax.swing.JDialog.JDialog(Dialog, boolean)
No se pudo convertir javax.swing.JDialog.JDialog(Dialog, String, boolean)
No se pudo convertir javax.swing.JDialog.JDialog(Frame, boolean)
No se pudo convertir javax.swing.JDialog.JDialog(Frame, String, boolean)
No se pudo convertir javax.swing.JDialog.rootPane
No se pudo convertir javax.swing.JDialog.rootPaneCheckingEnabled
No se pudo convertir javax.swing.JDialog.setContentPane
No se pudo convertir javax.swing.JDialog.setDefaultCloseOperation
No se pudo convertir javax.swing.JDialog.setGlassPane
No se pudo convertir javax.swing.JDialog.setLayeredPane
No se pudo convertir javax.swing.JDialog.setLocationRelativeTo
No se pudo convertir javax.swing.JDialog.setRootPane
No se pudo convertir javax.swing.JDialog.setRootPaneCheckingEnabled
No se pudo convertir javax.swing.JEditorPane
No se pudo convertir javax.swing.JEditorPane.createDefaultEditorKit
No se pudo convertir javax.swing.JEditorPane.createEditorKitForContentType
No se pudo convertir javax.swing.JEditorPane.fireHyperlinkUpdate
No se pudo convertir javax.swing.JEditorPane.getContentType
No se pudo convertir javax.swing.JEditorPane.getEditorKit
No se pudo convertir javax.swing.JEditorPane.getEditorKitClassNameForContentType
No se pudo convertir javax.swing.JEditorPane.getEditorKitForContentType
No se pudo convertir javax.swing.JEditorPane.getPage
No se pudo convertir javax.swing.JEditorPane.getPreferredSize
No se pudo convertir javax.swing.JEditorPane.getScrollableTracksViewportHeight
No se pudo convertir javax.swing.JEditorPane.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.JEditorPane.getStream
No se pudo convertir javax.swing.JEditorPane.getUIClassID
No se pudo convertir javax.swing.JEditorPane.isFocusCycleRoot
No se pudo convertir javax.swing.JEditorPane.JEditorPane(String)
No se pudo convertir javax.swing.JEditorPane.JEditorPane(String, String)
No se pudo convertir javax.swing.JEditorPane.JEditorPane(URL)
No se pudo convertir javax.swing.JEditorPane.read
No se pudo convertir javax.swing.JEditorPane.registerEditorKitForContentType(String, String)
No se pudo convertir javax.swing.JEditorPane.registerEditorKitForContentType(String, String, ClassLoader)
No se pudo convertir javax.swing.JEditorPane.scrollToReference
No se pudo convertir javax.swing.JEditorPane.setContentType
No se pudo convertir javax.swing.JEditorPane.setEditorKit
No se pudo convertir javax.swing.JEditorPane.setEditorKitForContentType
No se pudo convertir javax.swing.JEditorPane.setPage
No se pudo convertir javax.swing.JFileChooser.accept
No se pudo convertir javax.swing.JFileChooser.accessibleContext
No se pudo convertir javax.swing.JFileChooser.addChoosableFileFilter
No se pudo convertir javax.swing.JFileChooser.approveSelection
No se pudo convertir javax.swing.JFileChooser.cancelSelection
No se pudo convertir javax.swing.JFileChooser.changeToParentDirectory
No se pudo convertir javax.swing.JFileChooser.ensureFileIsVisible
No se pudo convertir javax.swing.JFileChooser.fireActionPerformed
No se pudo convertir javax.swing.JFileChooser.getAcceptAllFileFilter
No se pudo convertir javax.swing.JFileChooser.getAccessibleContext
No se pudo convertir javax.swing.JFileChooser.getAccessory
No se pudo convertir javax.swing.JFileChooser.getApproveButtonMnemonic
No se pudo convertir javax.swing.JFileChooser.getApproveButtonText
No se pudo convertir javax.swing.JFileChooser.getApproveButtonToolTipText
No se pudo convertir javax.swing.JFileChooser.getChoosableFileFilters
No se pudo convertir javax.swing.JFileChooser.getCurrentDirectory
No se pudo convertir javax.swing.JFileChooser.getDescription
No se pudo convertir javax.swing.JFileChooser.getFileFilter
No se pudo convertir javax.swing.JFileChooser.getFileSelectionMode
No se pudo convertir javax.swing.JFileChooser.getFileSystemView
No se pudo convertir javax.swing.JFileChooser.getFileView
No se pudo convertir javax.swing.JFileChooser.getIcon
No se pudo convertir javax.swing.JFileChooser.getSelectedFiles
No se pudo convertir javax.swing.JFileChooser.getTypeDescription
No se pudo convertir javax.swing.JFileChooser.getUI
No se pudo convertir javax.swing.JFileChooser.isAcceptAllFileFilterUsed
No se pudo convertir javax.swing.JFileChooser.isFileHidingEnabled
No se pudo convertir javax.swing.JFileChooser.isFileSelectionEnabled
No se pudo convertir javax.swing.JFileChooser.isTraversable
No se pudo convertir javax.swing.JFileChooser.JFileChooser(File, FileSystemView)
No se pudo convertir javax.swing.JFileChooser.JFileChooser(FileSystemView)
No se pudo convertir javax.swing.JFileChooser.JFileChooser(String, FileSystemView)
No se pudo convertir javax.swing.JFileChooser.removeChoosableFileFilter
No se pudo convertir javax.swing.JFileChooser.rescanCurrentDirectory
No se pudo convertir javax.swing.JFileChooser.resetChoosableFileFilters
No se pudo convertir javax.swing.JFileChooser.setAcceptAllFileFilterUsed
No se pudo convertir javax.swing.JFileChooser.setAccessory
No se pudo convertir javax.swing.JFileChooser.setApproveButtonMnemonic
No se pudo convertir javax.swing.JFileChooser.setApproveButtonText
No se pudo convertir javax.swing.JFileChooser.setApproveButtonToolTipText
No se pudo convertir javax.swing.JFileChooser.setControlButtonsAreShown
No se pudo convertir javax.swing.JFileChooser.setCurrentDirectory
No se pudo convertir javax.swing.JFileChooser.setDialogType
No se pudo convertir javax.swing.JFileChooser.setFileFilter
No se pudo convertir javax.swing.JFileChooser.setFileHidingEnabled
No se pudo convertir javax.swing.JFileChooser.setFileSelectionMode
No se pudo convertir javax.swing.JFileChooser.setFileSystemView
No se pudo convertir javax.swing.JFileChooser.setFileView
No se pudo convertir javax.swing.JFileChooser.setSelectedFiles
No se pudo convertir javax.swing.JFileChooser.setup
No se pudo convertir javax.swing.JFileChooser.showDialog
No se pudo convertir javax.swing.JFileChooser.showSaveDialog
No se pudo convertir javax.swing.JFileChooser.updateUI
No se pudo convertir javax.swing.JFrame.EXIT_ON_CLOSE
No se pudo convertir javax.swing.JFrame.frameInit
No se pudo convertir javax.swing.JFrame.getContentPane
No se pudo convertir javax.swing.JFrame.getDefaultCloseOperation
No se pudo convertir javax.swing.JFrame.getGlassPane
No se pudo convertir javax.swing.JFrame.getLayeredPane
No se pudo convertir javax.swing.JFrame.isRootPaneCheckingEnabled
No se pudo convertir javax.swing.JFrame.rootPane
No se pudo convertir javax.swing.JFrame.rootPaneCheckingEnabled
No se pudo convertir javax.swing.JFrame.setContentPane
No se pudo convertir javax.swing.JFrame.setDefaultCloseOperation
No se pudo convertir javax.swing.JFrame.setGlassPane
No se pudo convertir javax.swing.JFrame.setLayeredPane
No se pudo convertir javax.swing.JFrame.setRootPane
No se pudo convertir javax.swing.JFrame.setRootPaneCheckingEnabled
No se pudo convertir javax.swing.JInternalFrame
No se pudo convertir javax.swing.JInternalFrame.<NombrePropiedad>
No se pudo convertir javax.swing.JInternalFrame.closable
No se pudo convertir javax.swing.JInternalFrame.desktopIcon
No se pudo convertir javax.swing.JInternalFrame.doDefaultCloseAction
No se pudo convertir javax.swing.JInternalFrame.fireInternalFrameEvent
No se pudo convertir javax.swing.JInternalFrame.getDefaultCloseOperation
No se pudo convertir javax.swing.JInternalFrame.getDesktopIcon
No se pudo convertir javax.swing.JInternalFrame.getGlassPane
No se pudo convertir javax.swing.JInternalFrame.getLayer
No se pudo convertir javax.swing.JInternalFrame.getLayeredPane
No se pudo convertir javax.swing.JInternalFrame.getNormalBounds
No se pudo convertir javax.swing.JInternalFrame.getUI
No se pudo convertir javax.swing.JInternalFrame.getUIClassID
No se pudo convertir javax.swing.JInternalFrame.iconable
No se pudo convertir javax.swing.JInternalFrame.isClosable
No se pudo convertir javax.swing.JInternalFrame.isClosed
No se pudo convertir javax.swing.JInternalFrame.isIcon
No se pudo convertir javax.swing.JInternalFrame.isMaximum
No se pudo convertir javax.swing.JInternalFrame.isRootPaneCheckingEnabled
No se pudo convertir javax.swing.JInternalFrame.isSelected
No se pudo convertir javax.swing.JInternalFrame.JDesktopIcon
No se pudo convertir javax.swing.JInternalFrame.maximizable
No se pudo convertir javax.swing.JInternalFrame.moveToBack
No se pudo convertir javax.swing.JInternalFrame.moveToFront
No se pudo convertir javax.swing.JInternalFrame.pack
No se pudo convertir javax.swing.JInternalFrame.paintComponent
No se pudo convertir javax.swing.JInternalFrame.paramString
No se pudo convertir javax.swing.JInternalFrame.resizable
No se pudo convertir javax.swing.JInternalFrame.restoreSubcomponentFocus
No se pudo convertir javax.swing.JInternalFrame.rootPane
No se pudo convertir javax.swing.JInternalFrame.rootPaneCheckingEnabled
No se pudo convertir javax.swing.JInternalFrame.setClosable
No se pudo convertir javax.swing.JInternalFrame.setClosed
No se pudo convertir javax.swing.JInternalFrame.setContentPane
No se pudo convertir javax.swing.JInternalFrame.setDefaultCloseOperation
No se pudo convertir javax.swing.JInternalFrame.setDesktopIcon
No se pudo convertir javax.swing.JInternalFrame.setFrameIcon
No se pudo convertir javax.swing.JInternalFrame.setGlassPane
No se pudo convertir javax.swing.JInternalFrame.setLayer
No se pudo convertir javax.swing.JInternalFrame.setLayeredPane
No se pudo convertir javax.swing.JInternalFrame.setNormalBounds
No se pudo convertir javax.swing.JInternalFrame.setRootPane
No se pudo convertir javax.swing.JInternalFrame.setRootPaneCheckingEnabled
No se pudo convertir javax.swing.JInternalFrame.setSelected
No se pudo convertir javax.swing.JInternalFrame.setUI
No se pudo convertir javax.swing.JInternalFrame.updateUI
No se pudo convertir javax.swing.JLabel.checkHorizontalKey
No se pudo convertir javax.swing.JLabel.checkVerticalKey
No se pudo convertir javax.swing.JLabel.getDisabledIcon
No se pudo convertir javax.swing.JLabel.getDisplayedMnemonic
No se pudo convertir javax.swing.JLabel.getIconTextGap
No se pudo convertir javax.swing.JLabel.getLabelFor
No se pudo convertir javax.swing.JLabel.getUI
No se pudo convertir javax.swing.JLabel.getUIClassID
No se pudo convertir javax.swing.JLabel.imageUpdate
No se pudo convertir javax.swing.JLabel.labelFor
No se pudo convertir javax.swing.JLabel.setDisabledIcon
No se pudo convertir javax.swing.JLabel.setHorizontalAlignment
No se pudo convertir javax.swing.JLabel.setHorizontalTextPosition
No se pudo convertir javax.swing.JLabel.setIconTextGap
No se pudo convertir javax.swing.JLabel.setLabelFor
No se pudo convertir javax.swing.JLabel.setUI
No se pudo convertir javax.swing.JLabel.setVerticalAlignment
No se pudo convertir javax.swing.JLabel.setVerticalTextPosition
No se pudo convertir javax.swing.JLabel.updateUI
No se pudo convertir javax.swing.JLayeredPane
No se pudo convertir javax.swing.JLayeredPane.addImpl
No se pudo convertir javax.swing.JLayeredPane.getComponentCountInLayer
No se pudo convertir javax.swing.JLayeredPane.getComponentsInLayer
No se pudo convertir javax.swing.JLayeredPane.getComponentToLayer
No se pudo convertir javax.swing.JLayeredPane.getIndexOf
No se pudo convertir javax.swing.JLayeredPane.getLayer
No se pudo convertir javax.swing.JLayeredPane.getLayeredPaneAbove
No se pudo convertir javax.swing.JLayeredPane.getObjectForLayer
No se pudo convertir javax.swing.JLayeredPane.getPosition
No se pudo convertir javax.swing.JLayeredPane.highestLayer
No se pudo convertir javax.swing.JLayeredPane.insertIndexForLayer
No se pudo convertir javax.swing.JLayeredPane.isOptimizedDrawingEnabled
No se pudo convertir javax.swing.JLayeredPane.JLayeredPane
No se pudo convertir javax.swing.JLayeredPane.LAYER_PROPERTY
No se pudo convertir javax.swing.JLayeredPane.lowestLayer
No se pudo convertir javax.swing.JLayeredPane.moveToBack
No se pudo convertir javax.swing.JLayeredPane.moveToFront
No se pudo convertir javax.swing.JLayeredPane.paramString
No se pudo convertir javax.swing.JLayeredPane.putLayer
No se pudo convertir javax.swing.JLayeredPane.remove
No se pudo convertir javax.swing.JLayeredPane.setLayer
No se pudo convertir javax.swing.JLayeredPane.setPosition
No se pudo convertir javax.swing.JList.addListSelectionListener
No se pudo convertir javax.swing.JList.addSelectionInterval
No se pudo convertir javax.swing.JList.createSelectionModel
No se pudo convertir javax.swing.JList.ensureIndexIsVisible
No se pudo convertir javax.swing.JList.fireSelectionValueChanged
No se pudo convertir javax.swing.JList.getAnchorSelectionIndex
No se pudo convertir javax.swing.JList.getCellBounds
No se pudo convertir javax.swing.JList.getCellRenderer
No se pudo convertir javax.swing.JList.getFixedCellHeight
No se pudo convertir javax.swing.JList.getFixedCellWidth
No se pudo convertir javax.swing.JList.getLastVisibleIndex
No se pudo convertir javax.swing.JList.getLeadSelectionIndex
No se pudo convertir javax.swing.JList.getMaxSelectionIndex
No se pudo convertir javax.swing.JList.getMinSelectionIndex
No se pudo convertir javax.swing.JList.getModel
No se pudo convertir javax.swing.JList.getPreferredScrollableViewportSize
No se pudo convertir javax.swing.JList.getPrototypeCellValue
No se pudo convertir javax.swing.JList.getScrollableBlockIncrement
No se pudo convertir javax.swing.JList.getScrollableTracksViewportHeight
No se pudo convertir javax.swing.JList.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.JList.getScrollableUnitIncrement
No se pudo convertir javax.swing.JList.setSelectedIndex
No se pudo convertir javax.swing.JList.getSelectedIndices
No se pudo convertir javax.swing.JList.getSelectedValues
No se pudo convertir javax.swing.JList.getSelectionBackground
No se pudo convertir javax.swing.JList.getSelectionForeground
No se pudo convertir javax.swing.JList.getSelectionModel
No se pudo convertir javax.swing.JList.getUI
No se pudo convertir javax.swing.JList.getUIClassID
No se pudo convertir javax.swing.JList.getValueIsAdjusting
No se pudo convertir javax.swing.JList.getVisibleRowCount
No se pudo convertir javax.swing.JList.indexToLocation
No se pudo convertir javax.swing.JList.isSelectedIndex
No se pudo convertir javax.swing.JList.JList(ListModel)
No se pudo convertir javax.swing.JList.JList(Object[])
No se pudo convertir javax.swing.JList.paramString
No se pudo convertir javax.swing.JList.removeListSelectionListener
No se pudo convertir javax.swing.JList.removeSelectionInterval
No se pudo convertir javax.swing.JList.setCellRenderer
No se pudo convertir javax.swing.JList.setFixedCellHeight
No se pudo convertir javax.swing.JList.setFixedCellWidth
No se pudo convertir javax.swing.JList.setListData
No se pudo convertir javax.swing.JList.setModel
No se pudo convertir javax.swing.JList.setPrototypeCellValue
No se pudo convertir javax.swing.JList.setSelectedIndices
No se pudo convertir javax.swing.JList.setSelectionBackground
No se pudo convertir javax.swing.JList.setSelectionForeground
No se pudo convertir javax.swing.JList.setSelectionInterval
No se pudo convertir javax.swing.JList.setSelectionModel
No se pudo convertir javax.swing.JList.setUI
No se pudo convertir javax.swing.JList.setValueIsAdjusting
No se pudo convertir javax.swing.JList.setVisibleRowCount
No se pudo convertir javax.swing.JList.updateUI
No se pudo convertir javax.swing.JMenu.add(Component)
No se pudo convertir javax.swing.JMenu.add(Component, int)
No se pudo convertir javax.swing.JMenu.add(MenuItem)
No se pudo convertir javax.swing.JMenu.createActionChangeListener
No se pudo convertir javax.swing.JMenu.createWinListener
No se pudo convertir javax.swing.JMenu.doClick
No se pudo convertir javax.swing.JMenu.fireMenuCanceled
No se pudo convertir javax.swing.JMenu.fireMenuDeselected
No se pudo convertir javax.swing.JMenu.fireMenuSelected
No se pudo convertir javax.swing.JMenu.getAccessibleContext
No se pudo convertir javax.swing.JMenu.getComponent
No se pudo convertir javax.swing.JMenu.getDelay
No se pudo convertir javax.swing.JMenu.getMenuComponent
No se pudo convertir javax.swing.JMenu.getMenuComponents
No se pudo convertir javax.swing.JMenu.getPopupMenu
No se pudo convertir javax.swing.JMenu.getPopupMenuOrigin
No se pudo convertir javax.swing.JMenu.getUIClassID
No se pudo convertir javax.swing.JMenu.isMenuComponent
No se pudo convertir javax.swing.JMenu.isPopupMenuVisible
No se pudo convertir javax.swing.JMenu.isTearOff
No se pudo convertir javax.swing.JMenu.isTopLevelMenu
No se pudo convertir javax.swing.JMenu.menuSelectionChanged
No se pudo convertir javax.swing.JMenu.popupListener
No se pudo convertir javax.swing.JMenu.setAccelerator
No se pudo convertir javax.swing.JMenu.setDelay
No se pudo convertir javax.swing.JMenu.setMenuLocation
No se pudo convertir javax.swing.JMenu.setModel
No se pudo convertir javax.swing.JMenu.setPopupMenuVisible
No se pudo convertir javax.swing.JMenu.updateUI
No se pudo convertir javax.swing.JMenuBar.getAccessibleContext
No se pudo convertir javax.swing.JMenuBar.getComponent
No se pudo convertir javax.swing.JMenuBar.getComponentAtIndex
No se pudo convertir javax.swing.JMenuBar.getComponentIndex
No se pudo convertir javax.swing.JMenuBar.getHelpMenu
No se pudo convertir javax.swing.JMenuBar.getMargin
No se pudo convertir javax.swing.JMenuBar.getSelectionModel
No se pudo convertir javax.swing.JMenuBar.getUI
No se pudo convertir javax.swing.JMenuBar.getUIClassID
No se pudo convertir javax.swing.JMenuBar.isBorderPainted
No se pudo convertir javax.swing.JMenuBar.isManagingFocus
No se pudo convertir javax.swing.JMenuBar.isSelected
No se pudo convertir javax.swing.JMenuBar.menuSelectionChanged
No se pudo convertir javax.swing.JMenuBar.paintBorder
No se pudo convertir javax.swing.JMenuBar.processKeyBinding
No se pudo convertir javax.swing.JMenuBar.setBorderPainted
No se pudo convertir javax.swing.JMenuBar.setHelpMenu
No se pudo convertir javax.swing.JMenuBar.setMargin
No se pudo convertir javax.swing.JMenuBar.setSelected
No se pudo convertir javax.swing.JMenuBar.setSelectionModel
No se pudo convertir javax.swing.JMenuBar.setUI
No se pudo convertir javax.swing.JMenuBar.updateUI
No se pudo convertir javax.swing.JMenuItem.addMenuDragMouseListener
No se pudo convertir javax.swing.JMenuItem.addMenuKeyListener
No se pudo convertir javax.swing.JMenuItem.configurePropertiesFromAction
No se pudo convertir javax.swing.JMenuItem.createActionPropertyChangeListener
No se pudo convertir javax.swing.JMenuItem.fireMenuDragMouseDragged
No se pudo convertir javax.swing.JMenuItem.fireMenuDragMouseEntered
No se pudo convertir javax.swing.JMenuItem.fireMenuDragMouseExited
No se pudo convertir javax.swing.JMenuItem.fireMenuDragMouseReleased
No se pudo convertir javax.swing.JMenuItem.fireMenuKeyPressed
No se pudo convertir javax.swing.JMenuItem.fireMenuKeyReleased
No se pudo convertir javax.swing.JMenuItem.fireMenuKeyTyped
No se pudo convertir javax.swing.JMenuItem.getAccelerator
No se pudo convertir javax.swing.JMenuItem.getAccessibleContext
No se pudo convertir javax.swing.JMenuItem.getComponent
No se pudo convertir javax.swing.JMenuItem.getUIClassID
No se pudo convertir javax.swing.JMenuItem.init
No se pudo convertir javax.swing.JMenuItem.isArmed
No se pudo convertir javax.swing.JMenuItem.JMenuItem
No se pudo convertir javax.swing.JMenuItem.menuSelectionChanged
No se pudo convertir javax.swing.JMenuItem.removeMenuDragMouseListener
No se pudo convertir javax.swing.JMenuItem.removeMenuKeyListener
No se pudo convertir javax.swing.JMenuItem.setAccelerator
No se pudo convertir javax.swing.JMenuItem.setArmed
No se pudo convertir javax.swing.JMenuItem.setUI
No se pudo convertir javax.swing.JMenuItem.updateUI
No se pudo convertir javax.swing.JOptionPane
No se pudo convertir javax.swing.JOptionPane.showConfirmDialog
No se pudo convertir javax.swing.JOptionPane.showInternalConfirmDialog
No se pudo convertir javax.swing.JOptionPane.showInternalMessageDialog
No se pudo convertir javax.swing.JOptionPane.showMessageDialog
No se pudo convertir javax.swing.JPanel.JPanel
No se pudo convertir javax.swing.JPasswordField.getUIClassID
No se pudo convertir javax.swing.JPasswordField.JPasswordField
No se pudo convertir javax.swing.JPasswordField.JPasswordField(Document, String, int)
No se pudo convertir javax.swing.JPasswordField.JPasswordField(int)
No se pudo convertir javax.swing.JPasswordField.JPasswordField(String, int)
No se pudo convertir javax.swing.JPopupMenu.add
No se pudo convertir javax.swing.JPopupMenu.createActionChangeListener
No se pudo convertir javax.swing.JPopupMenu.createActionComponent
No se pudo convertir javax.swing.JPopupMenu.firePopupMenuCanceled
No se pudo convertir javax.swing.JPopupMenu.firePopupMenuWillBecomeInvisible
No se pudo convertir javax.swing.JPopupMenu.firePopupMenuWillBecomeVisible
No se pudo convertir javax.swing.JPopupMenu.getAccessibleContext
No se pudo convertir javax.swing.JPopupMenu.getComponent
No se pudo convertir javax.swing.JPopupMenu.getComponentAtIndex
No se pudo convertir javax.swing.JPopupMenu.getComponentIndex
No se pudo convertir javax.swing.JPopupMenu.getDefaultLightWeightPopupEnabled
No se pudo convertir javax.swing.JPopupMenu.getInvoker
No se pudo convertir javax.swing.JPopupMenu.getLabel
No se pudo convertir javax.swing.JPopupMenu.getSelectionModel
No se pudo convertir javax.swing.JPopupMenu.getUI
No se pudo convertir javax.swing.JPopupMenu.getUIClassID
No se pudo convertir javax.swing.JPopupMenu.insert
No se pudo convertir javax.swing.JPopupMenu.isBorderPainted
No se pudo convertir javax.swing.JPopupMenu.isLightWeightPopupEnabled
No se pudo convertir javax.swing.JPopupMenu.isPopupTrigger
No se pudo convertir javax.swing.JPopupMenu.isVisible
No se pudo convertir javax.swing.JPopupMenu.menuSelectionChanged
No se pudo convertir javax.swing.JPopupMenu.pack
No se pudo convertir javax.swing.JPopupMenu.paintBorder
No se pudo convertir javax.swing.JPopupMenu.Separator
No se pudo convertir javax.swing.JPopupMenu.setBorderPainted
No se pudo convertir javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled
No se pudo convertir javax.swing.JPopupMenu.setLabel
No se pudo convertir javax.swing.JPopupMenu.setLightWeightPopupEnabled
No se pudo convertir javax.swing.JPopupMenu.setLocation
No se pudo convertir javax.swing.JPopupMenu.setPopupSize(Dimension)
No se pudo convertir javax.swing.JPopupMenu.setPopupSize(int, int)
No se pudo convertir javax.swing.JPopupMenu.setSelected
No se pudo convertir javax.swing.JPopupMenu.setSelectionModel
No se pudo convertir javax.swing.JPopupMenu.setUI
No se pudo convertir javax.swing.JPopupMenu.setVisible
No se pudo convertir javax.swing.JPopupMenu.show
No se pudo convertir javax.swing.JPopupMenu.updateUI
No se pudo convertir javax.swing.JProgressBar.addChangeListener
No se pudo convertir javax.swing.JProgressBar.changeEvent
No se pudo convertir javax.swing.JProgressBar.changeListener
No se pudo convertir javax.swing.JProgressBar.createChangeListener
No se pudo convertir javax.swing.JProgressBar.fireStateChanged
No se pudo convertir javax.swing.JProgressBar.getModel
No se pudo convertir javax.swing.JProgressBar.getOrientation
No se pudo convertir javax.swing.JProgressBar.getString
No se pudo convertir javax.swing.JProgressBar.getUI
No se pudo convertir javax.swing.JProgressBar.getUIClassID
No se pudo convertir javax.swing.JProgressBar.isBorderPainted
No se pudo convertir javax.swing.JProgressBar.isStringPainted
No se pudo convertir javax.swing.JProgressBar.JProgressBar(Bounded RangeModel)
No se pudo convertir javax.swing.JProgressBar.JProgressBar(int)
No se pudo convertir javax.swing.JProgressBar.JProgressBar(int, int, int)
No se pudo convertir javax.swing.JProgressBar.model
No se pudo convertir javax.swing.JProgressBar.orientation
No se pudo convertir javax.swing.JProgressBar.paintBorder
No se pudo convertir javax.swing.JProgressBar.paintString
No se pudo convertir javax.swing.JProgressBar.progressString
No se pudo convertir javax.swing.JProgressBar.removeChangeListener
No se pudo convertir javax.swing.JProgressBar.setBorderPainted
No se pudo convertir javax.swing.JProgressBar.setModel
No se pudo convertir javax.swing.JProgressBar.setOrientation
No se pudo convertir javax.swing.JProgressBar.setString
No se pudo convertir javax.swing.JProgressBar.setStringPainted
No se pudo convertir javax.swing.JProgressBar.setUI
No se pudo convertir javax.swing.JRadioButton.configurePropertiesFromAction
No se pudo convertir javax.swing.JRadioButton.createActionPropertyChangeListener
No se pudo convertir javax.swing.JRadioButton.getUIClassID
No se pudo convertir javax.swing.JRadioButton.JRadioButton
No se pudo convertir javax.swing.JRadioButton.updateUI
No se pudo convertir javax.swing.JRadioButtonMenuItem.getAccessibleContext
No se pudo convertir javax.swing.JRadioButtonMenuItem.getUIClassID
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(Action)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(Icon)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(Icon, boolean)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(String)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(String, boolean)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(String, Icon)
No se pudo convertir javax.swing.JRadioButtonMenuItem.JRadioButtonMenuItem(String, Icon, boolean)
No se pudo convertir javax.swing.JRadioButtonMenuItem.requestFocus
No se pudo convertir javax.swing.JRootPane.contentPane
No se pudo convertir javax.swing.JRootPane.createGlassPane
No se pudo convertir javax.swing.JRootPane.createLayeredPane
No se pudo convertir javax.swing.JRootPane.createRootLayout
No se pudo convertir javax.swing.JRootPane.defaultButton
No se pudo convertir javax.swing.JRootPane.defaultPressAction
No se pudo convertir javax.swing.JRootPane.defaultReleaseAction
No se pudo convertir javax.swing.JRootPane.getDefaultButton
No se pudo convertir javax.swing.JRootPane.getGlassPane
No se pudo convertir javax.swing.JRootPane.getLayeredPane
No se pudo convertir javax.swing.JRootPane.getUI
No se pudo convertir javax.swing.JRootPane.getUIClassID
No se pudo convertir javax.swing.JRootPane.glassPane
No se pudo convertir javax.swing.JRootPane.isFocusCycleRoot
No se pudo convertir javax.swing.JRootPane.isOptimizedDrawingEnabled
No se pudo convertir javax.swing.JRootPane.isValidateRoot
No se pudo convertir javax.swing.JRootPane.layeredPane
No se pudo convertir javax.swing.JRootPane.menuBar
No se pudo convertir javax.swing.JRootPane.setDefaultButton
No se pudo convertir javax.swing.JRootPane.setGlassPane
No se pudo convertir javax.swing.JRootPane.setLayeredPane
No se pudo convertir javax.swing.JRootPane.setUI
No se pudo convertir javax.swing.JRootPane.updateUI
No se pudo convertir javax.swing.JScrollBar
No se pudo convertir javax.swing.JScrollBar.fireAdjustmentValueChanged
No se pudo convertir javax.swing.JScrollBar.getBlockIncrement
No se pudo convertir javax.swing.JScrollBar.getMaximumSize
No se pudo convertir javax.swing.JScrollBar.getModel
No se pudo convertir javax.swing.JScrollBar.getUI
No se pudo convertir javax.swing.JScrollBar.getUIClassID
No se pudo convertir javax.swing.JScrollBar.getUnitIncrement
No se pudo convertir javax.swing.JScrollBar.getValueIsAdjusting
No se pudo convertir javax.swing.JScrollBar.JScrollBar
No se pudo convertir javax.swing.JScrollBar.model
No se pudo convertir javax.swing.JScrollBar.orientation
No se pudo convertir javax.swing.JScrollBar.setBlockIncrement
No se pudo convertir javax.swing.JScrollBar.setModel
No se pudo convertir javax.swing.JScrollBar.setOrientation
No se pudo convertir javax.swing.JScrollBar.setUnitIncrement
No se pudo convertir javax.swing.JScrollBar.setValueIsAdjusting
No se pudo convertir javax.swing.JScrollBar.setValues
No se pudo convertir javax.swing.JScrollBar.setVisibleAmount
No se pudo convertir javax.swing.JScrollPane
No se pudo convertir javax.swing.JScrollPane.columnHeader
No se pudo convertir javax.swing.JScrollPane.createHorizontalScrollBar
No se pudo convertir javax.swing.JScrollPane.createVerticalScrollBar
No se pudo convertir javax.swing.JScrollPane.createViewport
No se pudo convertir javax.swing.JScrollPane.getColumnHeader
No se pudo convertir javax.swing.JScrollPane.getCorner
No se pudo convertir javax.swing.JScrollPane.getHorizontalScrollBar
No se pudo convertir javax.swing.JScrollPane.getHorizontalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.getRowHeader
No se pudo convertir javax.swing.JScrollPane.getUI
No se pudo convertir javax.swing.JScrollPane.getUIClassID
No se pudo convertir javax.swing.JScrollPane.getVerticalScrollBar
No se pudo convertir javax.swing.JScrollPane.getVerticalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.getViewport
No se pudo convertir javax.swing.JScrollPane.getViewportBorder
No se pudo convertir javax.swing.JScrollPane.horizontalScrollBar
No se pudo convertir javax.swing.JScrollPane.horizontalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.isValidateRoot
No se pudo convertir javax.swing.JScrollPane.JScrollPane
No se pudo convertir javax.swing.JScrollPane.JScrollPane(Component)
No se pudo convertir javax.swing.JScrollPane.JScrollPane(Component, int, int)
No se pudo convertir javax.swing.JScrollPane.JScrollPane(int, int)
No se pudo convertir javax.swing.JScrollPane.lowerLeft
No se pudo convertir javax.swing.JScrollPane.lowerRight
No se pudo convertir javax.swing.JScrollPane.rowHeader
No se pudo convertir javax.swing.JScrollPane.setColumnHeader
No se pudo convertir javax.swing.JScrollPane.setCorner
No se pudo convertir javax.swing.JScrollPane.setHorizontalScrollBar
No se pudo convertir javax.swing.JScrollPane.setHorizontalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.setRowHeader
No se pudo convertir javax.swing.JScrollPane.setUI
No se pudo convertir javax.swing.JScrollPane.setVerticalScrollBar
No se pudo convertir javax.swing.JScrollPane.setVerticalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.setViewport
No se pudo convertir javax.swing.JScrollPane.setViewportBorder
No se pudo convertir javax.swing.JScrollPane.updateUI
No se pudo convertir javax.swing.JScrollPane.upperLeft
No se pudo convertir javax.swing.JScrollPane.upperRight
No se pudo convertir javax.swing.JScrollPane.verticalScrollBar
No se pudo convertir javax.swing.JScrollPane.verticalScrollBarPolicy
No se pudo convertir javax.swing.JScrollPane.viewport
No se pudo convertir javax.swing.JSeparator
No se pudo convertir javax.swing.JSlider.changeEvent
No se pudo convertir javax.swing.JSlider.changeListener
No se pudo convertir javax.swing.JSlider.createChangeListener
No se pudo convertir javax.swing.JSlider.createStandardLabels(int)
No se pudo convertir javax.swing.JSlider.createStandardLabels(int, int)
No se pudo convertir javax.swing.JSlider.fireStateChanged
No se pudo convertir javax.swing.JSlider.getExtent
No se pudo convertir javax.swing.JSlider.getLabelTable
No se pudo convertir javax.swing.JSlider.getMajorTickSpacing
No se pudo convertir javax.swing.JSlider.getModel
No se pudo convertir javax.swing.JSlider.getUI
No se pudo convertir javax.swing.JSlider.getUIClassID
No se pudo convertir javax.swing.JSlider.getValueIsAdjusting
No se pudo convertir javax.swing.JSlider.JSlider
No se pudo convertir javax.swing.JSlider.majorTickSpacing
No se pudo convertir javax.swing.JSlider.setExtent
No se pudo convertir javax.swing.JSlider.setInverted
No se pudo convertir javax.swing.JSlider.setLabelTable
No se pudo convertir javax.swing.JSlider.setMajorTickSpacing
No se pudo convertir javax.swing.JSlider.setModel
No se pudo convertir javax.swing.JSlider.setPaintLabels
No se pudo convertir javax.swing.JSlider.setPaintTrack
No se pudo convertir javax.swing.JSlider.setSnapToTicks
No se pudo convertir javax.swing.JSlider.setUI
No se pudo convertir javax.swing.JSlider.setValueIsAdjusting
No se pudo convertir javax.swing.JSlider.sliderModel
No se pudo convertir javax.swing.JSlider.snapToTicks
No se pudo convertir javax.swing.JSlider.updateLabelUIs
No se pudo convertir javax.swing.JSlider.updateUI
No se pudo convertir javax.swing.JSplitPane
No se pudo convertir javax.swing.JSplitPane.continuousLayout
No se pudo convertir javax.swing.JSplitPane.getResizeWeight
No se pudo convertir javax.swing.JSplitPane.getUI
No se pudo convertir javax.swing.JSplitPane.getUIClassID
No se pudo convertir javax.swing.JSplitPane.isContinuousLayout
No se pudo convertir javax.swing.JSplitPane.isOneTouchExpandable
No se pudo convertir javax.swing.JSplitPane.isValidateRoot
No se pudo convertir javax.swing.JSplitPane.JSplitPane(int, boolean)
No se pudo convertir javax.swing.JSplitPane.JSplitPane(int, boolean, Component, Component)
No se pudo convertir javax.swing.JSplitPane.oneTouchExpandable
No se pudo convertir javax.swing.JSplitPane.paintChildren
No se pudo convertir javax.swing.JSplitPane.resetToPreferredSizes
No se pudo convertir javax.swing.JSplitPane.setContinuousLayout
No se pudo convertir javax.swing.JSplitPane.setOneTouchExpandable
No se pudo convertir javax.swing.JSplitPane.setResizeWeight
No se pudo convertir javax.swing.JSplitPane.setUI
No se pudo convertir javax.swing.JSplitPane.updateUI
No se pudo convertir javax.swing.JTabbedPane.add(Component)
No se pudo convertir javax.swing.JTabbedPane.add(Component, int)
No se pudo convertir javax.swing.JTabbedPane.add(Component, Object)
No se pudo convertir javax.swing.JTabbedPane.add(Component, Object, int)
No se pudo convertir javax.swing.JTabbedPane.add(String, Component)
No se pudo convertir javax.swing.JTabbedPane.addTab(String, Component)
No se pudo convertir javax.swing.JTabbedPane.addTab(String, Icon, Component, String)
No se pudo convertir javax.swing.JTabbedPane.changeEvent
No se pudo convertir javax.swing.JTabbedPane.changeListener
No se pudo convertir javax.swing.JTabbedPane.createChangeListener
No se pudo convertir javax.swing.JTabbedPane.fireStateChanged
No se pudo convertir javax.swing.JTabbedPane.getBackgroundAt
No se pudo convertir javax.swing.JTabbedPane.getBoundsAt
No se pudo convertir javax.swing.JTabbedPane.getDisabledIconAt
No se pudo convertir javax.swing.JTabbedPane.getForegroundAt
No se pudo convertir javax.swing.JTabbedPane.getIconAt
No se pudo convertir javax.swing.JTabbedPane.getModel
No se pudo convertir javax.swing.JTabbedPane.getTabPlacement
No se pudo convertir javax.swing.JTabbedPane.getTabRunCount
No se pudo convertir javax.swing.JTabbedPane.getToolTipText
No se pudo convertir javax.swing.JTabbedPane.getUI
No se pudo convertir javax.swing.JTabbedPane.getUIClassID
No se pudo convertir javax.swing.JTabbedPane.indexOfComponent
No se pudo convertir javax.swing.JTabbedPane.indexOfTab(Icon)
No se pudo convertir javax.swing.JTabbedPane.indexOfTab(String)
No se pudo convertir javax.swing.JTabbedPane.insertTab
No se pudo convertir javax.swing.JTabbedPane.JTabbedPane
No se pudo convertir javax.swing.JTabbedPane.model
No se pudo convertir javax.swing.JTabbedPane.paramString
No se pudo convertir javax.swing.JTabbedPane.remove
No se pudo convertir javax.swing.JTabbedPane.setBackgroundAt
No se pudo convertir javax.swing.JTabbedPane.setComponentAt
No se pudo convertir javax.swing.JTabbedPane.setDisabledIconAt
No se pudo convertir javax.swing.JTabbedPane.setForegroundAt
No se pudo convertir javax.swing.JTabbedPane.setIconAt
No se pudo convertir javax.swing.JTabbedPane.setModel
No se pudo convertir javax.swing.JTabbedPane.setSelectedComponent
No se pudo convertir javax.swing.JTabbedPane.setSelectedIndex
No se pudo convertir javax.swing.JTabbedPane.setTabPlacement
No se pudo convertir javax.swing.JTabbedPane.setToolTipTextAt
No se pudo convertir javax.swing.JTabbedPane.setUI
No se pudo convertir javax.swing.JTabbedPane.tabPlacement
No se pudo convertir javax.swing.JTabbedPane.updateUI
No se pudo convertir javax.swing.JTable
No se pudo convertir javax.swing.JTable.<TipoCambiarTamaño>
No se pudo convertir javax.swing.JTable.addColumnSelectionInterval
No se pudo convertir javax.swing.JTable.addRowSelectionInterval
No se pudo convertir javax.swing.JTable.autoCreateColumnsFromModel
No se pudo convertir javax.swing.JTable.autoResizeMode
No se pudo convertir javax.swing.JTable.cellEditor
No se pudo convertir javax.swing.JTable.cellSelectionEnabled
No se pudo convertir javax.swing.JTable.changeSelection
No se pudo convertir javax.swing.JTable.clearSelection
No se pudo convertir javax.swing.JTable.columnAdded
No se pudo convertir javax.swing.JTable.columnAtPoint
No se pudo convertir javax.swing.JTable.columnMarginChanged
No se pudo convertir javax.swing.JTable.columnMoved
No se pudo convertir javax.swing.JTable.columnRemoved
No se pudo convertir javax.swing.JTable.columnSelectionChanged
No se pudo convertir javax.swing.JTable.configureEnclosingScrollPane
No se pudo convertir javax.swing.JTable.convertColumnIndexToModel
No se pudo convertir javax.swing.JTable.convertColumnIndexToView
No se pudo convertir javax.swing.JTable.createDefaultColumnModel
No se pudo convertir javax.swing.JTable.createDefaultColumnsFromModel
No se pudo convertir javax.swing.JTable.createDefaultEditors
No se pudo convertir javax.swing.JTable.createDefaultRenderers
No se pudo convertir javax.swing.JTable.createDefaultSelectionModel
No se pudo convertir javax.swing.JTable.createDefaultTableHeader
No se pudo convertir javax.swing.JTable.createScrollPaneForTable
No se pudo convertir javax.swing.JTable.defaultEditorsByColumnClass
No se pudo convertir javax.swing.JTable.defaultRenderersByColumnClass
No se pudo convertir javax.swing.JTable.doLayout
No se pudo convertir javax.swing.JTable.editCellAt
No se pudo convertir javax.swing.JTable.editingCanceled
No se pudo convertir javax.swing.JTable.editingColumn
No se pudo convertir javax.swing.JTable.editingRow
No se pudo convertir javax.swing.JTable.editingStopped
No se pudo convertir javax.swing.JTable.editorComp
No se pudo convertir javax.swing.JTable.getAutoCreateColumnsFromModel
No se pudo convertir javax.swing.JTable.getAutoResizeMode
No se pudo convertir javax.swing.JTable.getCellEditor
No se pudo convertir javax.swing.JTable.getCellRect
No se pudo convertir javax.swing.JTable.getCellRenderer
No se pudo convertir javax.swing.JTable.getCellSelectionEnabled
No se pudo convertir javax.swing.JTable.getColumn
No se pudo convertir javax.swing.JTable.getColumnSelectionAllowed
No se pudo convertir javax.swing.JTable.getDefaultEditor
No se pudo convertir javax.swing.JTable.getDefaultRenderer
No se pudo convertir javax.swing.JTable.getEditingColumn
No se pudo convertir javax.swing.JTable.getEditingRow
No se pudo convertir javax.swing.JTable.getEditorComponent
No se pudo convertir javax.swing.JTable.getIntercellSpacing
No se pudo convertir javax.swing.JTable.getPreferredScrollableViewportSize
No se pudo convertir javax.swing.JTable.getRowHeight
No se pudo convertir javax.swing.JTable.getRowHeight(int)
No se pudo convertir javax.swing.JTable.getRowMargin
No se pudo convertir javax.swing.JTable.getRowSelectionAllowed
No se pudo convertir javax.swing.JTable.getScrollableBlockIncrement
No se pudo convertir javax.swing.JTable.getScrollableTracksViewportHeight
No se pudo convertir javax.swing.JTable.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.JTable.getScrollableUnitIncrement
No se pudo convertir javax.swing.JTable.getSelectedColumn
No se pudo convertir javax.swing.JTable.getSelectedColumnCount
No se pudo convertir javax.swing.JTable.getSelectedColumns
No se pudo convertir javax.swing.JTable.getSelectedRowCount
No se pudo convertir javax.swing.JTable.getSelectedRows
No se pudo convertir javax.swing.JTable.getSelectionBackground
No se pudo convertir javax.swing.JTable.getSelectionForeground
No se pudo convertir javax.swing.JTable.getSelectionModel
No se pudo convertir javax.swing.JTable.getShowHorizontalLines
No se pudo convertir javax.swing.JTable.getShowVerticalLines
No se pudo convertir javax.swing.JTable.getTableHeader
No se pudo convertir javax.swing.JTable.getToolTipText
No se pudo convertir javax.swing.JTable.getUI
No se pudo convertir javax.swing.JTable.getUIClassID
No se pudo convertir javax.swing.JTable.gridColor
No se pudo convertir javax.swing.JTable.initializeLocalVars
No se pudo convertir javax.swing.JTable.isCellEditable
No se pudo convertir javax.swing.JTable.isCellSelected
No se pudo convertir javax.swing.JTable.isColumnSelected
No se pudo convertir javax.swing.JTable.isEditing
No se pudo convertir javax.swing.JTable.isFocusTraversable
No se pudo convertir javax.swing.JTable.isManagingFocus
No se pudo convertir javax.swing.JTable.isRowSelected
No se pudo convertir javax.swing.JTable.JTable
No se pudo convertir javax.swing.JTable.JTable(int, int)
No se pudo convertir javax.swing.JTable.JTable(Object[][], Object[])
No se pudo convertir javax.swing.JTable.JTable(TableModel)
No se pudo convertir javax.swing.JTable.JTable(TableModel, TableColumnMode)
No se pudo convertir javax.swing.JTable.JTable(TableModel, TableColumnModel, ListSelectionModel)
No se pudo convertir javax.swing.JTable.JTable(Vector, Vector)
No se pudo convertir javax.swing.JTable.moveColumn
No se pudo convertir javax.swing.JTable.paramString
No se pudo convertir javax.swing.JTable.preferredViewportSize
No se pudo convertir javax.swing.JTable.prepareEditor
No se pudo convertir javax.swing.JTable.prepareRenderer
No se pudo convertir javax.swing.JTable.processKeyBinding
No se pudo convertir javax.swing.JTable.removeColumnSelectionInterval
No se pudo convertir javax.swing.JTable.removeEditor
No se pudo convertir javax.swing.JTable.removeRowSelectionInterval
No se pudo convertir javax.swing.JTable.rowAtPoint
No se pudo convertir javax.swing.JTable.rowHeight
No se pudo convertir javax.swing.JTable.rowMargin
No se pudo convertir javax.swing.JTable.rowSelectionAllowed
No se pudo convertir javax.swing.JTable.selectAll
No se pudo convertir javax.swing.JTable.selectionBackground
No se pudo convertir javax.swing.JTable.selectionForeground
No se pudo convertir javax.swing.JTable.selectionModel
No se pudo convertir javax.swing.JTable.setAutoCreateColumnsFromModel
No se pudo convertir javax.swing.JTable.setAutoResizeMode
No se pudo convertir javax.swing.JTable.setCellEditor
No se pudo convertir javax.swing.JTable.setCellSelectionEnabled
No se pudo convertir javax.swing.JTable.setColumnModel
No se pudo convertir javax.swing.JTable.setColumnSelectionAllowed
No se pudo convertir javax.swing.JTable.setColumnSelectionInterval
No se pudo convertir javax.swing.JTable.setComponentOrientation
No se pudo convertir javax.swing.JTable.setDefaultEditor
No se pudo convertir javax.swing.JTable.setDefaultRenderer
No se pudo convertir javax.swing.JTable.setEditingColumn
No se pudo convertir javax.swing.JTable.setEditingRow
No se pudo convertir javax.swing.JTable.setIntercellSpacing
No se pudo convertir javax.swing.JTable.setPreferredScrollableViewportSize
No se pudo convertir javax.swing.JTable.setRowHeight
No se pudo convertir javax.swing.JTable.setRowMargin
No se pudo convertir javax.swing.JTable.setRowSelectionAllowed
No se pudo convertir javax.swing.JTable.setRowSelectionInterval
No se pudo convertir javax.swing.JTable.setSelectionBackground
No se pudo convertir javax.swing.JTable.setSelectionForeground
No se pudo convertir javax.swing.JTable.setSelectionMode
No se pudo convertir javax.swing.JTable.setSelectionModel
No se pudo convertir javax.swing.JTable.setShowGrid
No se pudo convertir javax.swing.JTable.setShowHorizontalLines
No se pudo convertir javax.swing.JTable.setShowVerticalLines
No se pudo convertir javax.swing.JTable.setTableHeader
No se pudo convertir javax.swing.JTable.setUI
No se pudo convertir javax.swing.JTable.showHorizontalLines
No se pudo convertir javax.swing.JTable.showVerticalLines
No se pudo convertir javax.swing.JTable.sizeColumnsToFit
No se pudo convertir javax.swing.JTable.tableChanged
No se pudo convertir javax.swing.JTable.tableHeader
No se pudo convertir javax.swing.JTable.unconfigureEnclosingScrollPane
No se pudo convertir javax.swing.JTable.updateUI
No se pudo convertir javax.swing.JTable.valueChanged
No se pudo convertir javax.swing.JTextArea.createDefaultModel
No se pudo convertir javax.swing.JTextArea.getColumns
No se pudo convertir javax.swing.JTextArea.getColumnWidth
No se pudo convertir javax.swing.JTextArea.getLineEndOffset
No se pudo convertir javax.swing.JTextArea.getLineOfOffset
No se pudo convertir javax.swing.JTextArea.getLineStartOffset
No se pudo convertir javax.swing.JTextArea.getPreferredScrollableViewportSize
No se pudo convertir javax.swing.JTextArea.getRowHeight
No se pudo convertir javax.swing.JTextArea.getRows
No se pudo convertir javax.swing.JTextArea.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.JTextArea.getScrollableUnitIncrement
No se pudo convertir javax.swing.JTextArea.getTabSize
No se pudo convertir javax.swing.JTextArea.getUIClassID
No se pudo convertir javax.swing.JTextArea.getWrapStyleWord
No se pudo convertir javax.swing.JTextArea.isManagingFocus
No se pudo convertir javax.swing.JTextArea.JTextArea(Document)
No se pudo convertir javax.swing.JTextArea.JTextArea(Document, String, int, int)
No se pudo convertir javax.swing.JTextArea.setColumns
No se pudo convertir javax.swing.JTextArea.setRows
No se pudo convertir javax.swing.JTextArea.setTabSize
No se pudo convertir javax.swing.JTextField.configurePropertiesFromAction
No se pudo convertir javax.swing.JTextField.createActionPropertyChangeListener
No se pudo convertir javax.swing.JTextField.createDefaultModel
No se pudo convertir javax.swing.JTextField.fireActionPerformed
No se pudo convertir javax.swing.JTextField.getAction
No se pudo convertir javax.swing.JTextField.getActions
No se pudo convertir javax.swing.JTextField.getColumns
No se pudo convertir javax.swing.JTextField.getColumnWidth
No se pudo convertir javax.swing.JTextField.getHorizontalVisibility
No se pudo convertir javax.swing.JTextField.getScrollOffset
No se pudo convertir javax.swing.JTextField.getUIClassID
No se pudo convertir javax.swing.JTextField.isValidateRoot
No se pudo convertir javax.swing.JTextField.JTextField(Document, String, int)
No se pudo convertir javax.swing.JTextField.JTextField(int)
No se pudo convertir javax.swing.JTextField.JTextField(String, int)
No se pudo convertir javax.swing.JTextField.notifyAction
No se pudo convertir javax.swing.JTextField.postActionEvent
No se pudo convertir javax.swing.JTextField.scrollRectToVisible
No se pudo convertir javax.swing.JTextField.setActionCommand
No se pudo convertir javax.swing.JTextField.setColumns
No se pudo convertir javax.swing.JTextField.setScrollOffset
No se pudo convertir javax.swing.JTextPane.addStyle
No se pudo convertir javax.swing.JTextPane.createDefaultEditorKit
No se pudo convertir javax.swing.JTextPane.getCharacterAttributes
No se pudo convertir javax.swing.JTextPane.getInputAttributes
No se pudo convertir javax.swing.JTextPane.getLogicalStyle
No se pudo convertir javax.swing.JTextPane.getParagraphAttributes
No se pudo convertir javax.swing.JTextPane.getStyle
No se pudo convertir javax.swing.JTextPane.getStyledDocument
No se pudo convertir javax.swing.JTextPane.getStyledEditorKit
No se pudo convertir javax.swing.JTextPane.getUIClassID
No se pudo convertir javax.swing.JTextPane.insertComponent
No se pudo convertir javax.swing.JTextPane.insertIcon
No se pudo convertir javax.swing.JTextPane.removeStylev
No se pudo convertir javax.swing.JTextPane.setCharacterAttributes
No se pudo convertir javax.swing.JTextPane.setDocument
No se pudo convertir javax.swing.JTextPane.setEditorKit
No se pudo convertir javax.swing.JTextPane.setLogicalStyle
No se pudo convertir javax.swing.JTextPane.setParagraphAttributes
No se pudo convertir javax.swing.JTextPane.setStyledDocument
No se pudo convertir javax.swing.JToggleButton.getUIClassID
No se pudo convertir javax.swing.JToggleButton.JToggleButton
No se pudo convertir javax.swing.JToggleButton.ToggleButtonModel
No se pudo convertir javax.swing.JToggleButton.updateUI
No se pudo convertir javax.swing.JToolBar.addSeparator
No se pudo convertir javax.swing.JToolBar.addSeparator(Dimension)
No se pudo convertir javax.swing.JToolBar.createActionChangeListener
No se pudo convertir javax.swing.JToolBar.getComponentAtIndex
No se pudo convertir javax.swing.JToolBar.getComponentIndex
No se pudo convertir javax.swing.JToolBar.getMargin
No se pudo convertir javax.swing.JToolBar.getOrientation
No se pudo convertir javax.swing.JToolBar.getUI
No se pudo convertir javax.swing.JToolBar.getUIClassID
No se pudo convertir javax.swing.JToolBar.isBorderPainted
No se pudo convertir javax.swing.JToolBar.isFloatable
No se pudo convertir javax.swing.JToolBar.paintBorder
No se pudo convertir javax.swing.JToolBar.Separator
No se pudo convertir javax.swing.JToolBar.setBorderPainted
No se pudo convertir javax.swing.JToolBar.setFloatable
No se pudo convertir javax.swing.JToolBar.setMargin
No se pudo convertir javax.swing.JToolBar.setOrientation
No se pudo convertir javax.swing.JToolBar.setUI
No se pudo convertir javax.swing.JToolBar.updateUI
No se pudo convertir javax.swing.JToolTip.getAccessibleContext
No se pudo convertir javax.swing.JToolTip.getComponent
No se pudo convertir javax.swing.JToolTip.getTipText
No se pudo convertir javax.swing.JToolTip.getUI
No se pudo convertir javax.swing.JToolTip.getUIClassID
No se pudo convertir javax.swing.JToolTip.paramString
No se pudo convertir javax.swing.JToolTip.setComponent
No se pudo convertir javax.swing.JToolTip.setTipText
No se pudo convertir javax.swing.JToolTip.updateUI
No se pudo convertir javax.swing.JTree
No se pudo convertir javax.swing.JTree.<NombrePropiedad>
No se pudo convertir javax.swing.JTree.addSelectionInterval
No se pudo convertir javax.swing.JTree.addSelectionPath
No se pudo convertir javax.swing.JTree.addSelectionPaths
No se pudo convertir javax.swing.JTree.addSelectionRow
No se pudo convertir javax.swing.JTree.addSelectionRows
No se pudo convertir javax.swing.JTree.cancelEditing
No se pudo convertir javax.swing.JTree.cellEditor
No se pudo convertir javax.swing.JTree.cellRenderer
No se pudo convertir javax.swing.JTree.clearToggledPaths
No se pudo convertir javax.swing.JTree.collapsePath
No se pudo convertir javax.swing.JTree.collapseRow
No se pudo convertir javax.swing.JTree.convertValueToText
No se pudo convertir javax.swing.JTree.createTreeModel
No se pudo convertir javax.swing.JTree.createTreeModelListener
No se pudo convertir javax.swing.JTree.DynamicUtilTreeNode
No se pudo convertir javax.swing.JTree.expandPath
No se pudo convertir javax.swing.JTree.expandRow
No se pudo convertir javax.swing.JTree.fireTreeCollapsed
No se pudo convertir javax.swing.JTree.fireTreeExpanded
No se pudo convertir javax.swing.JTree.fireTreeWillCollapse
No se pudo convertir javax.swing.JTree.fireTreeWillExpand
No se pudo convertir javax.swing.JTree.fireValueChanged
No se pudo convertir javax.swing.JTree.getAnchorSelectionPath
No se pudo convertir javax.swing.JTree.getCellEditor
No se pudo convertir javax.swing.JTree.getCellRenderer
No se pudo convertir javax.swing.JTree.getClosestPathForLocation
No se pudo convertir javax.swing.JTree.getClosestRowForLocation
No se pudo convertir javax.swing.JTree.getDefaultTreeModel
No se pudo convertir javax.swing.JTree.getDescendantToggledPaths
No se pudo convertir javax.swing.JTree.getEditingPath
No se pudo convertir javax.swing.JTree.getExpandedDescendants
No se pudo convertir javax.swing.JTree.getExpandsSelectedPaths
No se pudo convertir javax.swing.JTree.getInvokesStopCellEditing
No se pudo convertir javax.swing.JTree.getLeadSelectionPath
No se pudo convertir javax.swing.JTree.getLeadSelectionRow
No se pudo convertir javax.swing.JTree.getMaxSelectionRow
No se pudo convertir javax.swing.JTree.getMinSelectionRow
No se pudo convertir javax.swing.JTree.getModel
No se pudo convertir javax.swing.JTree.getPathBetweenRows
No se pudo convertir javax.swing.JTree.getPathBounds
No se pudo convertir javax.swing.JTree.getPathForLocation
No se pudo convertir javax.swing.JTree.getPathForRow
No se pudo convertir javax.swing.JTree.getPreferredScrollableViewportSize
No se pudo convertir javax.swing.JTree.getRowBounds
No se pudo convertir javax.swing.JTree.getRowCount
No se pudo convertir javax.swing.JTree.getRowForLocation
No se pudo convertir javax.swing.JTree.getRowForPath
No se pudo convertir javax.swing.JTree.getRowHeight
No se pudo convertir javax.swing.JTree.getScrollableBlockIncrement
No se pudo convertir javax.swing.JTree.getScrollableTracksViewportHeight
No se pudo convertir javax.swing.JTree.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.JTree.getScrollableUnitIncrement
No se pudo convertir javax.swing.JTree.getScrollsOnExpand
No se pudo convertir javax.swing.JTree.getSelectionCount
No se pudo convertir javax.swing.JTree.getSelectionModel
No se pudo convertir javax.swing.JTree.getSelectionPath
No se pudo convertir javax.swing.JTree.getSelectionPaths
No se pudo convertir javax.swing.JTree.getSelectionRows
No se pudo convertir javax.swing.JTree.getToggleClickCount
No se pudo convertir javax.swing.JTree.getToolTipText
No se pudo convertir javax.swing.JTree.getUI
No se pudo convertir javax.swing.JTree.getUIClassID
No se pudo convertir javax.swing.JTree.hasBeenExpanded
No se pudo convertir javax.swing.JTree.invokesStopCellEditing
No se pudo convertir javax.swing.JTree.isCollapsed(int)
No se pudo convertir javax.swing.JTree.isCollapsed(TreePath)
No se pudo convertir javax.swing.JTree.isEditing
No se pudo convertir javax.swing.JTree.isExpanded(int)
No se pudo convertir javax.swing.JTree.isExpanded(TreePath)
No se pudo convertir javax.swing.JTree.isFixedRowHeight
No se pudo convertir javax.swing.JTree.isLargeModel
No se pudo convertir javax.swing.JTree.isPathEditable
No se pudo convertir javax.swing.JTree.isPathSelected
No se pudo convertir javax.swing.JTree.isRootVisible
No se pudo convertir javax.swing.JTree.isRowSelected
No se pudo convertir javax.swing.JTree.isVisible
No se pudo convertir javax.swing.JTree.JTree(Hashtable)
No se pudo convertir javax.swing.JTree.JTree(TreeNode, boolean)
No se pudo convertir javax.swing.JTree.largeModel
No se pudo convertir javax.swing.JTree.makeVisible
No se pudo convertir javax.swing.JTree.removeDescendantSelectedPaths
No se pudo convertir javax.swing.JTree.removeDescendantToggledPaths
No se pudo convertir javax.swing.JTree.removeSelectionInterval
No se pudo convertir javax.swing.JTree.removeSelectionPath
No se pudo convertir javax.swing.JTree.removeSelectionPaths
No se pudo convertir javax.swing.JTree.removeSelectionRow
No se pudo convertir javax.swing.JTree.removeSelectionRows
No se pudo convertir javax.swing.JTree.rootVisible
No se pudo convertir javax.swing.JTree.scrollPathToVisible
No se pudo convertir javax.swing.JTree.scrollRowToVisible
No se pudo convertir javax.swing.JTree.scrollsOnExpand
No se pudo convertir javax.swing.JTree.selectionModel
No se pudo convertir javax.swing.JTree.selectionRedirector
No se pudo convertir javax.swing.JTree.setAnchorSelectionPath
No se pudo convertir javax.swing.JTree.setCellEditor
No se pudo convertir javax.swing.JTree.setCellRenderer
No se pudo convertir javax.swing.JTree.setExpandedState
No se pudo convertir javax.swing.JTree.setExpandsSelectedPaths
No se pudo convertir javax.swing.JTree.setInvokesStopCellEditing
No se pudo convertir javax.swing.JTree.setLargeModel
No se pudo convertir javax.swing.JTree.setLeadSelectionPath
No se pudo convertir javax.swing.JTree.setRootVisible
No se pudo convertir javax.swing.JTree.setRowHeight
No se pudo convertir javax.swing.JTree.setScrollsOnExpand
No se pudo convertir javax.swing.JTree.setSelectionInterval
No se pudo convertir javax.swing.JTree.setSelectionModel
No se pudo convertir javax.swing.JTree.setSelectionPath
No se pudo convertir javax.swing.JTree.setSelectionPaths
No se pudo convertir javax.swing.JTree.setSelectionRow
No se pudo convertir javax.swing.JTree.setSelectionRows
No se pudo convertir javax.swing.JTree.setToggleClickCount
No se pudo convertir javax.swing.JTree.setUI
No se pudo convertir javax.swing.JTree.setVisibleRowCount
No se pudo convertir javax.swing.JTree.startEditingAtPath
No se pudo convertir javax.swing.JTree.stopEditing
No se pudo convertir javax.swing.JTree.toggleClickCount
No se pudo convertir javax.swing.JTree.treeDidChange
No se pudo convertir javax.swing.JTree.treeModel
No se pudo convertir javax.swing.JTree.treeModelListener
No se pudo convertir javax.swing.JTree.updateUI
No se pudo convertir javax.swing.JTree.visibleRowCount
No se pudo convertir javax.swing.JViewport
No se pudo convertir javax.swing.JWindow.getGlassPane
No se pudo convertir javax.swing.JWindow.getLayeredPane
No se pudo convertir javax.swing.JWindow.isRootPaneCheckingEnabled
No se pudo convertir javax.swing.JWindow.JWindow(GraphicsConfiguration)
No se pudo convertir javax.swing.JWindow.JWindow(GraphicsConfiguration, Window)
No se pudo convertir javax.swing.JWindow.rootPane
No se pudo convertir javax.swing.JWindow.rootPaneCheckingEnabled
No se pudo convertir javax.swing.JWindow.setContentPane
No se pudo convertir javax.swing.JWindow.setGlassPane
No se pudo convertir javax.swing.JWindow.setLayeredPane
No se pudo convertir javax.swing.JWindow.setRootPane
No se pudo convertir javax.swing.JWindow.setRootPaneCheckingEnabled
No se pudo convertir javax.swing.JWindow.windowInit
No se pudo convertir javax.swing.KeyStroke.getKeyStroke
No se pudo convertir javax.swing.KeyStroke.getKeyStrokeForEvent
No se pudo convertir javax.swing.KeyStroke.isOnKeyRelease
No se pudo convertir javax.swing.KeyStroke.KeyStroke
No se pudo convertir javax.swing.ListCellRenderer
No se pudo convertir javax.swing.ListModel
No se pudo convertir javax.swing.ListModel.addListDataListener
No se pudo convertir javax.swing.ListModel.removeListDataListener
No se pudo convertir javax.swing.ListSelectionModel
No se pudo convertir javax.swing.ListSelectionModel.addListSelectionListener
No se pudo convertir javax.swing.ListSelectionModel.getValueIsAdjusting
No se pudo convertir javax.swing.ListSelectionModel.insertIndexInterval
No se pudo convertir javax.swing.ListSelectionModel.removeListSelectionListener
No se pudo convertir javax.swing.ListSelectionModel.setValueIsAdjusting
No se pudo convertir javax.swing.LookAndFeel
No se pudo convertir javax.swing.MenuElement.menuSelectionChanged
No se pudo convertir javax.swing.MenuSelectionManager
No se pudo convertir javax.swing.OverlayLayout
No se pudo convertir javax.swing.ProgressMonitor
No se pudo convertir javax.swing.ProgressMonitorInputStream
No se pudo convertir javax.swing.Renderer
No se pudo convertir javax.swing.RepaintManager
No se pudo convertir javax.swing.RootPaneContainer.getGlassPane
No se pudo convertir javax.swing.RootPaneContainer.getLayeredPane
No se pudo convertir javax.swing.RootPaneContainer.setContentPane
No se pudo convertir javax.swing.RootPaneContainer.setGlassPane
No se pudo convertir javax.swing.RootPaneContainer.setLayeredPane
No se pudo convertir javax.swing.Scrollable
No se pudo convertir javax.swing.ScrollPaneConstants
No se pudo convertir javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
No se pudo convertir javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
No se pudo convertir javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
No se pudo convertir javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER
No se pudo convertir javax.swing.ScrollPaneLayout
No se pudo convertir javax.swing.ScrollPaneLayout.UIResource
No se pudo convertir javax.swing.SingleSelectionModel
No se pudo convertir javax.swing.SingleSelectionModel.addChangeListener
No se pudo convertir javax.swing.SingleSelectionModel.removeChangeListener
No se pudo convertir javax.swing.SizeRequirements
No se pudo convertir javax.swing.SizeSequence
No se pudo convertir javax.swing.SizeSequence.getIndex
No se pudo convertir javax.swing.SizeSequence.getPosition
No se pudo convertir javax.swing.SizeSequence.getSize
No se pudo convertir javax.swing.SizeSequence.getSizes
No se pudo convertir javax.swing.SizeSequence.insertEntries
No se pudo convertir javax.swing.SizeSequence.removeEntries
No se pudo convertir javax.swing.SizeSequence.setSize
No se pudo convertir javax.swing.SizeSequence.setSizes
No se pudo convertir javax.swing.SizeSequence.SizeSequence
No se pudo convertir javax.swing.SwingConstants
No se pudo convertir javax.swing.SwingUtilities
No se pudo convertir javax.swing.SwingUtilities.getAccessibleAt
No se pudo convertir javax.swing.SwingUtilities.getAncestorNamed
No se pudo convertir javax.swing.SwingUtilities.getDeepestComponentAt
No se pudo convertir javax.swing.SwingUtilities.getLocalBounds
No se pudo convertir javax.swing.SwingUtilities.getRoot
No se pudo convertir javax.swing.SwingUtilities.getRootPane
No se pudo convertir javax.swing.SwingUtilities.getWindowAncestor
No se pudo convertir javax.swing.Timer.fireActionPerformed
No se pudo convertir javax.swing.Timer.getInitialDelay
No se pudo convertir javax.swing.Timer.getListeners
No se pudo convertir javax.swing.Timer.getLogTimers
No se pudo convertir javax.swing.Timer.isCoalesce
No se pudo convertir javax.swing.Timer.restart
No se pudo convertir javax.swing.Timer.setCoalesce
No se pudo convertir javax.swing.Timer.setInitialDelay
No se pudo convertir javax.swing.Timer.setLogTimers
No se pudo convertir javax.swing.ToolTipManager.heavyWeightPopupEnabled
No se pudo convertir javax.swing.ToolTipManager.isLightWeightPopupEnabled
No se pudo convertir javax.swing.ToolTipManager.lightWeightPopupEnabled
No se pudo convertir javax.swing.ToolTipManager.mouseDragged
No se pudo convertir javax.swing.ToolTipManager.mouseEntered
No se pudo convertir javax.swing.ToolTipManager.mouseExited
No se pudo convertir javax.swing.ToolTipManager.mouseMoved
No se pudo convertir javax.swing.ToolTipManager.mousePressed
No se pudo convertir javax.swing.ToolTipManager.registerComponent
No se pudo convertir javax.swing.ToolTipManager.setLightWeightPopupEnabled
No se pudo convertir javax.swing.ToolTipManager.ToolTipManager
No se pudo convertir javax.swing.ToolTipManager.unregisterComponent
No se pudo convertir javax.swing.UIDefaults
No se pudo convertir javax.swing.UIDefaults.ActiveValue
No se pudo convertir javax.swing.UIDefaults.LazyInputMap
No se pudo convertir javax.swing.UIDefaults.LazyValue
No se pudo convertir javax.swing.UIDefaults.ProxyLazyValue
No se pudo convertir javax.swing.UIManager
No se pudo convertir javax.swing.UIManager.LookAndFeelInfo
No se pudo convertir javax.swing.UnsupportedLookAndFeelException
No se pudo convertir javax.swing.ViewportLayout
No se pudo convertir javax.swing.WindowConstants
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.beaninfo


No se pudo convertir javax.swing.beaninfo.SwingBeanInfo
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.border


No se pudo convertir javax.swing.border.AbstractBorder
No se pudo convertir javax.swing.border.BevelBorder
No se pudo convertir javax.swing.border.BevelBorder.<Tipo>
No se pudo convertir javax.swing.border.BevelBorder.BevelBorder
No se pudo convertir javax.swing.border.BevelBorder.bevelType
No se pudo convertir javax.swing.border.BevelBorder.getBevelType
No se pudo convertir javax.swing.border.BevelBorder.getBorderInsets
No se pudo convertir javax.swing.border.BevelBorder.getHighlightInnerColor
No se pudo convertir javax.swing.border.BevelBorder.getHighlightOuterColor
No se pudo convertir javax.swing.border.BevelBorder.getShadowInnerColor
No se pudo convertir javax.swing.border.BevelBorder.getShadowOuterColor
No se pudo convertir javax.swing.border.BevelBorder.highlightInner
No se pudo convertir javax.swing.border.BevelBorder.highlightOuter
No se pudo convertir javax.swing.border.BevelBorder.isBorderOpaque
No se pudo convertir javax.swing.border.BevelBorder.paintBorder
No se pudo convertir javax.swing.border.BevelBorder.paintLoweredBevel
No se pudo convertir javax.swing.border.BevelBorder.paintRaisedBevel
No se pudo convertir javax.swing.border.BevelBorder.shadowInner
No se pudo convertir javax.swing.border.BevelBorder.shadowOuter
No se pudo convertir javax.swing.border.Border
No se pudo convertir javax.swing.border.Border.getBorderInsets
No se pudo convertir javax.swing.border.Border.isBorderOpaque
No se pudo convertir javax.swing.border.Border.paintBorder
No se pudo convertir javax.swing.border.CompoundBorder
No se pudo convertir javax.swing.border.EmptyBorder
No se pudo convertir javax.swing.border.EmptyBorder.bottom
No se pudo convertir javax.swing.border.EmptyBorder.EmptyBorder
No se pudo convertir javax.swing.border.EmptyBorder.getBorderInsets
No se pudo convertir javax.swing.border.EmptyBorder.isBorderOpaque
No se pudo convertir javax.swing.border.EmptyBorder.left
No se pudo convertir javax.swing.border.EmptyBorder.paintBorder
No se pudo convertir javax.swing.border.EmptyBorder.right
No se pudo convertir javax.swing.border.EmptyBorder.top
No se pudo convertir javax.swing.border.EtchedBorder
No se pudo convertir javax.swing.border.BevelBorder.<Tipo>
No se pudo convertir javax.swing.border.EtchedBorder.EtchedBorder
No se pudo convertir javax.swing.border.EtchedBorder.etchType
No se pudo convertir javax.swing.border.EtchedBorder.getBorderInsets
No se pudo convertir javax.swing.border.EtchedBorder.getEtchType
No se pudo convertir javax.swing.border.EtchedBorder.getHighlightColor
No se pudo convertir javax.swing.border.EtchedBorder.getShadowColor
No se pudo convertir javax.swing.border.EtchedBorder.highlight
No se pudo convertir javax.swing.border.EtchedBorder.isBorderOpaque
No se pudo convertir javax.swing.border.EtchedBorder.paintBorder
No se pudo convertir javax.swing.border.EtchedBorder.shadow
No se pudo convertir javax.swing.border.LineBorder
No se pudo convertir javax.swing.border.LineBorder.createBlackLineBorder
No se pudo convertir javax.swing.border.LineBorder.createGrayLineBorder
No se pudo convertir javax.swing.border.LineBorder.getBorderInsets
No se pudo convertir javax.swing.border.LineBorder.getLineColor
No se pudo convertir javax.swing.border.LineBorder.getRoundedCorners
No se pudo convertir javax.swing.border.LineBorder.getThickness
No se pudo convertir javax.swing.border.LineBorder.isBorderOpaque
No se pudo convertir javax.swing.border.LineBorder.LineBorder
No se pudo convertir javax.swing.border.LineBorder.lineColor
No se pudo convertir javax.swing.border.LineBorder.paintBorder
No se pudo convertir javax.swing.border.LineBorder.roundedCorners
No se pudo convertir javax.swing.border.LineBorder.thickness
No se pudo convertir javax.swing.border.MatteBorder
No se pudo convertir javax.swing.border.SoftBevelBorder
No se pudo convertir javax.swing.border.SoftBevelBorder.getBorderInsets
No se pudo convertir javax.swing.border.SoftBevelBorder.isBorderOpaque
No se pudo convertir javax.swing.border.SoftBevelBorder.paintBorder
No se pudo convertir javax.swing.border.SoftBevelBorder.SoftBevelBorder
No se pudo convertir javax.swing.border.TitledBorder
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de Javax.swing.colorchooser


No se pudo convertir javax.swing.colorchooser.AbstractColorChooserPanel
No se pudo convertir javax.swing.colorchooser.ColorChooserComponentFactory
No se pudo convertir javax.swing.colorchooser.ColorSelectionModel
No se pudo convertir javax.swing.colorchooser.DefaultColorSelectionModel
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.event


No se pudo convertir javax.swing.event.AncestorEvent
No se pudo convertir javax.swing.event.CaretEvent
No se pudo convertir javax.swing.event.DocumentEvent
No se pudo convertir javax.swing.event.DocumentEvent.ElementChange
No se pudo convertir javax.swing.event.DocumentEvent.EventType
No se pudo convertir javax.swing.event.EventListenerList.getListenerCount
No se pudo convertir javax.swing.event.EventListenerList.getListeners
No se pudo convertir javax.swing.event.HyperlinkEvent.EventType
No se pudo convertir javax.swing.event.HyperlinkEvent.getDescription
No se pudo convertir javax.swing.event.HyperlinkEvent.getEventType
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_ACTIVATED
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_CLOSED
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_CLOSING
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_DEICONIFIED
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_FIRST
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_ICONIFIED
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_LAST
No se pudo convertir javax.swing.event.InternalFrameEvent.INTERNAL_FRAME_OPENED
No se pudo convertir javax.swing.event.ListDataEvent
No se pudo convertir javax.swing.event.ListSelectionEvent.getFirstIndex
No se pudo convertir javax.swing.event.ListSelectionEvent.getLastIndex
No se pudo convertir javax.swing.event.ListSelectionEvent.getValueIsAdjusting
No se pudo convertir javax.swing.event.MenuDragMouseEvent
No se pudo convertir javax.swing.event.MenuKeyEvent
No se pudo convertir javax.swing.event.SwingPropertyChangeSupport
No se pudo convertir javax.swing.event.TableColumnModelEvent.fromIndex
No se pudo convertir javax.swing.event.TableColumnModelEvent.getFromIndex
No se pudo convertir javax.swing.event.TableColumnModelEvent.getToIndex
No se pudo convertir javax.swing.event.TableColumnModelEvent.TableColumnModelEvent
No se pudo convertir javax.swing.event.TableColumnModelEvent.toIndex
No se pudo convertir javax.swing.event.TableModelEvent.ALL_COLUMNS
No se pudo convertir javax.swing.event.TableModelEvent.column
No se pudo convertir javax.swing.event.TableModelEvent.firstRow
No se pudo convertir javax.swing.event.TableModelEvent.getColumn
No se pudo convertir javax.swing.event.TableModelEvent.getFirstRow
No se pudo convertir javax.swing.event.TableModelEvent.getLastRow
No se pudo convertir javax.swing.event.TableModelEvent.HEADER_ROW
No se pudo convertir javax.swing.event.TableModelEvent.lastRow
No se pudo convertir javax.swing.event.TableModelEvent.TableModelEvent
No se pudo convertir javax.swing.event.TreeExpansionEvent.getPath
No se pudo convertir javax.swing.event.TreeExpansionEvent.path
No se pudo convertir javax.swing.event.TreeExpansionEvent.TreeExpansionEvent
No se pudo convertir javax.swing.event.TreeModelEvent
No se pudo convertir javax.swing.event.TreeSelectionEvent.areNew
No se pudo convertir javax.swing.event.TreeSelectionEvent.cloneWithSource
No se pudo convertir javax.swing.event.TreeSelectionEvent.getNewLeadSelectionPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.getOldLeadSelectionPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.getPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.getPaths
No se pudo convertir javax.swing.event.TreeSelectionEvent.isAddedPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.newLeadSelectionPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.oldLeadSelectionPath
No se pudo convertir javax.swing.event.TreeSelectionEvent.paths
No se pudo convertir javax.swing.event.TreeSelectionEvent.TreeSelectionEvent
No se pudo convertir javax.swing.event.UndoableEditEvent
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.filechooser


No se pudo convertir javax.swing.filechooser.FileFilter
No se pudo convertir javax.swing.filechooser.FileSystemView.createNewFolder
No se pudo convertir javax.swing.filechooser.FileSystemView.FileSystemView
No se pudo convertir javax.swing.filechooser.FileSystemView.getFileSystemView
No se pudo convertir javax.swing.filechooser.FileSystemView.getHomeDirectory
No se pudo convertir javax.swing.filechooser.FileSystemView.getRoots
No se pudo convertir javax.swing.filechooser.FileSystemView.isRoot
No se pudo convertir javax.swing.filechooser.FileView
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.table


No se pudo convertir javax.swing.table.AbstractTableModel
No se pudo convertir javax.swing.table.AbstractTableModel.addTableModelListener
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableCellUpdated
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableChanged
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableDataChanged
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableRowsDeleted
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableRowsInserted
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableRowsUpdated
No se pudo convertir javax.swing.table.AbstractTableModel.fireTableStructureChanged
No se pudo convertir javax.swing.table.AbstractTableModel.getListeners
No se pudo convertir javax.swing.table.AbstractTableModel.listenerList
No se pudo convertir javax.swing.table.AbstractTableModel.removeTableModelListener
No se pudo convertir javax.swing.table.DefaultTableCellRenderer
No se pudo convertir javax.swing.table.DefaultTableCellRenderer.UIResource
No se pudo convertir javax.swing.table.DefaultTableColumnModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.addColumnModelListener
No se pudo convertir javax.swing.table.DefaultTableColumnModel.changeEvent
No se pudo convertir javax.swing.table.DefaultTableColumnModel.columnMargin
No se pudo convertir javax.swing.table.DefaultTableColumnModel.columnSelectionAllowed
No se pudo convertir javax.swing.table.DefaultTableColumnModel.createSelectionModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.DefaultTableColumnModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.fireColumnAdded
No se pudo convertir javax.swing.table.DefaultTableColumnModel.fireColumnMarginChanged
No se pudo convertir javax.swing.table.DefaultTableColumnModel.fireColumnMoved
No se pudo convertir javax.swing.table.DefaultTableColumnModel.fireColumnRemoved
No se pudo convertir javax.swing.table.DefaultTableColumnModel.fireColumnSelectionChanged
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getColumnIndexAtX
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getColumnMargin
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getColumnSelectionAllowed
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getListeners
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getSelectedColumnCount
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getSelectedColumns
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getSelectionModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.getTotalColumnWidth
No se pudo convertir javax.swing.table.DefaultTableColumnModel.listenerList
No se pudo convertir javax.swing.table.DefaultTableColumnModel.moveColumn
No se pudo convertir javax.swing.table.DefaultTableColumnModel.propertyChange
No se pudo convertir javax.swing.table.DefaultTableColumnModel.recalcWidthCache
No se pudo convertir javax.swing.table.DefaultTableColumnModel.removeColumnModelListener
No se pudo convertir javax.swing.table.DefaultTableColumnModel.selectionModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.setColumnMargin
No se pudo convertir javax.swing.table.DefaultTableColumnModel.setColumnSelectionAllowed
No se pudo convertir javax.swing.table.DefaultTableColumnModel.setSelectionModel
No se pudo convertir javax.swing.table.DefaultTableColumnModel.tableColumns
No se pudo convertir javax.swing.table.DefaultTableColumnModel.totalColumnWidth
No se pudo convertir javax.swing.table.DefaultTableColumnModel.valueChanged
No se pudo convertir javax.swing.table.DefaultTableModel
No se pudo convertir javax.swing.table.DefaultTableModel.addColumn (Object, Object[])
No se pudo convertir javax.swing.table.DefaultTableModel.addColumn (Object, Vector)
No se pudo convertir javax.swing.table.DefaultTableModel.columnIdentifiers
No se pudo convertir javax.swing.table.DefaultTableModel.dataVector
No se pudo convertir javax.swing.table.DefaultTableModel.DefaultTableModel (int, int)
No se pudo convertir javax.swing.table.DefaultTableModel.DefaultTableModel (Object[], int)
No se pudo convertir javax.swing.table.DefaultTableModel.DefaultTableModel (Object[], Object[])
No se pudo convertir javax.swing.table.DefaultTableModel.DefaultTableModel (Vector, int)
No se pudo convertir javax.swing.table.DefaultTableModel.DefaultTableModel (Vector, Vector)
No se pudo convertir javax.swing.table.DefaultTableModel.getDataVector
No se pudo convertir javax.swing.table.DefaultTableModel.insertRow
No se pudo convertir javax.swing.table.DefaultTableModel.isCellEditable
No se pudo convertir javax.swing.table.DefaultTableModel.moveRow
No se pudo convertir javax.swing.table.DefaultTableModel.newDataAvailable
No se pudo convertir javax.swing.table.DefaultTableModel.newRowsAdded
No se pudo convertir javax.swing.table.DefaultTableModel.rowsRemoved
No se pudo convertir javax.swing.table.DefaultTableModel.setColumnCount
No se pudo convertir javax.swing.table.DefaultTableModel.setColumnIdentifiers
No se pudo convertir javax.swing.table.DefaultTableModel.setDataVector
No se pudo convertir javax.swing.table.DefaultTableModel.setNumRows
No se pudo convertir javax.swing.table.DefaultTableModel.setRowCount
No se pudo convertir javax.swing.table.JTableHeader
No se pudo convertir javax.swing.table.TableCellEditor
No se pudo convertir javax.swing.table.TableCellRenderer
No se pudo convertir javax.swing.table.TableColumn
No se pudo convertir javax.swing.table.TableColumn.<NombrePropiedad>
No se pudo convertir javax.swing.table.TableColumn.addPropertyChangeListener
No se pudo convertir javax.swing.table.TableColumn.disableResizedPosting
No se pudo convertir javax.swing.table.TableColumn.enableResizedPosting
No se pudo convertir javax.swing.table.TableColumn.getHeaderValue
No se pudo convertir javax.swing.table.TableColumn.getIdentifier
No se pudo convertir javax.swing.table.TableColumn.getMaxWidth
No se pudo convertir javax.swing.table.TableColumn.getMinWidth
No se pudo convertir javax.swing.table.TableColumn.getModelIndex
No se pudo convertir javax.swing.table.TableColumn.getPreferredWidth
No se pudo convertir javax.swing.table.TableColumn.getResizable
No se pudo convertir javax.swing.table.TableColumn.getWidth
No se pudo convertir javax.swing.table.TableColumn.headerValue
No se pudo convertir javax.swing.table.TableColumn.identifier
No se pudo convertir javax.swing.table.TableColumn.isResizable
No se pudo convertir javax.swing.table.TableColumn.maxWidth
No se pudo convertir javax.swing.table.TableColumn.minWidth
No se pudo convertir javax.swing.table.TableColumn.modelIndex
No se pudo convertir javax.swing.table.TableColumn.removePropertyChangeListener
No se pudo convertir javax.swing.table.TableColumn.resizedPostingDisableCount
No se pudo convertir javax.swing.table.TableColumn.setHeaderValue
No se pudo convertir javax.swing.table.TableColumn.setIdentifier
No se pudo convertir javax.swing.table.TableColumn.setMaxWidth
No se pudo convertir javax.swing.table.TableColumn.setMinWidth
No se pudo convertir javax.swing.table.TableColumn.setModelIndex
No se pudo convertir javax.swing.table.TableColumn.setPreferredWidth
No se pudo convertir javax.swing.table.TableColumn.setResizable
No se pudo convertir javax.swing.table.TableColumn.setWidth
No se pudo convertir javax.swing.table.TableColumn.sizeWidthToFit
No se pudo convertir javax.swing.table.TableColumn.TableColumn
No se pudo convertir javax.swing.table.TableColumn.width
No se pudo convertir javax.swing.table.TableColumnModel
No se pudo convertir javax.swing.table.TableColumnModel.getColumnIndexAtX
No se pudo convertir javax.swing.table.TableColumnModel.getColumnMargin
No se pudo convertir javax.swing.table.TableColumnModel.addColumnModelListener
No se pudo convertir javax.swing.table.TableColumnModel.getColumnSelectionAllowed
No se pudo convertir javax.swing.table.TableColumnModel.getSelectedColumnCount
No se pudo convertir javax.swing.table.TableColumnModel.getSelectedColumns
No se pudo convertir javax.swing.table.TableColumnModel.getSelectionModel
No se pudo convertir javax.swing.table.TableColumnModel.getTotalColumnWidth
No se pudo convertir javax.swing.table.TableColumnModel.moveColumn
No se pudo convertir javax.swing.table.TableColumnModel.removeColumnModelListener
No se pudo convertir javax.swing.table.TableColumnModel.setColumnMargin
No se pudo convertir javax.swing.table.TableColumnModel.setColumnSelectionAllowed
No se pudo convertir javax.swing.table.TableColumnModel.setSelectionModel
No se pudo convertir javax.swing.table.TableModel
No se pudo convertir javax.swing.table.TableModel.addTableModelListener
No se pudo convertir javax.swing.table.TableModel.removeTableModelListener
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.text


No se pudo convertir javax.swing.text.AbstractDocument
No se pudo convertir javax.swing.text.AbstractDocument.AbstractElement
No se pudo convertir javax.swing.text.AbstractDocument.AttributeContext
No se pudo convertir javax.swing.text.AbstractDocument.BranchElement
No se pudo convertir javax.swing.text.AbstractDocument.Content
No se pudo convertir javax.swing.text.AbstractDocument.DefaultDocumentEvent
No se pudo convertir javax.swing.text.AbstractDocument.ElementEdit
No se pudo convertir javax.swing.text.AbstractDocument.LeafElement
No se pudo convertir javax.swing.text.AbstractWriter.AbstractWriter
No se pudo convertir javax.swing.text.AbstractWriter.decrIndent
No se pudo convertir javax.swing.text.AbstractWriter.getCanWrapLines
No se pudo convertir javax.swing.text.AbstractWriter.getCurrentLineLength
No se pudo convertir javax.swing.text.AbstractWriter.getDocument
No se pudo convertir javax.swing.text.AbstractWriter.getElementIterator
No se pudo convertir javax.swing.text.AbstractWriter.getEndOffset
No se pudo convertir javax.swing.text.AbstractWriter.getIndentLevel
No se pudo convertir javax.swing.text.AbstractWriter.getIndentSpace
No se pudo convertir javax.swing.text.AbstractWriter.getLineLength
No se pudo convertir javax.swing.text.AbstractWriter.getStartOffset
No se pudo convertir javax.swing.text.AbstractWriter.getText
No se pudo convertir javax.swing.text.AbstractWriter.getWriter
No se pudo convertir javax.swing.text.AbstractWriter.incrIndent
No se pudo convertir javax.swing.text.AbstractWriter.indent
No se pudo convertir javax.swing.text.AbstractWriter.inRange
No se pudo convertir javax.swing.text.AbstractWriter.isLineEmpty
No se pudo convertir javax.swing.text.AbstractWriter.NEWLINE
No se pudo convertir javax.swing.text.AbstractWriter.setCanWrapLines
No se pudo convertir javax.swing.text.AbstractWriter.setCurrentLineLength
No se pudo convertir javax.swing.text.AbstractWriter.setIndentSpace
No se pudo convertir javax.swing.text.AbstractWriter.setLineLength
No se pudo convertir javax.swing.text.AbstractWriter.text
No se pudo convertir javax.swing.text.AbstractWriter.writeAttributes
No se pudo convertir javax.swing.text.AsyncBoxView
No se pudo convertir javax.swing.text.AsyncBoxView.ChildLocator
No se pudo convertir javax.swing.text.AsyncBoxView.ChildState
No se pudo convertir javax.swing.text.AttributeSet.CharacterAttribute
No se pudo convertir javax.swing.text.AttributeSet.ColorAttribute
No se pudo convertir javax.swing.text.AttributeSet.copyAttributes
No se pudo convertir javax.swing.text.AttributeSet.FontAttribute
No se pudo convertir javax.swing.text.AttributeSet.getResolveParent
No se pudo convertir javax.swing.text.AttributeSet.isDefined
No se pudo convertir javax.swing.text.AttributeSet.isEqual
No se pudo convertir javax.swing.text.AttributeSet.NameAttribute
No se pudo convertir javax.swing.text.AttributeSet.ParagraphAttribute
No se pudo convertir javax.swing.text.AttributeSet.ResolveAttribute
No se pudo convertir javax.swing.text.BadLocationException
No se pudo convertir javax.swing.text.BadLocationException.offsetRequested
No se pudo convertir javax.swing.text.BoxView
No se pudo convertir javax.swing.text.Caret
No se pudo convertir javax.swing.text.ChangedCharSetException
No se pudo convertir javax.swing.text.ChangedCharSetException.keyEqualsCharSet
No se pudo convertir javax.swing.text.ComponentView
No se pudo convertir javax.swing.text.CompositeView
No se pudo convertir javax.swing.text.DefaultCaret
No se pudo convertir javax.swing.text.DefaultEditorKit
No se pudo convertir javax.swing.text.DefaultEditorKit.BeepAction
No se pudo convertir javax.swing.text.DefaultEditorKit.CopyAction
No se pudo convertir javax.swing.text.DefaultEditorKit.CutAction
No se pudo convertir javax.swing.text.DefaultEditorKit.DefaultKeyTypedAction
No se pudo convertir javax.swing.text.DefaultEditorKit.InsertBreakAction
No se pudo convertir javax.swing.text.DefaultEditorKit.InsertContentAction
No se pudo convertir javax.swing.text.DefaultEditorKit.InsertTabAction
No se pudo convertir javax.swing.text.DefaultEditorKit.PasteAction
No se pudo convertir javax.swing.text.DefaultHighlighter
No se pudo convertir javax.swing.text.DefaultHighlighter.DefaultHighlightPainter
No se pudo convertir javax.swing.text.DefaultStyledDocument
No se pudo convertir javax.swing.text.DefaultStyledDocument.AttributeUndoableEdit
No se pudo convertir javax.swing.text.DefaultStyledDocument.ElementBuffer
No se pudo convertir javax.swing.text.DefaultStyledDocument.ElementSpec
No se pudo convertir javax.swing.text.DefaultTextUI
No se pudo convertir javax.swing.text.Document
No se pudo convertir javax.swing.text.EditorKit
No se pudo convertir javax.swing.text.Element
No se pudo convertir javax.swing.text.ElementIterator
No se pudo convertir javax.swing.text.FieldView
No se pudo convertir javax.swing.text.FlowView
No se pudo convertir javax.swing.text.FlowView.FlowStrategy
No se pudo convertir javax.swing.text.GapContent
No se pudo convertir javax.swing.text.GlyphView
No se pudo convertir javax.swing.text.GlyphView.GlyphPainter
No se pudo convertir javax.swing.text.Highlighter
No se pudo convertir javax.swing.text.Highlighter.Highlight
No se pudo convertir javax.swing.text.Highlighter.HighlightPainter
No se pudo convertir javax.swing.text.html.BlockView
No se pudo convertir javax.swing.text.html.CSS
No se pudo convertir javax.swing.text.html.CSS.Attribute.<NombreAtributo>
No se pudo convertir javax.swing.text.html.CSS.Attribute.getDefaultValue
No se pudo convertir javax.swing.text.html.CSS.Attribute.isInherited
No se pudo convertir javax.swing.text.html.FormView
No se pudo convertir javax.swing.text.html.HTML.Attribute.<NombreAtributo>
No se pudo convertir javax.swing.text.html.HTML.Tag.<NombreElemento>
No se pudo convertir javax.swing.text.html.HTML.Tag.breaksFlow
No se pudo convertir javax.swing.text.html.HTML.Tag.isBlock
No se pudo convertir javax.swing.text.html.HTML.Tag.isPreformatted
No se pudo convertir javax.swing.text.html.HTML.Tag.Tag
No se pudo convertir javax.swing.text.html.HTML.UnknownTag
No se pudo convertir javax.swing.text.html.HTMLDocument.AdditionalComments
No se pudo convertir javax.swing.text.html.HTMLDocument.BlockElement.BlockElement
No se pudo convertir javax.swing.text.html.HTMLDocument.BlockElement.getResolveParent
No se pudo convertir javax.swing.text.html.HTMLDocument.create
No se pudo convertir javax.swing.text.html.HTMLDocument.createBranchElement
No se pudo convertir javax.swing.text.html.HTMLDocument.createDefaultRoot
No se pudo convertir javax.swing.text.html.HTMLDocument.createLeafElement
No se pudo convertir javax.swing.text.html.HTMLDocument.fireChangedUpdate
No se pudo convertir javax.swing.text.html.HTMLDocument.fireUndoableEditUpdate
No se pudo convertir javax.swing.text.html.HTMLDocument.getElement
No se pudo convertir javax.swing.text.html.HTMLDocument.getParser
No se pudo convertir javax.swing.text.html.HTMLDocument.getPreservesUnknownTags
No se pudo convertir javax.swing.text.html.HTMLDocument.getReader
No se pudo convertir javax.swing.text.html.HTMLDocument.getTokenThreshold
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLDocument
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLDocument(AbstractDocumentContent, StyleSheet)
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLDocument(StyleSheet)
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.BlockAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.CharacterAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.FormAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.HiddenAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.IsindexAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.PreAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.SpecialAction
No se pudo convertir javax.swing.text.html.HTMLDocument.HTMLReader.TagAction
No se pudo convertir javax.swing.text.html.HTMLDocument.insert
No se pudo convertir javax.swing.text.html.HTMLDocument.insertAfterEnd
No se pudo convertir javax.swing.text.html.HTMLDocument.insertAfterStart
No se pudo convertir javax.swing.text.html.HTMLDocument.insertBeforeEnd
No se pudo convertir javax.swing.text.html.HTMLDocument.insertBeforeStart
No se pudo convertir javax.swing.text.html.HTMLDocument.insertUpdate
No se pudo convertir javax.swing.text.html.HTMLDocument.Iterator.getAttributes
No se pudo convertir javax.swing.text.html.HTMLDocument.Iterator.getEndOffset
No se pudo convertir javax.swing.text.html.HTMLDocument.Iterator.getStartOffset
No se pudo convertir javax.swing.text.html.HTMLDocument.Iterator.isValid
No se pudo convertir javax.swing.text.html.HTMLDocument.Iterator.Iterator
No se pudo convertir javax.swing.text.html.HTMLDocument.processHTMLFrameHyperlinkEvent
No se pudo convertir javax.swing.text.html.HTMLDocument.RunElement
No se pudo convertir javax.swing.text.html.HTMLDocument.setInnerHTML
No se pudo convertir javax.swing.text.html.HTMLDocument.setOuterHTML
No se pudo convertir javax.swing.text.html.HTMLDocument.setParagraphAttributes
No se pudo convertir javax.swing.text.html.HTMLDocument.setParser
No se pudo convertir javax.swing.text.html.HTMLDocument.setPreservesUnknownTags
No se pudo convertir javax.swing.text.html.HTMLDocument.setTokenThreshold
No se pudo convertir javax.swing.text.html.HTMLEditorKit
No se pudo convertir javax.swing.text.html.HTMLEditorKit.HTMLFactory
No se pudo convertir javax.swing.text.html.HTMLEditorKit.HTMLTextAction
No se pudo convertir javax.swing.text.html.HTMLEditorKit.InsertHTMLTextAction
No se pudo convertir javax.swing.text.html.HTMLEditorKit.InsertHTMLTextAction.html
No se pudo convertir javax.swing.text.html.HTMLEditorKit.LinkController
No se pudo convertir javax.swing.text.html.HTMLEditorKit.Parser
No se pudo convertir javax.swing.text.html.HTMLEditorKit.ParserCallback
No se pudo convertir javax.swing.text.html.HTMLFrameHyperlinkEvent
No se pudo convertir javax.swing.text.html.HTMLWriter
No se pudo convertir javax.swing.text.html.HTMLWriter.closeOutUnwantedEmbeddedTags
No se pudo convertir javax.swing.text.html.HTMLWriter.comment
No se pudo convertir javax.swing.text.html.HTMLWriter.emptyTag
No se pudo convertir javax.swing.text.html.HTMLWriter.endTag
No se pudo convertir javax.swing.text.html.HTMLWriter.HTMLWriter
No se pudo convertir javax.swing.text.html.HTMLWriter.isBlockTag
No se pudo convertir javax.swing.text.html.HTMLWriter.matchNameAttribute
No se pudo convertir javax.swing.text.html.HTMLWriter.selectContent
No se pudo convertir javax.swing.text.html.HTMLWriter.startTag
No se pudo convertir javax.swing.text.html.HTMLWriter.synthesizedElement
No se pudo convertir javax.swing.text.html.HTMLWriter.text
No se pudo convertir javax.swing.text.html.HTMLWriter.textAreaContent
No se pudo convertir javax.swing.text.html.HTMLWriter.writeEmbeddedTags
No se pudo convertir javax.swing.text.html.InlineView
No se pudo convertir javax.swing.text.html.ListView
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.endFontTag
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.inFontTag
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.isText
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.MinimalHTMLWriter
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.startFontTag
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.text
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.write
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeComponent
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeContent
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeHeader
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeHTMLTags
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeImage
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeLeaf
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeNonHTMLAttributes
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeStartParagraph
No se pudo convertir javax.swing.text.html.MinimalHTMLWriter.writeStyles
No se pudo convertir javax.swing.text.html.ObjectView
No se pudo convertir javax.swing.text.html.Option.getAttributes
No se pudo convertir javax.swing.text.html.Option.Option
No se pudo convertir javax.swing.text.html.ParagraphView
No se pudo convertir javax.swing.text.html.parser.AttributeList
No se pudo convertir javax.swing.text.html.parser.ContentModel
No se pudo convertir javax.swing.text.html.parser.DocumentParser
No se pudo convertir javax.swing.text.html.parser.DTD
No se pudo convertir javax.swing.text.html.parser.DTDConstants
No se pudo convertir javax.swing.text.html.parser.Element
No se pudo convertir javax.swing.text.html.parser.Entity
No se pudo convertir javax.swing.text.html.parser.Parser
No se pudo convertir javax.swing.text.html.parser.ParserDelegator
No se pudo convertir javax.swing.text.html.parser.TagElement
No se pudo convertir javax.swing.text.html.StyleSheet.addAttribute
No se pudo convertir javax.swing.text.html.StyleSheet.addAttributes
No se pudo convertir javax.swing.text.html.StyleSheet.addCSSAttribute
No se pudo convertir javax.swing.text.html.StyleSheet.addCSSAttributeFromHTML
No se pudo convertir javax.swing.text.html.StyleSheet.addStyleSheet
No se pudo convertir javax.swing.text.html.StyleSheet.BoxPainter
No se pudo convertir javax.swing.text.html.StyleSheet.createLargeAttributeSet
No se pudo convertir javax.swing.text.html.StyleSheet.createSmallAttributeSet
No se pudo convertir javax.swing.text.html.StyleSheet.getBackground
No se pudo convertir javax.swing.text.html.StyleSheet.getBase
No se pudo convertir javax.swing.text.html.StyleSheet.getBoxPainter
No se pudo convertir javax.swing.text.html.StyleSheet.getDeclaration
No se pudo convertir javax.swing.text.html.StyleSheet.getFont
No se pudo convertir javax.swing.text.html.StyleSheet.getForeground
No se pudo convertir javax.swing.text.html.StyleSheet.getIndexOfSize
No se pudo convertir javax.swing.text.html.StyleSheet.getListPainter
No se pudo convertir javax.swing.text.html.StyleSheet.getPointSize(int)
No se pudo convertir javax.swing.text.html.StyleSheet.getPointSize(String)
No se pudo convertir javax.swing.text.html.StyleSheet.getRule
No se pudo convertir javax.swing.text.html.StyleSheet.getStyleSheets
No se pudo convertir javax.swing.text.html.StyleSheet.getViewAttributes
No se pudo convertir javax.swing.text.html.StyleSheet.importStyleSheet
No se pudo convertir javax.swing.text.html.StyleSheet.ListPainter
No se pudo convertir javax.swing.text.html.StyleSheet.loadRules
No se pudo convertir javax.swing.text.html.StyleSheet.removeAttribute
No se pudo convertir javax.swing.text.html.StyleSheet.removeAttributes
No se pudo convertir javax.swing.text.html.StyleSheet.removeStyle
No se pudo convertir javax.swing.text.html.StyleSheet.removeStyleSheet
No se pudo convertir javax.swing.text.html.StyleSheet.setBase
No se pudo convertir javax.swing.text.html.StyleSheet.setBaseFontSize(int)
No se pudo convertir javax.swing.text.html.StyleSheet.setBaseFontSize(String)
No se pudo convertir javax.swing.text.html.StyleSheet.stringToColor
No se pudo convertir javax.swing.text.html.StyleSheet.StyleSheet
No se pudo convertir javax.swing.text.html.StyleSheet.translateHTMLToCSS
No se pudo convertir javax.swing.text.IconView
No se pudo convertir javax.swing.text.MutableAttributeSet.addAttributes
No se pudo convertir javax.swing.text.MutableAttributeSet.removeAttributes(AttributeSet)
No se pudo convertir javax.swing.text.MutableAttributeSet.removeAttributes(Enumeration)
No se pudo convertir javax.swing.text.MutableAttributeSet.setResolveParent
No se pudo convertir javax.swing.text.JTextComponent.AccessibleJTextComponent
No se pudo convertir javax.swing.text.JTextComponent.addCaretListener
No se pudo convertir javax.swing.text.JTextComponent.addInputMethodListener
No se pudo convertir javax.swing.text.JTextComponent.addKeymap
No se pudo convertir javax.swing.text.JTextComponent.DEFAULT_KEYMAP
No se pudo convertir javax.swing.text.JTextComponent.fireCaretUpdate
No se pudo convertir javax.swing.text.JTextComponent.FOCUS_ACCELERATOR_KEY
No se pudo convertir javax.swing.text.JTextComponent.getActions
No se pudo convertir javax.swing.text.JTextComponent.getCaret
No se pudo convertir javax.swing.text.JTextComponent.getCaretColor
No se pudo convertir javax.swing.text.JTextComponent.getDisabledTextColor
No se pudo convertir javax.swing.text.JTextComponent.getDocument
No se pudo convertir javax.swing.text.JTextComponent.getFocusAccelerator
No se pudo convertir javax.swing.text.JTextComponent.getHighlighter
No se pudo convertir javax.swing.text.JTextComponent.getInputMethodRequests
No se pudo convertir javax.swing.text.JTextComponent.getKeymap
No se pudo convertir javax.swing.text.JTextComponent.getKeymap(String)
No se pudo convertir javax.swing.text.JTextComponent.getMargin
No se pudo convertir javax.swing.text.JTextComponent.getPreferredScrollableViewportSize
No se pudo convertir javax.swing.text.JTextComponent.getScrollableBlockIncrement
No se pudo convertir javax.swing.text.JTextComponent.getScrollableTracksViewportHeight
No se pudo convertir javax.swing.text.JTextComponent.getScrollableTracksViewportWidth
No se pudo convertir javax.swing.text.JTextComponent.getScrollableUnitIncrement
No se pudo convertir javax.swing.text.JTextComponent.getSelectedTextColor
No se pudo convertir javax.swing.text.JTextComponent.getSelectionColor
No se pudo convertir javax.swing.text.JTextComponent.getUI
No se pudo convertir javax.swing.text.JTextComponent.loadKeymap
No se pudo convertir javax.swing.text.JTextComponent.modelToView
No se pudo convertir javax.swing.text.JTextComponent.processInputMethodEvent
No se pudo convertir javax.swing.text.JTextComponent.processKeyEvent
No se pudo convertir javax.swing.text.JTextComponent.read
No se pudo convertir javax.swing.text.JTextComponent.removeCaretListener
No se pudo convertir javax.swing.text.JTextComponent.removeKeymap
No se pudo convertir javax.swing.text.JTextComponent.setCaret
No se pudo convertir javax.swing.text.JTextComponent.setCaretColor
No se pudo convertir javax.swing.text.JTextComponent.setDisabledTextColor
No se pudo convertir javax.swing.text.JTextComponent.setDocument
No se pudo convertir javax.swing.text.JTextComponent.setFocusAccelerator
No se pudo convertir javax.swing.text.JTextComponent.setHighlighter
No se pudo convertir javax.swing.text.JTextComponent.setKeymap
No se pudo convertir javax.swing.text.JTextComponent.setMargin
No se pudo convertir javax.swing.text.JTextComponent.setSelectedTextColor
No se pudo convertir javax.swing.text.JTextComponent.setSelectionColor
No se pudo convertir javax.swing.text.JTextComponent.setText
No se pudo convertir javax.swing.text.JTextComponent.setUI
No se pudo convertir javax.swing.text.JTextComponent.updateUI
No se pudo convertir javax.swing.text.JTextComponent.viewToModel
No se pudo convertir javax.swing.text.JTextComponent.write
No se pudo convertir javax.swing.text.JTextComponentBeanInfo
No se pudo convertir javax.swing.text.Keymap
No se pudo convertir javax.swing.text.LabelView
No se pudo convertir javax.swing.text.LayeredHighlighter
No se pudo convertir javax.swing.text.LayeredHighlighter.LayerPainter
No se pudo convertir javax.swing.text.LayoutQueue
No se pudo convertir javax.swing.text.MutableAttributeSet.addAttributes
No se pudo convertir javax.swing.text.MutableAttributeSet.removeAttributes(AttributeSet)
No se pudo convertir javax.swing.text.MutableAttributeSet.removeAttributes(Enumeration)
No se pudo convertir javax.swing.text.MutableAttributeSet.setResolveParent
No se pudo convertir javax.swing.text.ParagraphView
No se pudo convertir javax.swing.text.PasswordView
No se pudo convertir javax.swing.text.PlainDocument
No se pudo convertir javax.swing.text.PlainView
No se pudo convertir javax.swing.text.Position
No se pudo convertir javax.swing.text.Position.Bias
No se pudo convertir javax.swing.text.rtf.RTFEditorKit
No se pudo convertir javax.swing.text.SimpleAttributeSet.addAttributes
No se pudo convertir javax.swing.text.SimpleAttributeSet.containsAttributes
No se pudo convertir javax.swing.text.SimpleAttributeSet.copyAttributes
No se pudo convertir javax.swing.text.SimpleAttributeSet.EMPTY
No se pudo convertir javax.swing.text.SimpleAttributeSet.equals
No se pudo convertir javax.swing.text.SimpleAttributeSet.getAttributeNames
No se pudo convertir javax.swing.text.SimpleAttributeSet.getResolveParent
No se pudo convertir javax.swing.text.SimpleAttributeSet.isEqual
No se pudo convertir javax.swing.text.SimpleAttributeSet.removeAttributes(AttributeSet)
No se pudo convertir javax.swing.text.SimpleAttributeSet.removeAttributes(Enumeration)
No se pudo convertir javax.swing.text.SimpleAttributeSet.setResolveParent
No se pudo convertir javax.swing.text.SimpleAttributeSet.toString
No se pudo convertir javax.swing.text.StringContent.createPosition
No se pudo convertir javax.swing.text.StringContent.getPositionsInRange
No se pudo convertir javax.swing.text.StringContent.updateUndoPositions
No se pudo convertir javax.swing.text.Style
No se pudo convertir javax.swing.text.StyleConstants
No se pudo convertir javax.swing.text.StyleConstants.CharacterConstants
No se pudo convertir javax.swing.text.StyleConstants.ColorConstants
No se pudo convertir javax.swing.text.StyleConstants.FontConstants
No se pudo convertir javax.swing.text.StyleConstants.ParagraphConstants
No se pudo convertir javax.swing.text.StyleContext
No se pudo convertir javax.swing.text.StyleContext.NamedStyle
No se pudo convertir javax.swing.text.StyleContext.SmallAttributeSet
No se pudo convertir javax.swing.text.StyledDocument
No se pudo convertir javax.swing.text.StyledEditorKit
No se pudo convertir javax.swing.text.StyledEditorKit.AlignmentAction
No se pudo convertir javax.swing.text.StyledEditorKit.BoldAction
No se pudo convertir javax.swing.text.StyledEditorKit.FontFamilyAction
No se pudo convertir javax.swing.text.StyledEditorKit.FontSizeAction
No se pudo convertir javax.swing.text.StyledEditorKit.ForegroundAction
No se pudo convertir javax.swing.text.StyledEditorKit.ItalicAction
No se pudo convertir javax.swing.text.StyledEditorKit.StyledTextAction
No se pudo convertir javax.swing.text.StyledEditorKit.UnderlineAction
No se pudo convertir javax.swing.text.TabableView
No se pudo convertir javax.swing.text.TabExpander
No se pudo convertir javax.swing.text.TableView
No se pudo convertir javax.swing.text.TableView.TableCell
No se pudo convertir javax.swing.text.TableView.TableRow
No se pudo convertir javax.swing.text.TabSet
No se pudo convertir javax.swing.text.TabStop
No se pudo convertir javax.swing.text.TextAction
No se pudo convertir javax.swing.text.Utilities
No se pudo convertir javax.swing.text.View
No se pudo convertir javax.swing.text.ViewFactory
No se pudo convertir javax.swing.text.WrappedPlainView
No se pudo convertir javax.swing.text.ZoneView
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.tree


No se pudo convertir javax.swing.tree.AbstractLayoutCache
No se pudo convertir javax.swing.tree.AbstractLayoutCache.NodeDimensions
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.allowsChildren
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.breadthFirstEnumeration
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.children
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.depthFirstEnumeration
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getAllowsChildren
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getDepth
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getLeafCount
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getPath
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getUserObject
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.getUserObjectPath
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.isNodeDescendant
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.setAllowsChildren
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.setUserObject
No se pudo convertir javax.swing.tree.DefaultMutableTreeNode.userObject
No se pudo convertir javax.swing.tree.DefaultTreeCellEditor
No se pudo convertir javax.swing.tree.DefaultTreeCellEditor.DefaultTextField
No se pudo convertir javax.swing.tree.DefaultTreeCellEditor.EditorContainer
No se pudo convertir javax.swing.tree.DefaultTreeCellRenderer
No se pudo convertir javax.swing.tree.DefaultTreeModel
No se pudo convertir javax.swing.tree.DefaultTreeModel.addTreeModelListener
No se pudo convertir javax.swing.tree.DefaultTreeModel.asksAllowsChildren
No se pudo convertir javax.swing.tree.DefaultTreeModel.DefaultTreeModel(TreeNode)
No se pudo convertir javax.swing.tree.DefaultTreeModel.DefaultTreeModel(TreeNode, boolean)
No se pudo convertir javax.swing.tree.DefaultTreeModel.fireTreeNodesChanged
No se pudo convertir javax.swing.tree.DefaultTreeModel.fireTreeNodesInserted
No se pudo convertir javax.swing.tree.DefaultTreeModel.fireTreeNodesRemoved
No se pudo convertir javax.swing.tree.DefaultTreeModel.fireTreeStructureChanged
No se pudo convertir javax.swing.tree.DefaultTreeModel.getChild
No se pudo convertir javax.swing.tree.DefaultTreeModel.getChildCount
No se pudo convertir javax.swing.tree.DefaultTreeModel.getIndexOfChild
No se pudo convertir javax.swing.tree.DefaultTreeModel.getListeners
No se pudo convertir javax.swing.tree.DefaultTreeModel.getRoot
No se pudo convertir javax.swing.tree.DefaultTreeModel.insertNodeInto
No se pudo convertir javax.swing.tree.DefaultTreeModel.isLeaf
No se pudo convertir javax.swing.tree.DefaultTreeModel.listenerList
No se pudo convertir javax.swing.tree.DefaultTreeModel.nodeChanged
No se pudo convertir javax.swing.tree.DefaultTreeModel.nodesChanged
No se pudo convertir javax.swing.tree.DefaultTreeModel.nodeStructureChanged
No se pudo convertir javax.swing.tree.DefaultTreeModel.nodesWereInserted
No se pudo convertir javax.swing.tree.DefaultTreeModel.nodesWereRemoved
No se pudo convertir javax.swing.tree.DefaultTreeModel.reload
No se pudo convertir javax.swing.tree.DefaultTreeModel.removeNodeFromParent
No se pudo convertir javax.swing.tree.DefaultTreeModel.removeTreeModelListener
No se pudo convertir javax.swing.tree.DefaultTreeModel.root
No se pudo convertir javax.swing.tree.DefaultTreeModel.setAsksAllowsChildren
No se pudo convertir javax.swing.tree.DefaultTreeModel.setRoot
No se pudo convertir javax.swing.tree.DefaultTreeModel.valueForPathChanged
No se pudo convertir javax.swing.tree.DefaultTreeSelectionModel
No se pudo convertir javax.swing.tree.ExpandVetoException.event
No se pudo convertir javax.swing.tree.ExpandVetoException.ExpandVetoException(TreeExpansionEvent)
No se pudo convertir javax.swing.tree.ExpandVetoException.ExpandVetoException(TreeExpansionEvent, String)
No se pudo convertir javax.swing.tree.FixedHeightLayoutCache
No se pudo convertir javax.swing.tree.MutableTreeNode.setUserObject
No se pudo convertir javax.swing.tree.RowMapper
No se pudo convertir javax.swing.tree.TreeCellEditor
No se pudo convertir javax.swing.tree.TreeCellRenderer
No se pudo convertir javax.swing.tree.TreeModel
No se pudo convertir javax.swing.tree.TreeModel.addTreeModelListener
No se pudo convertir javax.swing.tree.TreeModel.getChild
No se pudo convertir javax.swing.tree.TreeModel.getChildCount
No se pudo convertir javax.swing.tree.TreeModel.getIndexOfChild
No se pudo convertir javax.swing.tree.TreeModel.getRoot
No se pudo convertir javax.swing.tree.TreeModel.isLeaf
No se pudo convertir javax.swing.tree.TreeModel.removeTreeModelListener
No se pudo convertir javax.swing.tree.TreeModel.valueForPathChanged
No se pudo convertir javax.swing.tree.TreeNode.getAllowsChildren
No se pudo convertir javax.swing.tree.TreePath
No se pudo convertir javax.swing.tree.TreeSelectionModel
No se pudo convertir javax.swing.tree.VariableHeightLayoutCache
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.swing.undo


No se pudo convertir javax.swing.undo.AbstractUndoableEdit
No se pudo convertir javax.swing.undo.CompoundEdit
No se pudo convertir javax.swing.undo.StateEdit
No se pudo convertir javax.swing.undo.StateEditable
No se pudo convertir javax.swing.undo.UndoableEdit
No se pudo convertir javax.swing.undo.UndoableEditSupport
No se pudo convertir javax.swing.undo.UndoManager
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.transaction


No se pudo convertir javax.transaction.HeuristicCommitException
No se pudo convertir javax.transaction.HeuristicMixedException
No se pudo convertir javax.transaction.HeuristicRollbackException
No se pudo convertir javax.transaction.InvalidTransactionException
No se pudo convertir javax.transaction.RollbackException
No se pudo convertir javax.transaction.Status.STATUS_ACTIVE
No se pudo convertir javax.transaction.Status.STATUS_COMMITTING
No se pudo convertir javax.transaction.Status.STATUS_MARKED_ROLLBACK
No se pudo convertir javax.transaction.Status.STATUS_PREPARED
No se pudo convertir javax.transaction.Status.STATUS_PREPARING
No se pudo convertir javax.transaction.Status.STATUS_UNKNOWN
No se pudo convertir javax.transaction.SystemException.errorCode
No se pudo convertir javax.transaction.SystemException.SystemException
No se pudo convertir javax.transaction.Synchronization
No se pudo convertir javax.transaction.Transaction
No se pudo convertir javax.transaction.Transaction.commit
No se pudo convertir javax.transaction.Transaction.delistResource
No se pudo convertir javax.transaction.Transaction.enlistResource
No se pudo convertir javax.transaction.Transaction.getStatus
No se pudo convertir javax.transaction.Transaction.registerSynchronization
No se pudo convertir javax.transaction.Transaction.rollback
No se pudo convertir javax.transaction.Transaction.setRollbackOnly
No se pudo convertir javax.transaction.TransactionManager
No se pudo convertir javax.transaction.TransactionManager.setRollbackOnly
No se pudo convertir javax.transaction.TransactionRequiredException
No se pudo convertir javax.transaction.TransactionRolledbackException
No se pudo convertir javax.transaction.UserTransaction
No se pudo convertir javax.transaction.UserTransaction.begin
No se pudo convertir javax.transaction.UserTransaction.setRollbackOnly
No se pudo convertir javax.transaction.xa.XAException
No se pudo convertir javax.transaction.xa.XAResource
No se pudo convertir javax.transaction.xa.Xid
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de javax.xml


No se pudo convertir javax.xml.parsers.DocumentBuilder
No se pudo convertir javax.xml.parsers.DocumentBuilder.isValidating
No se pudo convertir javax.xml.parsers.DocumentBuilder.parse
No se pudo convertir javax.xml.parsers.DocumentBuilder.setEntityResolver
No se pudo convertir javax.xml.parsers.DocumentBuilder.setErrorHandler
No se pudo convertir javax.xml.parsers.DocumentBuilderFactory
No se pudo convertir javax.xml.parsers.FactoryConfigurationError
No se pudo convertir javax.xml.parsers.ParserConfigurationException
No se pudo convertir javax.xml.parsers.SAXParser.getProperty
No se pudo convertir javax.xml.parsers.SAXParser.setProperty
No se pudo convertir javax.xml.parsers.SAXParserFactory.getFeature
No se pudo convertir javax.xml.parsers.SAXParserFactory.setFeature
No se pudo convertir javax.xml.transform.dom.DOMLocator
No se pudo convertir javax.xml.transform.dom.DOMResult
No se pudo convertir javax.xml.transform.dom.DOMResult.DOMResult
No se pudo convertir javax.xml.transform.dom.DOMSource
No se pudo convertir javax.xml.transform.ErrorListener
No se pudo convertir javax.xml.transform.OutputKeys
No se pudo convertir javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING
No se pudo convertir javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING
No se pudo convertir javax.xml.transform.sax.SAXResult
No se pudo convertir javax.xml.transform.sax.SAXResult.SAXResult
No se pudo convertir javax.xml.transform.sax.SAXTransformerFactory
No se pudo convertir javax.xml.transform.sax.TemplatesHandler
No se pudo convertir javax.xml.transform.sax.TransformerHandler
No se pudo convertir javax.xml.transform.stream.StreamResult.setSystemId
No se pudo convertir javax.xml.transform.stream.StreamSource.getPublicId
No se pudo convertir javax.xml.transform.stream.StreamSource.setPublicId
No se pudo convertir javax.xml.transform.stream.StreamSource.setSystemId
No se pudo convertir javax.xml.transform.Templates.getOutputProperties
No se pudo convertir javax.xml.transform.Transformer.getOutputProperties
No se pudo convertir javax.xml.transform.Transformer.getOutputProperty
No se pudo convertir javax.xml.transform.Transformer.getURIResolver
No se pudo convertir javax.xml.transform.Transformer.setErrorListener
No se pudo convertir javax.xml.transform.Transformer.setOutputProperties
No se pudo convertir javax.xml.transform.Transformer.setOutputProperty
No se pudo convertir javax.xml.transform.Transformer.transform
No se pudo convertir javax.xml.transform.TransformerConfigurationException.TransformerConfigurationException
No se pudo convertir javax.xml.transform.TransformerException.initCause
No se pudo convertir javax.xml.transform.TransformerException.setLocator
No se pudo convertir javax.xml.transform.TransformerException.TransformerException
No se pudo convertir javax.xml.transform.TransformerFactory.getAssociatedStylesheet
No se pudo convertir javax.xml.transform.TransformerFactory.getAttribute
No se pudo convertir javax.xml.transform.TransformerFactory.getURIResolver
No se pudo convertir javax.xml.transform.TransformerFactory.newTransformer
No se pudo convertir javax.xml.transform.TransformerFactory.setAttribute
No se pudo convertir javax.xml.transform.TransformerFactory.setErrorListener
No se pudo convertir javax.xml.transform.TransformerFactoryConfigurationError
No se pudo convertir javax.xml.transform.URIResolver
No se pudo convertir javax.xml.transform.URIResolver.resolve
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de org.omg


No se pudo convertir org.omg.CORBA._IDLTypeStub
No se pudo convertir org.omg.CORBA._PolicyStub
No se pudo convertir org.omg.CORBA.Any.create_input_stream
No se pudo convertir org.omg.CORBA.Any.create_output_stream
No se pudo convertir org.omg.CORBA.Any.extract_Principal
No se pudo convertir org.omg.CORBA.Any.extract_Value
No se pudo convertir org.omg.CORBA.Any.insert_fixed
No se pudo convertir org.omg.CORBA.Any.insert_Object
No se pudo convertir org.omg.CORBA.Any.insert_Principal
No se pudo convertir org.omg.CORBA.Any.insert_Streamable
No se pudo convertir org.omg.CORBA.Any.insert_Value(Serializable)
No se pudo convertir org.omg.CORBA.Any.insert_Value(Serializable, TypeCode)
No se pudo convertir org.omg.CORBA.Any.read_value
No se pudo convertir org.omg.CORBA.Any.type
No se pudo convertir org.omg.CORBA.Any.write_value
No se pudo convertir org.omg.CORBA.AnyHolder
No se pudo convertir org.omg.CORBA.AnyHolder._read
No se pudo convertir org.omg.CORBA.AnyHolder._write
No se pudo convertir org.omg.CORBA.AnySeqHelper
No se pudo convertir org.omg.CORBA.AnySeqHolder
No se pudo convertir org.omg.CORBA.ARG_IN
No se pudo convertir org.omg.CORBA.ARG_INOUT
No se pudo convertir org.omg.CORBA.ARG_OUT
No se pudo convertir org.omg.CORBA.BAD_CONTEXT.BAD_CONTEXT(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_CONTEXT.BAD_CONTEXT(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_INV_ORDER.BAD_INV_ORDER(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_INV_ORDER.BAD_INV_ORDER(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_OPERATION.BAD_OPERATION(int, ComletionStatus)
No se pudo convertir org.omg.CORBA.BAD_OPERATION.BAD_OPERATION(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_PARAM.BAD_PARAM(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_PARAM.BAD_PARAM(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.BAD_POLICY
No se pudo convertir org.omg.CORBA.BAD_POLICY_TYPE
No se pudo convertir org.omg.CORBA.BAD_POLICY_VALUE
No se pudo convertir org.omg.CORBA.BooleanHolder._read
No se pudo convertir org.omg.CORBA.BooleanHolder._write
No se pudo convertir org.omg.CORBA.BooleanSeqHelper
No se pudo convertir org.omg.CORBA.BooleanSeqHolder
No se pudo convertir org.omg.CORBA.ByteHolder._read
No se pudo convertir org.omg.CORBA.ByteHolder._write
No se pudo convertir org.omg.CORBA.CharHolder._read
No se pudo convertir org.omg.CORBA.CharHolder._write
No se pudo convertir org.omg.CORBA.CharSeqHelper
No se pudo convertir org.omg.CORBA.CharSeqHolder
No se pudo convertir org.omg.CORBA.CompletionStatus
No se pudo convertir org.omg.CORBA.CompletionStatusHelper
No se pudo convertir org.omg.CORBA.Context
No se pudo convertir org.omg.CORBA.ContextList
No se pudo convertir org.omg.CORBA.CTX_RESTRICT_SCOPE
No se pudo convertir org.omg.CORBA.Current
No se pudo convertir org.omg.CORBA.CurrentHelper
No se pudo convertir org.omg.CORBA.CurrentHolder
No se pudo convertir org.omg.CORBA.CurrentOperations
No se pudo convertir org.omg.CORBA.CustomMarshal
No se pudo convertir org.omg.CORBA.DataInputStream
No se pudo convertir org.omg.CORBA.DataOutputStream
No se pudo convertir org.omg.CORBA.DefinitionKind
No se pudo convertir org.omg.CORBA.DefinitionKindHelper
No se pudo convertir org.omg.CORBA.DomainManager
No se pudo convertir org.omg.CORBA.DomainManagerOperations
No se pudo convertir org.omg.CORBA.DoubleHolder._read
No se pudo convertir org.omg.CORBA.DoubleHolder._write
No se pudo convertir org.omg.CORBA.DoubleSeqHelper
No se pudo convertir org.omg.CORBA.DoubleSeqHolder
No se pudo convertir org.omg.CORBA.DynamicImplementation
No se pudo convertir org.omg.CORBA.DynAny
No se pudo convertir org.omg.CORBA.DynArray
No se pudo convertir org.omg.CORBA.DynEnum
No se pudo convertir org.omg.CORBA.DynFixed
No se pudo convertir org.omg.CORBA.DynSequence
No se pudo convertir org.omg.CORBA.DynStruct
No se pudo convertir org.omg.CORBA.DynUnion
No se pudo convertir org.omg.CORBA.DynValue
No se pudo convertir org.omg.CORBA.Environment
No se pudo convertir org.omg.CORBA.ExceptionList
No se pudo convertir org.omg.CORBA.FieldNameHelper
No se pudo convertir org.omg.CORBA.FixedHolder
No se pudo convertir org.omg.CORBA.FloatHolder._read
No se pudo convertir org.omg.CORBA.FloatHolder._write
No se pudo convertir org.omg.CORBA.FloatSeqHelper
No se pudo convertir org.omg.CORBA.FloatSeqHolder
No se pudo convertir org.omg.CORBA.IdentifierHelper
No se pudo convertir org.omg.CORBA.IDLType
No se pudo convertir org.omg.CORBA.IDLTypeHelper
No se pudo convertir org.omg.CORBA.IDLTypeOperations
No se pudo convertir org.omg.CORBA.IntHolder._read
No se pudo convertir org.omg.CORBA.IntHolder._write
No se pudo convertir org.omg.CORBA.INV_POLICY.INV_POLICY(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.INV_POLICY.INV_POLICY(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.IRObject
No se pudo convertir org.omg.CORBA.IRObjectOperations
No se pudo convertir org.omg.CORBA.LocalObject
No se pudo convertir org.omg.CORBA.LongHolder._read
No se pudo convertir org.omg.CORBA.LongHolder._write
No se pudo convertir org.omg.CORBA.LongLongSeqHelper
No se pudo convertir org.omg.CORBA.LongLongSeqHolder
No se pudo convertir org.omg.CORBA.LongSeqHelper
No se pudo convertir org.omg.CORBA.LongSeqHolder
No se pudo convertir org.omg.CORBA.MARSHAL.MARSHAL(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.MARSHAL.MARSHAL(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.NamedValue
No se pudo convertir org.omg.CORBA.NameValuePair
No se pudo convertir org.omg.CORBA.NameValuePairHelper
No se pudo convertir org.omg.CORBA.NO_PERMISSION.NO_PERMISSION(int, CompletionStatus)
No se pudo convertir org.omg.CORBA.NO_PERMISSION.NO_PERMISSION(String, int, CompletionStatus)
No se pudo convertir org.omg.CORBA.NVList
No se pudo convertir org.omg.CORBA.Object._create_request(Context, String, NVList, NamedValue)
No se pudo convertir org.omg.CORBA.Object._create_request(Context, String, NVList, NamedValue, ExceptionList, ContextList)
No se pudo convertir org.omg.CORBA.Object._duplicate
No se pudo convertir org.omg.CORBA.Object._get_domain_managers
No se pudo convertir org.omg.CORBA.Object._get_interface_def
No se pudo convertir org.omg.CORBA.Object._get_policy
No se pudo convertir org.omg.CORBA.Object._hash
No se pudo convertir org.omg.CORBA.Object._is_a
No se pudo convertir org.omg.CORBA.Object._is_equivalent
No se pudo convertir org.omg.CORBA.Object._non_existent
No se pudo convertir org.omg.CORBA.Object._release
No se pudo convertir org.omg.CORBA.Object._request
No se pudo convertir org.omg.CORBA.Object._set_policy_override
No se pudo convertir org.omg.CORBA.ObjectHelper
No se pudo convertir org.omg.CORBA.ObjectHolder._read
No se pudo convertir org.omg.CORBA.ObjectHolder._write
No se pudo convertir org.omg.CORBA.OctetSeqHelper
No se pudo convertir org.omg.CORBA.OctetSeqHolder
No se pudo convertir org.omg.CORBA.OMGVMCID
No se pudo convertir org.omg.CORBA.ORB
No se pudo convertir org.omg.CORBA.Policy
No se pudo convertir org.omg.CORBA.PolicyError.reason
No se pudo convertir org.omg.CORBA.PolicyHelper
No se pudo convertir org.omg.CORBA.PolicyHolder
No se pudo convertir org.omg.CORBA.PolicyListHelper
No se pudo convertir org.omg.CORBA.PolicyListHolder
No se pudo convertir org.omg.CORBA.PolicyOperations
No se pudo convertir org.omg.CORBA.PolicyTypeHelper
No se pudo convertir org.omg.CORBA.portable.ApplicationException.getId
No se pudo convertir org.omg.CORBA.portable.ApplicationException.getInputStream
No se pudo convertir org.omg.CORBA.portable.BoxedValueHelper
No se pudo convertir org.omg.CORBA.portable.CustomValue
No se pudo convertir org.omg.CORBA.portable.Delegate
No se pudo convertir org.omg.CORBA.portable.IDLEntity
No se pudo convertir org.omg.CORBA.portable.IndirectionException.IndirectionException
No se pudo convertir org.omg.CORBA.portable.IndirectionException.offset
No se pudo convertir org.omg.CORBA.portable.InputStream
No se pudo convertir org.omg.CORBA.portable.InvokeHandler
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._create_request(Context, String, NVList, NamedValue)
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._create_request(Context, String, NVList, NamedValue, ExceptionList, ContextList)
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._duplicate
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._get_delegate
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._get_domain_managers
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._get_interface_def
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._get_policy
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._hash
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._ids
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._invoke
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._is_a
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._is_equivalent
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._is_local
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._non_existent
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._orb
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._release
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._releaseReply
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._request(String)
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._request(String, boolean)
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._servant_postinvoke
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._servant_preinvoke
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._set_delegate
No se pudo convertir org.omg.CORBA.portable.ObjectImpl._set_policy_override
No se pudo convertir org.omg.CORBA.portable.OutputStream
No se pudo convertir org.omg.CORBA.portable.ResponseHandler
No se pudo convertir org.omg.CORBA.portable.ServantObject
No se pudo convertir org.omg.CORBA.portable.Streamable
No se pudo convertir org.omg.CORBA.portable.StreamableValue
No se pudo convertir org.omg.CORBA.portable.ValueBase
No se pudo convertir org.omg.CORBA.portable.ValueFactory
No se pudo convertir org.omg.CORBA.Principal
No se pudo convertir org.omg.CORBA.PrincipalHolder
No se pudo convertir org.omg.CORBA.PRIVATE_MEMBER
No se pudo convertir org.omg.CORBA.PUBLIC_MEMBER
No se pudo convertir org.omg.CORBA.RepositoryIdHelper
No se pudo convertir org.omg.CORBA.Request
No se pudo convertir org.omg.CORBA.ServerRequest
No se pudo convertir org.omg.CORBA.ServiceDetail
No se pudo convertir org.omg.CORBA.ServiceDetailHelper
No se pudo convertir org.omg.CORBA.ServiceInformation
No se pudo convertir org.omg.CORBA.ServiceInformationHelper
No se pudo convertir org.omg.CORBA.ServiceInformationHolder
No se pudo convertir org.omg.CORBA.SetOverrideType
No se pudo convertir org.omg.CORBA.SetOverrideTypeHelper
No se pudo convertir org.omg.CORBA.ShortHolder._read
No se pudo convertir org.omg.CORBA.FloatHolder._write
No se pudo convertir org.omg.CORBA.ShortSeqHelper
No se pudo convertir org.omg.CORBA.ShortSeqHolder
No se pudo convertir org.omg.CORBA.StringHolder._read
No se pudo convertir org.omg.CORBA.StringHolder._write
No se pudo convertir org.omg.CORBA.StringHolder.StringHolder
No se pudo convertir org.omg.CORBA.StringHolder.StringHolder(String)
No se pudo convertir org.omg.CORBA.StringValueHelper
No se pudo convertir org.omg.CORBA.StructMember
No se pudo convertir org.omg.CORBA.StructMemberHelper
No se pudo convertir org.omg.CORBA.SystemException.completed
No se pudo convertir org.omg.CORBA.SystemException.minor
No se pudo convertir org.omg.CORBA.TCKind.<TipoDatos>
No se pudo convertir org.omg.CORBA.TCKind.TCKind
No se pudo convertir org.omg.CORBA.TypeCode
No se pudo convertir org.omg.CORBA.TypeCode.concrete_base_type
No se pudo convertir org.omg.CORBA.TypeCode.content_type
No se pudo convertir org.omg.CORBA.TypeCode.default_index
No se pudo convertir org.omg.CORBA.TypeCode.discriminator_type
No se pudo convertir org.omg.CORBA.TypeCode.equivalent
No se pudo convertir org.omg.CORBA.TypeCode.fixed_digits
No se pudo convertir org.omg.CORBA.TypeCode.fixed_scale
No se pudo convertir org.omg.CORBA.TypeCode.get_compact_typecode
No se pudo convertir org.omg.CORBA.TypeCode.id
No se pudo convertir org.omg.CORBA.TypeCode.length
No se pudo convertir org.omg.CORBA.TypeCode.member_count
No se pudo convertir org.omg.CORBA.TypeCode.member_label
No se pudo convertir org.omg.CORBA.TypeCode.member_name
No se pudo convertir org.omg.CORBA.TypeCode.member_type
No se pudo convertir org.omg.CORBA.TypeCode.member_visibility
No se pudo convertir org.omg.CORBA.TypeCode.name
No se pudo convertir org.omg.CORBA.TypeCode.type_modifier
No se pudo convertir org.omg.CORBA.TypeCode.TypeCode
No se pudo convertir org.omg.CORBA.TypeCodeHolder
No se pudo convertir org.omg.CORBA.ULongLongSeqHelper
No se pudo convertir org.omg.CORBA.ULongLongSeqHolder
No se pudo convertir org.omg.CORBA.ULongSeqHelper
No se pudo convertir org.omg.CORBA.ULongSeqHolder
No se pudo convertir org.omg.CORBA.UnionMember
No se pudo convertir org.omg.CORBA.UnionMemberHelper
No se pudo convertir org.omg.CORBA.UnknownUserException.except
No se pudo convertir org.omg.CORBA.UNSUPPORTED_POLICY
No se pudo convertir org.omg.CORBA.UNSUPPORTED_POLICY_VALUE
No se pudo convertir org.omg.CORBA.UShortSeqHelper
No se pudo convertir org.omg.CORBA.UShortSeqHolder
No se pudo convertir org.omg.CORBA.ValueBaseHelper
No se pudo convertir org.omg.CORBA.ValueBaseHolder
No se pudo convertir org.omg.CORBA.ValueBaseHolder._read
No se pudo convertir org.omg.CORBA.ValueBaseHolder._write
No se pudo convertir org.omg.CORBA.ValueBaseHolder.ValueBaseHolder
No se pudo convertir org.omg.CORBA.ValueMember
No se pudo convertir org.omg.CORBA.ValueMemberHelper
No se pudo convertir org.omg.CORBA.VersionSpecHelper
No se pudo convertir org.omg.CORBA.VisibilityHelper
No se pudo convertir org.omg.CORBA.VM_ABSTRACT
No se pudo convertir org.omg.CORBA.VM_CUSTOM
No se pudo convertir org.omg.CORBA.VM_NONE
No se pudo convertir org.omg.CORBA.VM_TRUNCATABLE
No se pudo convertir org.omg.CORBA.WCharSeqHelper
No se pudo convertir org.omg.CORBA.WCharSeqHolder
No se pudo convertir org.omg.CORBA.WStringValueHelper
No se pudo convertir org.omg.CORBA_2_3.ORB
No se pudo convertir org.omg.CORBA_2_3.portable.Delegate
No se pudo convertir org.omg.CORBA_2_3.portable.InputStream
No se pudo convertir org.omg.CORBA_2_3.portable.ObjectImpl
No se pudo convertir org.omg.CORBA_2_3.portable.OutputStream
No se pudo convertir org.omg.CosNaming._BindingIteratorImplBase
No se pudo convertir org.omg.CosNaming._BindingIteratorStub
No se pudo convertir org.omg.CosNaming._NamingContextImplBase
No se pudo convertir org.omg.CosNaming._NamingContextStub
No se pudo convertir org.omg.CosNaming.Binding
No se pudo convertir org.omg.CosNaming.BindingHelper
No se pudo convertir org.omg.CosNaming.BindingHolder
No se pudo convertir org.omg.CosNaming.BindingIterator
No se pudo convertir org.omg.CosNaming.BindingIteratorHelper
No se pudo convertir org.omg.CosNaming.BindingIteratorHolder
No se pudo convertir org.omg.CosNaming.BindingIteratorOperations
No se pudo convertir org.omg.CosNaming.BindingListHelper
No se pudo convertir org.omg.CosNaming.BindingListHolder
No se pudo convertir org.omg.CosNaming.BindingType
No se pudo convertir org.omg.CosNaming.BindingTypeHelper
No se pudo convertir org.omg.CosNaming.BindingTypeHolder
No se pudo convertir org.omg.CosNaming.IstringHelper
No se pudo convertir org.omg.CosNaming.NameComponent
No se pudo convertir org.omg.CosNaming.NameComponentHelper
No se pudo convertir org.omg.CosNaming.NameComponentHolder
No se pudo convertir org.omg.CosNaming.NameHelper
No se pudo convertir org.omg.CosNaming.NameHolder
No se pudo convertir org.omg.CosNaming.NamingContext
No se pudo convertir org.omg.CosNaming.NamingContextHelper
No se pudo convertir org.omg.CosNaming.NamingContextHolder
No se pudo convertir org.omg.CosNaming.NamingContextOperations
No se pudo convertir org.omg.CosNaming.NamingContextPackage.AlreadyBoundHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.AlreadyBoundHolder
No se pudo convertir org.omg.CosNaming.NamingContextPackage.CannotProceed.CannotProceed
No se pudo convertir org.omg.CosNaming.NamingContextPackage.CannotProceed.cxt
No se pudo convertir org.omg.CosNaming.NamingContextPackage.CannotProceed.rest_of_name
No se pudo convertir org.omg.CosNaming.NamingContextPackage.CannotProceedHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.CannotProceedHolder
No se pudo convertir org.omg.CosNaming.NamingContextPackage.InvalidNameHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.InvalidNameHolder
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotEmptyHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotEmptyHolder
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFound.NotFound
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFound.rest_of_name
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFound.why
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFoundHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFoundHolder
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFoundReason
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFoundReasonHelper
No se pudo convertir org.omg.CosNaming.NamingContextPackage.NotFoundReasonHolder
No se pudo convertir org.omg.stub.java.rmi._Remote_Stub
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de org.w3c


No se pudo convertir org.w3c.dom.DOMException
No se pudo convertir org.w3c.dom.DOMException.<TipoExcepción>
No se pudo convertir org.w3c.dom.DOMException.code
No se pudo convertir org.w3c.dom.DOMImplementation.createDocumentType
No se pudo convertir org.w3c.dom.Element.setAttribute
No se pudo convertir org.w3c.dom.Node.getChildNodes
No se pudo convertir org.w3c.dom.Node.setPrefix
No se pudo convertir org.w3c.dom.ranges.DocumentRange
No se pudo convertir org.w3c.dom.ranges.Range
No se pudo convertir org.w3c.dom.ranges.RangeException
No se pudo convertir org.w3c.dom.traversal.DocumentTraversal.createNodeIterator
No se pudo convertir org.w3c.dom.traversal.DocumentTraversal.createTreeWalker
No se pudo convertir org.w3c.dom.traversal.NodeFilter.SHOW_ALL
No se pudo convertir org.w3c.dom.traversal.NodeIterator.getExpandEntityReferences
No se pudo convertir org.w3c.dom.traversal.TreeWalker.getExpandEntityReferences
Mensajes de error del Ayudante para la conversión del lenguaje Java

Mensajes de error de org.xml


No se pudo convertir org.xml.sax.AttributeList.getLength
No se pudo convertir org.xml.sax.AttributeList.getName
No se pudo convertir org.xml.sax.AttributeList.getType
No se pudo convertir org.xml.sax.AttributeList.getValue
No se pudo convertir org.xml.sax.Attributes.getIndex
No se pudo convertir org.xml.sax.Attributes.getLength
No se pudo convertir org.xml.sax.Attributes.getLocalName
No se pudo convertir org.xml.sax.Attributes.getQName
No se pudo convertir org.xml.sax.Attributes.getType
No se pudo convertir org.xml.sax.Attributes.getURI
No se pudo convertir org.xml.sax.Attributes.getValue
No se pudo convertir org.xml.sax.DocumentHandler
No se pudo convertir org.xml.sax.DTDHandler
No se pudo convertir org.xml.sax.EntityResolver
No se pudo convertir org.xml.sax.ErrorHandler.error
No se pudo convertir org.xml.sax.ErrorHandler.fatalError
No se pudo convertir org.xml.sax.ErrorHandler.warning
No se pudo convertir org.xml.sax.ext.DeclHandler
No se pudo convertir org.xml.sax.ext.LexicalHandler
No se pudo convertir org.xml.sax.HandlerBase
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.addAttribute
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.AttributeListImpl
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.AttributeListImpl(Lista de atributos)
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.clear
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.getLength
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.getName
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.getType
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.getValue
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.removeAttribute
No se pudo convertir org.xml.sax.helpers.AttributeListImpl.setAttributeList
No se pudo convertir org.xml.sax.helpers.AttributesImpl.addAttribute
No se pudo convertir org.xml.sax.helpers.AttributesImpl.AttributesImpl
No se pudo convertir org.xml.sax.helpers.AttributesImpl.AttributesImpl(Atributos)
No se pudo convertir org.xml.sax.helpers.AttributesImpl.clear
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getIndex(Cadena)
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getIndex(Cadena, Cadena)
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getLength
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getLocalName
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getQName
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getType
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getURI
No se pudo convertir org.xml.sax.helpers.AttributesImpl.getValue
No se pudo convertir org.xml.sax.helpers.AttributesImpl.removeAttribute
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setAttribute
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setAttributes
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setLocalName
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setQName
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setType
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setURI
No se pudo convertir org.xml.sax.helpers.AttributesImpl.setValue
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.getDeclaredPrefixes
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.getPrefixes
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.getPrefixes(Cadena)
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.processName
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.reset
No se pudo convertir org.xml.sax.helpers.NamespaceSupport.XMLNS
No se pudo convertir org.xml.sax.helpers.ParserAdapter
No se pudo convertir org.xml.sax.helpers.ParserAdapter.getDTDHandler
No se pudo convertir org.xml.sax.helpers.ParserAdapter.getEntityResolver
No se pudo convertir org.xml.sax.helpers.ParserAdapter.getFeature
No se pudo convertir org.xml.sax.helpers.ParserAdapter.getProperty
No se pudo convertir org.xml.sax.helpers.ParserAdapter.setDTDHandler
No se pudo convertir org.xml.sax.helpers.ParserAdapter.setErrorHandler
No se pudo convertir org.xml.sax.helpers.ParserAdapter.setFeature
No se pudo convertir org.xml.sax.helpers.ParserAdapter.setProperty
No se pudo convertir org.xml.sax.helpers.XMLFilterImpl
No se pudo convertir org.xml.sax.helpers.XMLReaderAdapter
No se pudo convertir org.xml.sax.helpers.XMLReaderAdapter.setDTDHandler
No se pudo convertir org.xml.sax.helpers.XMLReaderAdapter.setErrorHandler
No se pudo convertir org.xml.sax.helpers.XMLReaderAdapter.setLocale
No se pudo convertir org.xml.sax.helpers.XMLReaderFactory
No se pudo convertir org.xml.sax.InputSource.getEncoding
No se pudo convertir org.xml.sax.InputSource.getPublicId
No se pudo convertir org.xml.sax.InputSource.setEncoding
No se pudo convertir org.xml.sax.InputSource.setPublicId
No se pudo convertir org.xml.sax.Parser.parse
No se pudo convertir org.xml.sax.Parser.setDocumentHandler
No se pudo convertir org.xml.sax.Parser.setDTDHandler
No se pudo convertir org.xml.sax.Parser.setEntityResolver
No se pudo convertir org.xml.sax.Parser.setErrorHandler
No se pudo convertir org.xml.sax.Parser.setLocale
No se pudo convertir org.xml.sax.SAXException
No se pudo convertir org.xml.sax.SAXNotRecognizedException
No se pudo convertir org.xml.sax.SAXNotSupportedException
No se pudo convertir org.xml.sax.SAXParseException
No se pudo convertir org.xml.sax.SAXParseException.SAXParseException (Cadena, Ubicador)
No se pudo convertir org.xml.sax.SAXParseException.SAXParseException (Cadena, Ubicador, Excepción)
No se pudo convertir org.xml.sax.SAXParseException.SAXParseException (Cadena, Cadena, ENTERO, ENTERO)
No se pudo convertir org.xml.sax.XMLFilter.getParent
No se pudo convertir org.xml.sax.XMLFilter.setParent
No se pudo convertir org.xml.sax.XMLReader.getContentHandler
No se pudo convertir org.xml.sax.XMLReader.getDTDHandler
No se pudo convertir org.xml.sax.XMLReader.getEntityResolver
No se pudo convertir org.xml.sax.XMLReader.getErrorHandler
No se pudo convertir org.xml.sax.XMLReader.getFeature
No se pudo convertir org.xml.sax.XMLReader.getProperty
No se pudo convertir org.xml.sax.XMLReader.parse
No se pudo convertir org.xml.sax.XMLReader.setContentHandler
No se pudo convertir org.xml.sax.XMLReader.setDTDHandler
No se pudo convertir org.xml.sax.XMLReader.setEntityResolver
No se pudo convertir org.xml.sax.XMLReader.setErrorHandler
No se pudo convertir org.xml.sax.XMLReader.setFeature
No se pudo convertir org.xml.sax.XMLReader.setProperty
Conceptos del lenguaje Visual C#

C# para los desarrolladores de C++


La tabla siguiente contiene comparaciones importantes entre C# y C++ nativo, que no utilizan /clr. Los programadores de
C++ encontrarán rápidamente en esta tabla las diferencias más importantes entre ambos lenguajes.
Nota
Los proyectos de C++ y C# provienen de diferentes modelos de proyecto. Para obtener más información acerca de las difere
ncias entre los proyectos de C++ y C#, vea Administración de elementos en proyectos y Utilizar el Explorador de soluciones.

Característica Consulte el tema


Herencia: en C++, las clases y las estructuras son ca class
si idénticas, mientras que en C# son bastante difere
ntes. Las clases de C# pueden implementar cualqui interface
er número de interfaces, pero sólo pueden heredar struct (Referencia de C#)
de una clase base. Además, las estructuras de C# n
o admiten la herencia ni los constructores predeter
minados explícitos (se proporciona uno de forma p
redeterminada).

Matrices: en C++, una matriz es simplemente un p Matrices (Guía de programación de C#)


untero. En C#, las matrices son objetos que incluye
n métodos y propiedades. Por ejemplo, el tamaño d Indizadores (Guía de programación de C#)
e una matriz se puede consultar mediante la propie
dad Length. Las matrices de C# también emplean i
ndizadores que comprueban cada uno de los índice
s utilizados para tener acceso a la matriz. La sintaxis
para declarar matrices de C# es diferente de la que
se utiliza para las matrices de C++: los símbolos "[]
" aparecen después del tipo de matriz en C#, no la v
ariable.

Booleanos: en C++, el tipo bool es esencialmente u bool


n entero. En C#, no es posible realizar la conversión
del tipo bool a otros tipos o viceversa.

El tipo long: en C#, el tipo long tiene 64 bits, mient long


ras que en C++ tiene 32 bits.

Paso de parámetros: en C++, todas las variables se struct


pasan por valor a menos que se pasen explícitamen
te con un puntero o una referencia. En C#, las clase class
s se pasan por referencia y las estructuras se pasan ref (Referencia de C#)
por valor, a menos que se pasen explícitamente por
referencia con los modificadores de parámetro ref out (Referencia de C#)
o out.

La instrucción switch: a diferencia de la instrucción switch


switch de C++, C# no admite el paso explícito de u
na etiqueta case a otra.

Delegados: los delegados de C# son similares a los delegate


punteros a función de C++, son seguros y proporci
onan seguridad de tipos.
Métodos de clase base: C# admite la palabra clave base
base para llamar a los miembros de clase base ree
mplazados desde las clases derivadas. Además, el r Vea también los ejemplos para override
eemplazo de métodos virtuales o abstractos es expl
ícito en C#, utilizando la palabra clave override.

Ocultación de método: C++ admite la "ocultación" i new


mplícita de método mediante la herencia. En C#, de
be utilizar el modificador new para ocultar explícita
mente un miembro heredado.

Las directivas de preprocesador se utilizan para la c Directivas de preprocesador de C#


ompilación condicional. En C# no se utilizan archiv
os de encabezado.

Control de excepciones: C# proporciona la palabra try-finally


clave finally para utilizar con el código que debe ej
ecutarse sin tener en cuenta si se produce una exce try-catch-finally
pción.

Operadores de C#: C# admite operadores adicional Operador &


es como is y typeof. También presenta una funcio
nalidad diferente en algunos operadores lógicos. Operador |
Operador ^
is
typeof

La palabra clave extern: en C++, extern se utiliza extern


para importar tipos. En C#, extern se utiliza para cr
ear alias para el uso de versiones diferentes del mis
mo ensamblado.

La palabra clave static: en C++, static se puede util static


izar tanto para declarar entidades del nivel de clase
como para declarar tipos específicos de un módulo.
En C#, static sólo se utiliza para declarar entidades
del nivel de clase.

El método Main se declara en C# de forma diferent Main() y argumentos de línea de comandos (Guía de programación de C#)
e a la función main en C++. En C#, se pone en may
úsculas y siempre es static. Además, la funcionalid
ad del procesamiento de los argumentos de la línea
de comandos es mucho más sólida en C#.

C# admite punteros, pero sólo en modo unsafe (n unsafe


o seguro).

La sobrecarga de operadores se realiza de forma di Operadores de C#


ferente en C#.

Cadenas: en C++, una cadena es simplemente una string


matriz de caracteres. En C#, las cadenas son objetos
que admiten métodos sólidos de búsqueda. String

La palabra clave foreach permite recorrer en iterac foreach, in


ión las matrices y colecciones.
Globales: en C# no se admiten métodos y variables Estructura general de un programa en C#
globales. Los métodos y las variables deben estar c
ontenidos en class o struct.

Tipos importantes: en C++, los tipos comunes a var using


ios módulos se colocan en archivos de encabezado.
En C#, esta información está disponible a través de Información general sobre metadatos
metadatos.
Las variables locales de C# no se pueden utilizar an Métodos (Guía de programación de C#)
tes de su inicialización.

Administración de la memoria: C++ no es un lengu Recolección de elementos no utilizados


aje con recolector de elementos no utilizados; la me
moria que no se libera explícitamente permanece a
signada hasta que el proceso termina. C# es un len
guaje con recolector de elementos no utilizados.

Destructores: C# tiene una sintaxis diferente para li Destructores


berar recursos no administrados de forma determi
nista. using (Instrucción, Referencia de C#)

Constructores: de forma similar a lo que ocurre en Constructores de instancia


C++, si no se proporciona un constructor de clase e
n C#, se genera automáticamente un constructor pr Tabla de valores predeterminados
edeterminado. El constructor predeterminado inicia
liza todos los campos de la estructura con sus valor
es predeterminados.

C# no admite campos de bits. Campos de bits en C++

Los servicios de entrada y salida de C# y el formato Paseo por el lenguaje C#


los proporciona la biblioteca en tiempo de ejecució
n de .NET Framework. Tabla de formatos de presentación para valores numéricos

En C#, los parámetros de los métodos no pueden te Error del compilador CS0241
ner valores predeterminados. Utilice sobrecargas d
e métodos para obtener ese efecto.

En C# los métodos y tipos genéricos permiten la pa Elementos genéricos en C#


rametrización de tipos de manera similar a las plan
tillas de C++, aunque existen diferencias significati
vas.

La palabra clave as es similar a una conversión está as (Referencia de C#)


ndar, salvo que, si se produce un error en la conver
sión, el valor devuelto es nulo en lugar de producir
se una excepción. Esto es similar al uso de static_c
ast en C++, que, a diferencia de dynamic_cast, no
realiza ninguna comprobación en tiempo de ejecuci
ón y, por lo tanto, no produce una excepción en cas
o de error.

Para obtener más información sobre las comparaciones entre palabras clave en C# y en otros lenguajes de programación, vea
Equivalentes del lenguaje. Para obtener información sobre la estructura general de las aplicaciones de C#, vea
Estructura general de un programa de C# (Guía de programación de C#).
Vea también
Conceptos
Guía de programación de C#
Administración de elementos en proyectos
Utilizar el Explorador de soluciones
Desarrollo de aplicaciones con Visual C#

Escribir aplicaciones con Visual C#


C# es un lenguaje orientado a objetos con seguridad en el tratamiento de tipos, que es a la vez sencillo y potente y permite a
los programadores crear una gran variedad de aplicaciones. Combinado con .NET Framework, Visual C# permite la creación de
aplicaciones para Windows, servicios Web, herramientas de base de datos, componentes, controles y mucho más.
Esta sección contiene información sobre distintas tecnologías de plataformas de Microsoft en las que puede basar las
aplicaciones de C#.
En esta sección
Utilizar la Biblioteca de clases de .NET Framework (Visual C#)
Describe la utilización de los tipos de la biblioteca de clases de .NET Framework en proyectos de Visual C#.
Crear aplicaciones Web ASP.NET (Visual C#)
Describe la utilización del editor de código de C# en Visual Web Developer para crear aplicaciones Web con páginas de
código subyacente en C#.
Crear aplicaciones de Windows Forms (Visual C#)
Describe cómo utilizar los formularios Windows Forms para crear aplicaciones para Windows.
Crear aplicaciones de consola (Visual C#)
Explica cómo crear aplicaciones que no requieren una interfaz de usuario gráfica.
Obtener acceso y mostrar datos (Visual C#)
Describe cómo interactuar con bases de datos.
Crear aplicaciones móviles e incrustadas (Visual C#)
Describe cómo crear aplicaciones para Smart Device, dispositivos incrustados y dispositivos móviles thin-client.
Crear y obtener acceso a servicios Web (Visual C#)
Describe cómo interactuar con servicios Web XML.
Crear componentes (Visual C#)
Describe la creación de controles de usuario y otros componentes para .NET Framework.
Desarrollo en la plataforma Office (Visual C#)
Describe la utilización de Visual Studio Tools para Office para crear documentos inteligentes.
Desarrollo empresarial (Visual C#)
Describe el desarrollo de aplicaciones para SQL Server, Microsoft Exchange Server, etc.
Programación en Tablet PC (Visual C#)
Describe el desarrollo de aplicaciones basadas en tinta para Tablet PC.
Audio, vídeo, juegos y gráficos (Visual C#)
Describe la utilización de Windows Media y DirectX para código administrado.
Crear Starter Kits (Visual C#)
Describe cómo crear Starter Kits para ayudar a otros a ponerse rápidamente en marcha con su código de ejemplo.
Vea también
Otros recursos
Visual C#
Referencia de C#
Introducción a Visual C#
Utilizar el entorno IDE de Visual C#
Desarrollo de aplicaciones con Visual C#

Utilizar la Biblioteca de clases de .NET Framework (Visual C#)


La mayoría de los proyectos de desarrollo de Visual C# utilizan ampliamente la Biblioteca de clases de .NET Framework para
todo tipo de actividades, desde el acceso al sistema de archivos y la manipulación de cadenas hasta los controles de interfaz de
usuario de formularios Windows Forms y ASP.NET.
La biblioteca de clases se organiza en espacios de nombres, cada uno de los cuales contiene un conjunto de clases y
estructuras relacionadas. Por ejemplo, el espacio de nombres System.Drawing contiene numerosos tipos que representan
fuentes, lápices, líneas, formas, colores, etc.
utilizar Directivas y Referencias
Antes de poder utilizar las clases de un espacio de nombres determinado en un programa C#, es necesario agregar una
directiva using para el espacio de nombres en el archivo de código fuente de C#. En algunos casos, también se debe agregar
una referencia a la DLL que contiene el espacio de nombres; Visual C# agrega automáticamente referencias a las DLL de las
bibliotecas de clase utilizadas con más frecuencia. Puede ver qué referencias se han agregado en el Explorador de
soluciones, bajo el nodo Referencias. Para obtener más información, vea Crear un proyecto (Visual C#).
Una vez agregada la directiva using para un espacio de nombres, puede crear instancias de sus tipos, llamar a métodos y
responder a eventos como si se hubieran declarado en su propio código fuente. En el editor de código de Visual C#, también se
puede colocar el punto de inserción sobre el nombre de un tipo o miembro y presionar F1 para ver la documentación de
Ayuda. También se puede utilizar la herramienta Examinador de objetos y la función Metadatos como código fuente para
ver información de tipos en las clases y estructuras de .NET Framework. Para obtener más información, vea
Modelar y analizar código (Visual C#).
Para obtener más información
Para obtener más información sobre la biblioteca de clases de .NET Framework, vea
Información general de la biblioteca de clases de .NET Framework y Programación de .NET Framework.
Para obtener más información sobre la arquitectura de .NET Framework, vea
Información general acerca de .NET Framework.
El sitio Web .NET Framework Developer Center contiene numerosos artículos y ejemplos de código sobre la biblioteca de
clases.
Para obtener información sobre cómo realizar tareas específicas con las bibliotecas de clases, vea Cómo se utiliza C# o
haga clic en la opciónCómo del menú Ayuda de Visual C#.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Utilizar el entorno IDE de Visual C#
Desarrollo de aplicaciones con Visual C#

Crear aplicaciones Web ASP.NET (Visual C#)


ASP.NET proporciona un modelo de desarrollo Web unificado que incluye los servicios necesarios para crear aplicaciones Web
para la empresa. ASP.NET forma parte de .NET Framework y permite aprovechar al máximo las características de Common
Language Runtime (CLR), como la seguridad de tipos, la herencia, la interoperabilidad de lenguajes y las versiones.
Cuando utiliza Visual Studio para crear sitios Web ASP.NET, en realidad utiliza una parte del entorno de desarrollo integrado
(IDE) denominada Visual Web Developer. Visual Web Developer es diferente a Visual C#; tiene su propio diseñador para crear
interfaces de usuario en páginas Web y otras herramientas para el desarrollo Web y la administración de sitios Web. Pero si
crea páginas de código subyacente en C# para los controles Web, utiliza el editor de código de C# con todas sus características
disponibles en Visual Web Developer, como si estuviera en Visual C#.
Para obtener más información sobre cómo crear sitios Web y páginas Web ASP.NET, vea Visual Web Developer.
ASP.NET Developer Center en MSDN Online contiene muchos artículos útiles no incluidos en la documentación del producto.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear aplicaciones de Windows Forms (Visual C#)


Los formularios Windows Forms son la tecnología que se utiliza en Visual C# para crear aplicaciones para clientes inteligentes
basadas en Windows que se ejecutan en .NET Framework. Cuando crea un proyecto de aplicación para Windows, está creando
una aplicación basada en formularios Windows Forms. Utilizará el Diseñador de Windows Forms para crear la interfaz de
usuario y tendrá acceso a otras funciones de diseño y tiempo de ejecución:
Implementación ClickOnce.
Compatibilidad enriquecida de bases de datos con el control DataGridView.
Barras de herramientas y otros elementos de interfaz de usuario que pueden tener el aspecto y comportamiento de
Microsoft® Windows® XP, Microsoft Office o Microsoft Internet Explorer.
Para obtener más información, vea Diseñar una interfaz de usuario (Visual C#) y Formularios Windows Forms.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear aplicaciones de consola (Visual C#)


C# se puede utilizar para crear aplicaciones que admiten entrada de datos y muestran resultados en la consola de la línea de
comandos. Estas aplicaciones son ideales para aprender a programar en C#, porque la interfaz de usuario es sumamente
simple. Las aplicaciones de consola también resultan muy útiles para programas de utilidad que requieren poca o ninguna
interacción con el usuario.
Para crear una aplicación de consola en Visual C#, haga clic en Nuevo en el menú Archivo y seleccione Proyecto. Haga clic
en la plantilla de proyecto Aplicación de consola de C#, proporcione los nombres de archivo que desee y haga clic en Aceptar.
Uso de la clase System.Console
Utilice la clase Console para leer y escribir caracteres desde la consola, ya sea uno a uno o como una línea completa. Puede dar
formato al resultado de formas muy distintas. Para obtener más información, vea Información general sobre formatos.
Se puede tener acceso a los argumentos de la línea de comandos utilizando la matriz de cadena opcional asociada al método
Main. Para obtener más información, vea Argumentos de línea de comandos (Guía de programación de C#).

Ejemplos
Cómo crear un cliente de aplicación de consola
Ejemplo de parámetros de la línea de comandos
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Obtener acceso y mostrar datos (Visual C#)


En las aplicaciones de Visual C#, normalmente se conectará a bases de datos mediante la tecnología ADO.NET tal como se
expone en System.Data y en los espacios de nombres relacionados de la biblioteca de clases de .NET Framework. Para obtener
más información sobre cómo trabajar con datos, vea Obtener acceso a datos (Visual Studio).
En las aplicaciones de Windows Forms, el control principal de la interfaz de usuario para mostrar datos recuperados de bases
de datos es DataGridView. Para obtener más información, vea DataGridView (Control, formularios Windows Forms). La
conexión de los orígenes de datos a los controles de la interfaz de usuario, como cuadros de texto y cuadros de lista, se
simplifica significativamente gracias a una característica denominada vínculo de datos. Cuando se enlaza un control a un
campo de un origen de datos, los cambios realizados en cualquiera de ellos se reflejan automáticamente en el otro. Para
obtener más información, vea Enlace de datos en formularios Windows Forms.
Para obtener más información sobre cómo crear y administrar bases de datos, escribir procedimientos almacenados y otras
tareas relacionadas, vea Proyectos de SQL Server y los Tutoriales de SQL Server.
Los vínculos siguientes contienen información sobre cómo utilizar Visual Studio para obtener acceso a datos:
Crear aplicaciones de datos con Visual Studio
Visual Database Tools
En Internet, el Data Access and Storage Developer Center se actualiza continuamente con nuevos artículos y ejemplos.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear aplicaciones móviles e incrustadas (Visual C#)


Microsoft Visual Studio 2005 proporciona compatibilidad enriquecida e integrada para desarrollar software que se ejecute en
dispositivos inteligentes basados en Windows CE, como Pocket PC y Smartphones. Puede utilizar Visual C# para escribir
aplicaciones administradas que se ejecutan en .NET Compact Framework. Utilizará el mismo Editor de código, los mismos
diseñadores y la misma interfaz de depurador que utilizaría al desarrollar para PC. Simplemente seleccione una de las
plantillas de proyecto de Smart Device que se encuentre disponible para el lenguaje que se seleccione y comience la
codificación.
Visual Studio también proporciona emuladores para dispositivos inteligentes que permiten ejecutar y depurar el código en el
equipo de desarrollo, así como herramientas que simplifican el proceso de empaquetar la aplicación y sus recursos en archivos
CAB para su distribución a los dispositivos de los usuarios finales. Para obtener más información, vea Dispositivos inteligentes.
También puede utilizar Visual Web Developer para desarrollar aplicaciones Web móviles basadas en ASP.NET. Para obtener
más información, vea Introducción a las páginas Web de ASP.NET Mobile.
Para obtener la información más actualizada sobre la tecnología Windows Mobile, visite Mobile Developer Center.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear y obtener acceso a servicios Web (Visual C#)


Los servicios Web XML ofrecen a las aplicaciones la posibilidad de comunicarse en un entorno de correspondencia impreciso
mediante el uso de intercambios de mensajes predefinidos basados en protocolos estándar, como HTTP, XML, XSD, SOAP y
WSDL. Debido a que los protocolos y las especificaciones son públicos y no específicos de la aplicación, los servicios Web XML
se pueden utilizar para permitir que las aplicaciones se comuniquen tanto si residen en el mismo equipo como si no, aunque
residan en distintas plataformas o dispositivos.
No es necesario entender a fondo cada especificación para generar o consumir servicios Web. Las clases de .NET Framework y
los asistentes de Visual Studio ayudan a generar servicios Web XML y a interactuar con ellos mediante un familiar modelo de
programación orientada a objetos.
Para obtener más información sobre los servicios Web XML, vea Información general acerca de servicios Web XML.
Para obtener información sobre cómo crear y tener acceso a servicios Web XML mediante ASP.NET, vea
Servicios Web XML que utilizan ASP.NET.
Para obtener información sobre las herramientas que proporciona Visual Studio para ayudar a generar y consumir fácilmente
servicios Web XML, vea Servicios Web XML (Visual Studio).
Para obtener más información sobre cómo crear y tener acceso a servicios Web XML, vea
Servicios Web XML en código administrado.
El sitio Web Web Services Developer Center de MSDN Online ofrece artículos y recursos adicionales.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear componentes (Visual C#)


En el ámbito del software, el término componente se utiliza normalmente para referirse a un objeto reutilizable que expone
una o varias interfaces a clientes de forma normalizada. Un componente se puede implementar como clase única o como
conjunto de clases; el requisito principal es que la interfaz pública básica esté bien definida. Por ejemplo, en el contexto de la
programación nativa de Windows, el Modelo de objetos componentes (COM) requiere que todos los componentes
implementen la interfaz IUnknown además de cualquier otra interfaz especializada.
En el contexto de .NET Framework, un componente es una clase o un conjunto de clases que implementa la interfaz
IComponent o una interfaz derivada directa o indirectamente de una clase que implementa esta interfaz. La implementación de
la clase base predeterminada de la interfaz IComponent es Component.
Algunos de los componentes que más se utilizan en la programación con .NET Framework son los controles visuales que se
agregan a los formularios Windows Forms, como Button (Control, formularios Windows Forms),
ComboBox (Control, formularios Windows Forms), etc. Los componentes no visuales incluyen Timer Control, SerialPorty
ServiceController, entre otros.
Cuando se crea un componente en C#, lo pueden utilizar clientes escritos en cualquier otro lenguaje compatible con la
Common Language Specification.
Para crear sus propios componentes en Visual C#, puede utilizar el Diseñador de componentes para ensamblar clases de
componentes no visuales de la misma forma que ensambla formularios Windows Forms. Para obtener más información, vea
Tutorial: Crear una aplicación de servicios de Windows en el Diseñador de componentes.
Para obtener más información sobre la programación de componentes con Visual Studio, vea Componentes en Visual Studio.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Desarrollo en la plataforma Office (Visual C#)


Microsoft Visual Studio 2005 Tools para Microsoft Office System permite personalizar documentos de Microsoft Office y
Microsoft Office Outlook mediante código administrado. Visual Studio Tools para Office agrega nueva funcionalidad a Visual
Studio, como el alojamiento de Microsoft Office Word y Microsoft Office Excel a modo de diseñadores en el entorno de
desarrollo de Visual Studio, la posibilidad de programar directamente contra objetos de datos y presentación y la posibilidad
de utilizar controles de formularios Windows Forms en documentos y dentro del panel de tareas Acciones de documentos.
Para obtener información detallada sobre cómo desarrollar en la plataforma Office, consulte estos temas:
Lo nuevo en Visual Studio Tools para Office
Introducción a la programación de personalizaciones de nivel de documento para Excel
Introducción a la programación de personalizaciones de nivel de documento para Word
Introducción a la programación de complementos de nivel de aplicación
Tareas comunes en la programación de Office
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Desarrollo empresarial (Visual C#)


Puede programar en C# para desarrollar una gran variedad de aplicaciones empresariales que se ejecutan en arquitecturas
basadas en servidor y en productos de servidor. La sección Servers and Enterprise Development de MSDN Library contiene
instrucciones sobre la arquitectura, patrones e información sobre prácticas, así como documentación y artículos técnicos sobre
el uso de los productos de servidor de Microsoft, incluidos:
Microsoft SQL Server
Microsoft BizTalk Server
Microsoft Commerce Server
Microsoft Content Management Server
Microsoft Exchange Server
Microsoft Host Integration Server
Microsoft Internet Security and Acceleration Server 2000
Microsoft Business Solutions
Microsoft MapPoint
Microsoft Speech Server
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Programación en Tablet PC (Visual C#)


Un Tablet PC es un equipo con tecnología Microsoft® Windows® XP preparado para aplicaciones habilitadas para tinta, lápiz y
voz. La combinación de software y hardware de un Tablet PC permite estos métodos de interacción con el usuario y ofrece una
experiencia completa, interactiva y productiva a los usuarios.
La plataforma Tablet PC abarca Windows XP y sus extensiones, que permiten la entrada y salida de datos de escritura a mano y
voz en un Tablet PC además del intercambio de tales datos con otros equipos.
Para obtener más información, vea Windows XP Tablet PC Edition en MSDN Online y Tablet and Mobile PC Developer Center.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Tablet and Mobile PC Developer Center
Desarrollo de aplicaciones con Visual C#

Audio, vídeo, juegos y gráficos (Visual C#)


Puede utilizar Visual C# para crear aplicaciones multimedia basadas en las tecnologías DirectX para código administrado y
Windows Media.
DirectX administrado
Microsoft® DirectX® es un conjunto avanzado de interfaces de programación de aplicaciones (API) multimedia integrado en
los sistemas operativos Microsoft Windows®. DirectX proporciona una plataforma de desarrollo estándar para PC basados en
Windows que permite a los programadores tener acceso a las características de hardware especializadas sin tener que escribir
código específico del hardware. Esta tecnología se presentó por primera vez en 1995 y es una norma reconocida para el
desarrollo de aplicaciones multimedia en la plataforma Windows.
En pocas palabras, DirectX es una tecnología de Windows que permite un mayor rendimiento en gráficos, incluidos los gráficos
a todo color, vídeo, animación 3D y sonido, incluido el sonido envolvente, cuando juega o ve un vídeo en su PC.
Para obtener más información sobre cómo utilizar DirectX en aplicaciones de C#, vea DirectX 9.0 para código administrado en
MSDN Online y el Centro para desarrolladores de Microsoft DirectX.
Reproductor de Windows Media
El control ActiveX del Reproductor de Windows Media se puede utilizar en aplicaciones de C# para agregar funcionalidad de
audio y reproducción de vídeo. El Kit de desarrollo de software (SDK) del Reproductor de Windows Media 10 de Microsoft
proporciona información y herramientas para personalizar el Reproductor de Windows Media y para utilizar el control ActiveX
del Reproductor de Windows Media. El SDK incluye documentación y ejemplos de código que muestran cómo utilizar el
control ActiveX del Reproductor de Windows Media desde una aplicación de C#.
Para obtener más información, vea SDK del Reproductor de Windows Media 10 en MSDN Online.
Codificador de Windows Media
El SDK del Codificador de Windows Media serie 9 se puede programar con C# para realizar los siguientes tipos de tareas:
Difundir contenido activo. Una organización de noticias puede utilizar la API de automatización para programar la
captura y difusión automáticas de contenido activo. Por ejemplo, los departamentos locales de transporte pueden
transmitir imágenes en directo del estado de las carreteras en distintos puntos conflictivos para informar a los
conductores de la existencia de retenciones y recomendar rutas alternativas.
Contenido de proceso por lotes. Una organización de producción de medios que debe procesar un elevado volumen
de archivos de gran tamaño puede crear un proceso por lotes que utilice la API de automatización para capturar y
codificar repetidamente secuencias, una detrás de otra. Una corporación puede utilizar la API de automatización para
administrar sus servicios de transmisión multimedia con un lenguaje de secuencias de comandos de su elección y
Windows Scripting Host. Windows Script Host es un host independiente del lenguaje que se puede utilizar para ejecutar
cualquier motor de secuencias de comandos en los sistemas operativos Microsoft Windows® 95 o posterior,
Windows NT y Windows 2000.
Crear una interfaz de usuario personalizada Un proveedor de servicios de Internet (ISP) puede generar una interfaz
que utiliza la funcionalidad de la API de automatización para capturar, codificar y difundir secuencias multimedia.
Alternativamente, puede utilizar las interfaces de usuario predefinidas dentro de la API de automatización para el mismo
propósito.
Administrar de forma remota aplicaciones del Codificador de Windows Media. Puede utilizar la API de
automatización para ejecutar, administrar y solucionar problemas de aplicaciones del Codificador de Windows Media
desde un equipo remoto.
Para obtener más información, vea SDK del Codificador de Windows Media serie 9 en MSDN Online. El tema
Programación con C# describe las referencias que se deben incluir para trabajar en C#.
Servidor de Windows Media
El Kit de desarrollo de software (SDK) de los servicios de Windows Media® de Microsoft® serie 9 es una eficaz interfaz de
programación de aplicaciones (API) basada en automatización para quienes quieran desarrollar una aplicación de los Servicios
de Windows Media serie 9. Puede utilizar este SDK en C# para administrar mediante programación un servidor de Windows
Media para enviar contenido multimedia digital a clientes tanto en redes de unidifusión como de multidifusión. Para obtener
más información, vea SDK de los Servicios de Windows Media serie 9.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Desarrollo de aplicaciones con Visual C#

Crear Starter Kits (Visual C#)


Un starter kit contiene código para una aplicación completa y documentación que explica cómo modificar o ampliar la
aplicación. Visual C# 2005 ofrece dos starter kits a los que se puede tener acceso desde el cuadro de diálogo Nuevo proyecto.
También puede crear sus propios starter kits para ayudar a los usuarios a ponerse rápidamente en marcha con cualquier tipo
de aplicación. Crear un starter kit es fundamentalmente igual que crear una plantilla de proyecto normal, la única diferencia es
que un starter kit contiene archivos de documentación configurados para que se abran cuando se cree un proyecto basado en
el starter kit.
Para obtener más información, vea Introducción a Starter Kits.
Vea también
Otros recursos
Escribir aplicaciones con Visual C#
Guía de programación de C#

Guía de programación de C#
En esta sección se ofrece información detallada sobre las principales características del lenguaje C# y sobre las características
accesibles para C# a través de .NET Framework.
Secciones Idioma
Dentro de un programa de C#
Main() y argumentos de línea de comandos (Guía de programación de C#)
Tipos de datos (Guía de programación de C#)
Matrices (Guía de programación de C#)
Cadenas (Guía de programación de C#)
Instrucciones, expresiones y operadores (Guía de programación de C#)
Objetos, clases y estructuras (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Delegados (Guía de programación de C#)
Eventos (Guía de programación de C#)
Genéricos (Guía de programación de C#)
Iteradores (Guía de programación de C#)
Espacios de nombres (Guía de programación de C#)
Tipos que aceptan valores NULL (Guía de programación de C#)
Código no seguro y punteros (Guía de programación de C#)
Comentarios de documentación XML (Guía de programación de C#)
Secciones Plataforma
Dominios de aplicación (Guía de programación de C#)
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Atributos (Guía de programación de C#)
Clases de colección (Guía de programación de C#)
Excepciones y control de excepciones (Guía de programación de C#)
Interoperabilidad (Guía de programación de C#)
Subprocesamiento (Guía de programación de C#)
Rendimiento (Guía de programación de C#)
Reflexión (Guía de programación de C#)
Archivos DLL de C# (Guía de programación de C#)
Seguridad (Guía de programación de C#)
Vea también
Otros recursos
Referencia de C#
Visual C#
Guía de programación de C#

Dentro de un programa de C#
La sección trata la estructura general de un programa de C# e incluye el ejemplo estándar "Hello, World!".
En esta sección
Hello World, su primer programa (Guía de programación de C#)
Estructura general de un programa de C# (Guía de programación de C#)
Secciones relacionadas
Introducción a Visual C#
Migrar a Visual C#
Guía de programación de C#
Referencia de C#
Ejemplos de Visual C#
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1 Introducción
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Hello World, su primer programa (Guía de programación de


C#)
El siguiente programa de consola es la versión de C# del tradicional programa "Hello World!", el cual muestra en pantalla la
cadena Hello World!.
C#
using System;
// A "Hello World!" program in C#
namespace HelloWorld
{
class Hello
{
static void Main()
{
System.Console.WriteLine("Hello World!");
}
}
}

Analicemos ahora las partes importantes de este programa.


Comentarios
La primera línea contiene un comentario:
C#
// A "Hello World!" program in C#

Los caracteres // convierten el resto de la línea en un comentario. Un bloque de texto también se puede convertir en
comentario si se coloca entre los caracteres /* y */, por ejemplo:
C#
/* A "Hello World!" program in C#.
This program displays the string "Hello World!" on the screen. */

El método Main
Cualquier programa en C# debe contener un método Main, en el cual se inicia y se termina la ejecución. Este método es donde
se crean objetos y se ejecutan otros métodos.
El método Main es un método estático que reside dentro de una clase o una estructura. En el ejemplo "Hello World!", se
encuentra en una clase denominada Hello. Declare el método Main de una de las maneras siguientes:
Puede devolver void:
C#
static void Main()
{
//...
}

También puede devolver un valor de tipo int:


C#
static int Main()
{
//...
return 0;
}

Puede utilizar argumentos con los dos tipos devueltos:


C#
static void Main(string[] args)
{
//...
}

O bien
C#
static int Main(string[] args)
{
//...
return 0;
}

El parámetro del método Main es una matriz de tipo string que representa los argumentos de la línea de comandos utilizados
para llamar al programa. Observe que, a diferencia de C++, esta matriz no incluye el nombre del archivo ejecutable (exe).
Para obtener más información sobre cómo utilizar los argumentos de la línea de comandos, vea el ejemplo de
Main() y argumentos de línea de comandos (Guía de programación de C#) y
Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#).
Entrada y salida
Los programas de C# utilizan normalmente los servicios de entrada y salida que ofrece la biblioteca en tiempo de ejecución de
.NET Framework. La instrucción System.Console.WriteLine("Hello World!"); utiliza el método WriteLine, que es uno de los
métodos de salida de la clase Console de la biblioteca en tiempo de ejecución. Muestra el parámetro cadena en la secuencia de
salida estándar seguido por una nueva línea. Otros métodos de Console se utilizan para otras operaciones de entrada y salida.
Si incluye la directiva using System; al principio del programa, puede utilizar directamente las clases y métodos de System sin
escribir el nombre completo. Por ejemplo, puede llamar en su lugar Console.WriteLine, sin especificar
System.Console.Writeline:

C#
using System;

C#
Console.WriteLine("Hello World!");

Para obtener más información sobre métodos de entrada y salida, vea System.IO.
Compilación y ejecución
El programa "Hello World!" se puede compilar creando un proyecto en el Entorno de desarrollo integrado (IDE) de Visual
Studio, o bien mediante la línea de comandos. Utilice el símbolo del sistema de Visual Studio o ejecute vsvars32.bat para
incluir el conjunto de herramientas de Visual C# en la ruta de acceso del símbolo del sistema.
Para compilar el programa desde la línea de comandos:
Cree el archivo de código fuente mediante cualquier editor de texto y guárdelo con un nombre como Hello.cs. Los
archivos de código fuente de C# utilizan la extensión .cs.
Para invocar el compilador, ejecute el comando:
csc Hello.cs

Si el programa no contiene errores de compilación, se creará un archivo Hello.exe.


Para ejecutar el programa, escriba el comando:
Hello

Para obtener más información sobre el compilador de C# y sus opciones, vea Opciones del compilador de C#.
Vea también
Referencia
Dentro de un programa de C#
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Referencia de C#
Guía de programación de C#

Estructura general de un programa de C# (Guía de


programación de C#)
Los programas en C# pueden constar de uno o varios archivos. Cada archivo puede contener cero o varios espacios de
nombres. Un espacio de nombres puede contener tipos como clases, estructuras, interfaces, enumeraciones y delegados,
además de otros espacios de nombres. A continuación, se muestra el esqueleto de un programa en C# que contiene todos
estos elementos.
C#
// A skeleton of a C# program
using System;
namespace YourNamespace
{
class YourClass
{
}

struct YourStruct
{
}

interface IYourInterface
{
}

delegate int YourDelegate();

enum YourEnum
{
}

namespace YourNestedNamespace
{
struct YourStruct
{
}
}
class YourMainClass
{
static void Main(string[] args)
{
//Your program starts here...
}
}
}

Secciones relacionadas
Para obtener más información:
Clases (Guía de programación de C#)
Estructuras (Guía de programación de C#)
Espacios de nombres (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Delegados (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.2 Estructura del programa
9.1 Unidades de compilación (espacios de nombres)
Vea también
Referencia
Dentro de un programa de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Ejemplos de Visual C#
Guía de programación de C#

Main() y argumentos de línea de comandos (Guía de


programación de C#)
El método Main es el punto de entrada del programa, donde crea objetos e invoca otros métodos. En un programa de C#, sólo
puede haber un punto de entrada.
C#
class TestClass
{
static void Main(string[] args)
{
// Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}
}

Información general
El método Main es el punto de entrada del programa, donde se inicia y finaliza el control.
Se declara dentro de una clase o una estructura. Debe ser estático y no debería ser público. (En el ejemplo anterior, recibe
el acceso predeterminado de privado.)
Puede tener un tipo de valor devuelto void o int.
El método Main se puede declarar con o sin parámetros.
Los parámetros se pueden leer como argumentos de la línea de comandos indizados basados en cero.
A diferencia de C y C++, el nombre del programa no se trata como el primer argumento de la línea de comandos.
En esta sección
Argumentos de línea de comandos (Guía de programación de C#)
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Valores devueltos de Main() (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.1 Hello World
Vea también
Referencia
Dentro de un programa de C#
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Guía de programación de C#

Argumentos de línea de comandos (Guía de programación de


C#)
Se pueden utilizar argumentos en el método Main; si se utilizan, tendrá una de las formas siguientes:
C#
static int Main(string[] args)

C#
static void Main(string[] args)

El parámetro del método Main es una matriz de tipo String que representa los argumentos de la línea de comandos.
Normalmente se utiliza la propiedad Length para comprobar si existen argumentos; por ejemplo:
C#
if (args.Length == 0)
{
System.Console.WriteLine("Please enter a numeric argument.");
return 1;
}

También se pueden convertir los argumentos de tipo string en tipos numéricos mediante la clase Convert el método Parse.
Por ejemplo, la instrucción siguiente convierte la cadena en un número long utilizando el método Parse en la clase Int64:

long num = Int64.Parse(args[0]);

También se puede utilizar el tipo long de C#, que equivale a Int64:

long num = long.Parse(args[0]);

Igualmente, es posible usar el método ToInt64 de la clase Convert para lograr el mismo objetivo:

long num = Convert.ToInt64(s);

Para obtener más información, vea Parse y Convert.


Ejemplo
En este ejemplo, el programa toma un argumento en tiempo de ejecución, lo convierte en un número entero y calcula el
factorial del número. Si no se proporciona ningún argumento, el programa emite un mensaje en el que se describe la forma de
utilizarlo correctamente.
C#
// arguments: 3

C#
public class Functions
{
public static long Factorial(int n)
{
if (n < 0) { return -1; } //error result - undefined
if (n > 256) { return -2; } //error result - input is too big
if (n == 0) { return 1; }

// Calculate the factorial iteratively rather than recursively:


long tempResult = 1;
for (int i = 1; i <= n; i++)
{
tempResult *= i;
}
return tempResult;
}
}

C#
class MainClass
{
static int Main(string[] args)
{
// Test if input arguments were supplied:
if (args.Length == 0)
{
System.Console.WriteLine("Please enter a numeric argument.");
System.Console.WriteLine("Usage: Factorial <num>");
return 1;
}

try
{
// Convert the input arguments to numbers:
int num = int.Parse(args[0]);

System.Console.WriteLine("The Factorial of {0} is {1}.", num, Functions.Factori


al(num));
return 0;
}
catch (System.FormatException)
{
System.Console.WriteLine("Please enter a numeric argument.");
System.Console.WriteLine("Usage: Factorial <num>");
return 1;
}
}
}

Resultado
The Factorial of 3 is 6.

Comentarios
A continuación se muestran dos ejecuciones de ejemplo del programa en las que se supone que el nombre del programa es
Factorial.exe.
Ejecución nº 1:
Escriba la siguiente línea de comandos:
Factorial 10

Obtiene el resultado siguiente:


The Factorial of 10 is 3628800.
Ejecución nº 2:
Escriba la siguiente línea de comandos:
Factorial

Obtiene el resultado siguiente:


Please enter a numeric argument.
Usage: Factorial <num>

Para obtener más ejemplos sobre cómo utilizar los argumentos de la línea de comandos, vea el ejemplo de
Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#).
Vea también
Tareas
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Referencia
Main() y argumentos de línea de comandos (Guía de programación de C#)
Valores devueltos de Main() (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Mostrar argumentos de línea de comandos (Guía de


programación de C#)
Los argumentos proporcionados a una aplicación ejecutable en la línea de comandos son accesibles a través de un parámetro
opcional de Main. Los argumentos se proporcionan en forma de matriz de cadenas. Cada elemento de la matriz contiene un
argumento. Se quita el espacio en blanco entre los argumentos. Por ejemplo, considere estas invocaciones de la línea de
comandos de una aplicación ejecutable ficticia:
Entrada en la línea de comandos Matriz de cadenas pasadas a Main
executable.exe a b c "a"
"b"
"c"

executable.exe one two "one"


"two"

executable.exe “one two” three "one two"


"three"

Ejemplo
Este ejemplo muestra los argumentos de la línea de comandos pasados a una aplicación de línea de comandos. El resultado
mostrado es para la primera entrada de la tabla anterior.
C#
class CommandLine
{
static void Main(string[] args)
{
// The Length property provides the number of array elements
System.Console.WriteLine("parameter count = {0}", args.Length);

for (int i = 0; i < args.Length; i++)


{
System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
}
}
}

Resultados
parameter count = 3
Arg[0] = [a]
Arg[1] = [b]
Arg[2] = [c]

Vea también
Tareas
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Referencia
Main() y argumentos de línea de comandos (Guía de programación de C#)
Valores devueltos de Main() (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Obtener acceso a argumentos de línea de comandos


mediante Foreach (Guía de programación de C#)
Otro enfoque para recorrer en iteración la matriz es utilizar la instrucción foreach como se muestra en este ejemplo. La
instrucción foreach se puede utilizar para recorrer en iteración una matriz, una clase de colección de .NET Framework o
cualquier clase o estructura que implemente la interfaz IEnumerable.
Ejemplo
En este ejemplo se muestra cómo imprimir los argumentos de la línea de comandos con foreach.
C#
// arguments: John Paul Mary

C#
class CommandLine2
{
static void Main(string[] args)
{
System.Console.WriteLine("Number of command line parameters = {0}", args.Length);

foreach (string s in args)


{
System.Console.WriteLine(s);
}
}
}

Resultados
Number of command line parameters = 3
John
Paul
Mary

Vea también
Tareas
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Referencia
foreach, in (Referencia de C#)
Main() y argumentos de línea de comandos (Guía de programación de C#)
Valores devueltos de Main() (Guía de programación de C#)
Array
System.Collections
Conceptos
Guía de programación de C#
Guía de programación de C#

Valores devueltos de Main() (Guía de programación de C#)


El método Main puede ser de tipo void:
C#
static void Main()
{
//...
}

También puede devolver un valor de tipo int:


C#
static int Main()
{
//...
return 0;
}

Si no se va a utilizar el valor que devuelve el método Main, entonces devolver void permite crear un código un poco más
simple. Sin embargo, devolver un entero permite que el programa relacione información de estado con otros programas o
secuencias de comandos que invocan al ejecutable. En el ejemplo siguiente se muestra cómo utilizar el valor que devuelve
Main.

Ejemplo
En este ejemplo, se utiliza un archivo de proceso por lotes para ejecutar un programa y probar el valor que devuelve la función
Main. Cuando un programa se ejecuta en Windows, cualquier valor que devuelva la función Main se almacena en una variable
de entorno denominada ERRORLEVEL. Al inspeccionar la variable ERRORLEVEL, los archivos de proceso por lotes pueden
determinar en consecuencia el resultado de la ejecución. Tradicionalmente, un valor devuelto de cero indica una ejecución
correcta. El programa que se muestra a continuación es un programa muy simple que devuelve un valor de cero desde la
función Main.
C#
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}

Dado que este ejemplo utiliza un archivo de proceso por lotes, es mejor compilar el código desde la línea de comandos, como
se muestra en Cómo: Establecer variables de entorno.
Luego, se utiliza un archivo de proceso por lotes para invocar al ejecutable que resulta del ejemplo de código anterior. Puesto
que el código devuelve un valor de cero, el archivo de proceso por lotes creará un informe de operación correcta, pero si el
código anterior se cambia para que devuelva un valor distinto de cero y luego se vuelve a compilar, la ejecución posterior del
archivo de proceso por lotes indicará un error.

rem test.bat
@echo off
MainReturnValueTest
@if "%ERRORLEVEL%" == "0" goto good
:fail
echo Execution Failed
echo return value = %ERRORLEVEL%
goto end

:good
echo Execution Succeded
echo return value = %ERRORLEVEL%
goto end

:end

Resultados del ejemplo


Execution Succeded
return value = 0

Vea también
Tareas
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Referencia
Main() y argumentos de línea de comandos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Guía de programación de C#

Tipos de datos (Guía de programación de C#)


C# es un lenguaje con establecimiento inflexible de tipos; por lo tanto, cada variable y objeto debe tener un tipo declarado.
Información general sobre los tipos de datos
Un tipo de datos se puede describir como:
Un tipo de datos integrado, como int o char, o bien
Un tipo de datos definidos por el usuario, como class o interface.
Los tipos de datos también se pueden definir como:
Tipos de valores (Referencia de C#), que almacenan los valores, o bien
Tipos de referencia (Referencia de C#), que almacenan referencias a los datos reales.
Secciones relacionadas
Para obtener más información:
Conversión (Guía de programación de C#)
Conversión boxing y unboxing (Guía de programación de C#)
Tipos (Referencia de C#)
Objetos, clases y estructuras (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información sobre los tipos, vea las secciones siguientes de Especificación del lenguaje C#:
1.3 Tipos y variables
3.8 Espacios de nombres y nombres de tipos
4.1 Tipos de valor
4.2 Tipos de referencia
4.3 Boxing y Unboxing
Vea también
Referencia
Tipos de datos comparados en diferentes lenguajes
Tabla de tipos integrales (Guía de programación de C#)
Conceptos
Guía de programación de C#
Conversión de tipos de datos XML
Otros recursos
Referencia de C#
Guía de programación de C#

Conversión (Guía de programación de C#)


La conversión entre tipos de datos se puede hacer de forma explícita utilizando una conversión de tipos; en algunos casos, se
permiten conversiones implícitas. Por ejemplo:
C#
static void TestCasting()
{
int i = 10;
float f = 0;
f = i; // An implicit conversion, no data will be lost.
f = 0.5F;
i = (int)f; // An explicit conversion. Information will be lost.
}

Una conversión de tipos invoca de forma explícita al operador de conversión de un tipo a otro. En la conversión de tipos se
producirá un error si no se ha definido ninguno de estos operadores. Puede escribir operadores de conversión personalizados
para convertir entre los tipos definidos por el usuario. Para obtener más información sobre la definición de un operador de
conversión, vea explicit (Referencia de C#) e implicit (Referencia de C#).
Ejemplo
El siguiente programa convierte explícitamente un tipo double en un tipo int. El programa no se compilará sin el operador de
conversión de tipo.
C#
class Test
{
static void Main()
{
double x = 1234.7;
int a;
a = (int)x; // cast double to int
System.Console.WriteLine(a);
}
}

Resultado
1234

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.6.6 Expresiones de conversión
6.1 Conversiones implícitas
6.2 Conversiones explícitas
Vea también
Referencia
Tipos de datos (Guía de programación de C#)
Operador () (Referencia de C#)
explicit (Referencia de C#)
implicit (Referencia de C#)
Conceptos
Guía de programación de C#
Operadores de conversión (Guía de programación de C#)
Conversión de tipos generalizada
Conversión explícita
Conversión de tipos exportados
Guía de programación de C#

Conversión boxing y unboxing (Guía de programación de C#)


Las conversiones boxing y unboxing permiten tratar los tipos de valor como objetos. La aplicación de la conversión boxing a
un tipo de valor empaqueta el tipo en una instancia del tipo de referencia Object. Esto permite almacenar el tipo de valor en el
montón del recolector de elementos no utilizados. La conversión unboxing extrae el tipo de valor del objeto. En este ejemplo,
se aplica la conversión boxing a la variable de entero i y ésta se asigna al objeto o.
C#
int i = 123;
object o = (object)i; // boxing

A continuación, se puede aplicar la conversión unboxing al objeto o y asignarlo a la variable de entero i:


C#
o = 123;
i = (int)o; // unboxing

Rendimiento
Con relación a las asignaciones simples, las conversiones boxing y unboxing son procesos que consumen muchos recursos.
Cuando se aplica la conversión boxing a un tipo de valor, se debe asignar y construir un objeto completamente nuevo. En
menor grado, la conversión de tipos requerida para aplicar la conversión unboxing también es costosa. Para obtener más
información, vea Rendimiento (Guía de programación de C#).
Secciones relacionadas
Para obtener más información:
Conversión Boxing
Conversión Unboxing
Tipos de referencia
Tipos de valor

Especificación del lenguaje C#


Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.
4.3 Boxing y unboxing
Vea también
Conceptos
Guía de programación de C#
Tipos de valor a los que se ha aplicado la conversión boxing
Guía de programación de C#

Conversión boxing (Guía de programación de C#)


La conversión boxing se utiliza para almacenar tipos de valor en el montón de recolección de elementos no utilizados. Boxing
es una conversión implícita de Tipos de valores (Referencia de C#) al tipo object o a cualquier tipo de interfaz implementado
por este tipo de valor. Al aplicar la conversión boxing a un tipo de valor se asigna una instancia de objeto en el montón y copia
el valor en el nuevo objeto.
Considere la siguiente declaración de una variable de tipo de valor:
C#
int i = 123;

La siguiente instrucción aplica implícitamente la operación de boxing sobre la variable i:


C#
object o = i; // implicit boxing

El resultado de esta instrucción es crear una referencia de objeto o en la pila que hace referencia a un valor del tipo int en el
montón. Este valor es una copia del valor del tipo de valor asignado a la variable i. La diferencia entre las dos variables, i y o,
se muestra en la siguiente ilustración.
Conversión Boxing

También es posible realizar la conversión boxing de manera explícita, tal como se muestra en el ejemplo siguiente, pero ésta
nunca es necesaria:
C#
int i = 123;
object o = (object)i; // explicit boxing

Ejemplo
Este ejemplo convierte una variable de entero i a un objeto o mediante conversión boxing. A continuación, el valor
almacenado en la variable i se cambia de 123 a 456. El ejemplo muestra que el tipo de valor original y el objeto empaquetado
usan ubicaciones de memoria independientes y, por consiguiente, pueden almacenar valores diferentes.
C#
class TestBoxing
{
static void Main()
{
int i = 123;
object o = i; // implicit boxing
i = 456; // change the contents of i

System.Console.WriteLine("The value-type value = {0}", i);


System.Console.WriteLine("The object-type value = {0}", o);
}
}

Resultados
The value-type value = 456
The object-type value = 123

Especificación del lenguaje C#


Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#:
4.3.1 Conversiones boxing
Vea también
Conceptos
Guía de programación de C#
Conversión boxing y unboxing (Guía de programación de C#)
Conversión unboxing (Guía de programación de C#)
Tipos de valor a los que se ha aplicado la conversión boxing
Guía de programación de C#

Conversión unboxing (Guía de programación de C#)


Unboxing es una conversión explícita del tipo object a un tipo de valor o de un tipo de interfaz a un tipo de valor que
implementa la interfaz. Una operación de unboxing consiste en:
Comprobar la instancia de objeto para asegurar que se trata de un valor convertido mediante boxing del tipo de valor
dado.
Copiar el valor de la instancia en la variable de tipo de valor.
Las siguientes instrucciones muestran las operaciones de boxing y unboxing:
C#
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing

La siguiente ilustración muestra el resultado de las instrucciones anteriores.


Conversión Unboxing

Para que la conversión Unboxing de tipos de valores sea correcta en tiempo de ejecución, el elemento al que se aplica debe ser
una referencia a un objeto creado previamente mediante la conversión Boxing de una instancia de dicho tipo de valor. Si se
intenta aplicar la conversión unboxing a null o a una referencia a un tipo de valor incompatible, producirá una excepción
InvalidCastException.
Ejemplo
El ejemplo siguiente muestra un caso de conversión unboxing no válida y la excepción InvalidCastExceptionresultante. Si se
utiliza try y catch, se muestra un mensaje de error cuando se produce el error.
C#
class TestUnboxing
{
static void Main()
{
int i = 123;
object o = i; // implicit boxing
try
{
int j = (short)o; // attempt to unbox
System.Console.WriteLine("Unboxing OK.");
}
catch (System.InvalidCastException e)
{
System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);
}
}
}

Resultado
Specified cast is not valid. Error: Incorrect unboxing.

Si cambia la instrucción:
int j = (short) o;

a:
int j = (int) o;

la conversión se realizará y se obtendrá el resultado:


Unboxing OK.

Vea también
Conceptos
Guía de programación de C#
Conversión boxing y unboxing (Guía de programación de C#)
Conversión boxing (Guía de programación de C#)
Guía de programación de C#

Matrices (Guía de programación de C#)


Una matriz es una estructura de datos que contiene una serie de variables del mismo tipo. Las matrices se declaran con un
tipo:
type[] arrayName;

Los ejemplos siguientes crean matrices unidimensionales, multidimensionales y escalonadas:


C#
class TestArraysClass
{
static void Main()
{
// Declare a single-dimensional array
int[] array1 = new int[5];

// Declare and set array element values


int[] array2 = new int[] { 1, 3, 5, 7, 9 };

// Alternative syntax
int[] array3 = { 1, 2, 3, 4, 5, 6 };

// Declare a two dimensional array


int[,] multiDimensionalArray1 = new int[2, 3];

// Declare and set array element values


int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };

// Declare a jagged array


int[][] jaggedArray = new int[6][];

// Set the values of the first array in the jagged array structure
jaggedArray[0] = new int[4] { 1, 2, 3, 4 };
}
}

Información general sobre las matrices


Una matriz tiene las propiedades siguientes:
Una matriz puede ser unidimensional, multidimensional o escalonada.
El valor predeterminado de los elementos numéricos de matriz se establece en cero y el de los elementos de referencia
se establece en null.
Una matriz escalonada es una matriz de matrices y por consiguiente sus elementos son tipos de referencia y se
inicializan en null.
Las matrices se indizan basadas en cero: una matriz con n elementos se indiza desde 0 hasta n-1.
Los elementos de una matriz pueden ser de cualquier tipo, incluido el tipo matriz.
Los tipos de matriz son tipos de referencia derivados del tipo base abstracto Array. Puesto que este tipo implementa
IEnumerable e IEnumerable, puede utilizar la iteración foreach en todas las matrices de C#.
Secciones relacionadas
Utilizar matrices como objetos (Guía de programación de C#)
Utilizar foreach son matrices (Guía de programación de C#)
Pasar matrices como parámetros (Guía de programación de C#)
Pasar matrices mediante Ref y Out (Guía de programación de C#)
Ejemplo Arrays
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.8 Matrices
12 Matrices
Vea también
Referencia
Instrucciones de uso de matrices
Conceptos
Guía de programación de C#
Clases de colección (Guía de programación de C#)
Tipo de colección Array
Matrices en el sistema de tipos común
Guía de programación de C#

Utilizar matrices como objetos (Guía de programación de C#)


En C#, las matrices son de hecho objetos, y no simplemente regiones direccionables de memoria contigua como ocurre en C y
C++. Array es el tipo base abstracto de todos los tipos de matriz. Las propiedades y otros miembros de la clase Array se
pueden utilizar cuando sea necesario. Un ejemplo de esto sería utilizar la propiedad Lengthpara obtener la longitud de una
matriz. El siguiente código asigna la longitud de la matriz numbers, que es 5, a una variable denominada lengthOfNumbers:
C#
int[] numbers = { 1, 2, 3, 4, 5 };
int lengthOfNumbers = numbers.Length;

La clase System.Array proporciona muchos otros métodos y propiedades útiles para ordenar, buscar y copiar matrices.
Ejemplo
En este ejemplo se utiliza la propiedad Rank para mostrar el número de dimensiones de una matriz.
C#
class TestArraysClass
{
static void Main()
{
// Declare and initialize an array:
int[,] theArray = new int[5, 10];
System.Console.WriteLine("The array has {0} dimensions.", theArray.Rank);
}
}

Resultado
The array has 2 dimensions.

Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices multidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Matrices unidimensionales (Guía de programación de C#)


Una matriz de cinco elementos enteros se puede declarar como se muestra en el ejemplo siguiente:
C#
int[] array = new int[5];

Esta matriz contiene elementos desde array[0] hasta array[4]. El operador new se utiliza para crear la matriz e inicializar sus
elementos con valores predeterminados. En este ejemplo, todos los elementos de la matriz se inicializan con cero.
Una matriz que almacena elementos de cadena se puede declarar del mismo modo. Por ejemplo:
C#
string[] stringArray = new string[6];

Inicialización de matrices
Es posible inicializar una matriz en el momento de su declaración, en cuyo caso, no es necesario el especificador de rango ya
que éste viene dado por el número de elementos de la lista de inicialización. Por ejemplo:
C#
int[] array1 = new int[5] { 1, 3, 5, 7, 9 };

Una matriz de cadena se puede inicializar del mismo modo. A continuación, se muestra una declaración de una matriz de
cadena en la que cada elemento de la matriz se inicializa con el nombre de un día de la semana:
C#
string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Cuando se inicializa una matriz en el momento de su declaración, se pueden utilizar los siguientes métodos abreviados:
C#
int[] array2 = { 1, 3, 5, 7, 9 };
string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Es posible declarar una variable de matriz sin inicializarla, pero se debe utilizar el operador new al asignar una matriz a esta
variable. Por ejemplo:
C#
int[] array3;
array3 = new int[] { 1, 3, 5, 7, 9 }; // OK
//array3 = {1, 3, 5, 7, 9}; // Error

Matrices de tipo de valor y tipo de referencia


Considere la siguiente declaración de matriz:
C#
SomeType[] array4 = new SomeType[10];

El resultado de esta instrucción depende de si SomeType es un tipo de valor o un tipo de referencia. Si es un tipo de valor, la
instrucción genera una matriz de 10 instancias del tipo SomeType. Si SomeType es un tipo de referencia, la instrucción crea una
matriz de 10 elementos, cada uno de los cuales se inicializa con una referencia nula.
Para obtener más información sobre los tipos de valor y los tipos de referencia, vea Tipos (Referencia de C#).
Vea también
Referencia
Matrices multidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Array
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Matrices multidimensionales (Guía de programación de C#)


Las matrices pueden tener varias dimensiones. Por ejemplo, la siguiente declaración crea una matriz bidimensional de cuatro
filas y dos columnas:
C#
int[,] array = new int[4, 2];

Esta otra declaración crea una matriz de tres dimensiones, 4, 2 y 3:


C#
int[, ,] array1 = new int[4, 2, 3];

Inicialización de matrices
La matriz se puede inicializar en la declaración como se muestra en el ejemplo siguiente:
C#
int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
int[, ,] array3D = new int[,,] { { { 1, 2, 3 } }, { { 4, 5, 6 } } };

También se puede inicializar la matriz sin especificar el rango:


C#
int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

Si opta por declarar una variable de matriz sin inicializarla, deberá utilizar el operador new para asignar una matriz a la
variable. Por ejemplo:
C#
int[,] array5;
array5 = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // OK
//array5 = {{1,2}, {3,4}, {5,6}, {7,8}}; // Error

Asimismo, es posible asignar un valor a un elemento de una matriz, por ejemplo:


C#
array5[2, 1] = 25;

El ejemplo de código siguiente inicializa las variables de matriz con el valor predeterminado (salvo las matrices escalonadas):
C#
int[,] array6 = new int[10, 10];

Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Matrices escalonadas (Guía de programación de C#)


Una matriz escalonada es una matriz cuyos elementos son matrices. Los elementos de una matriz escalonada pueden ser de
diferentes dimensiones y tamaños. Una matriz escalonada se denomina también "matriz de matrices". Los ejemplos siguientes
muestran cómo declarar, inicializar y tener acceso a las matrices escalonadas.
A continuación, se muestra la declaración de una matriz unidimensional con tres elementos, cada uno de los cuales es una
matriz unidimensional de enteros:
C#
int[][] jaggedArray = new int[3][];

Para poder utilizar jaggedArray, se deben inicializar sus elementos. Los elementos se pueden inicializar de la siguiente manera:
C#
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];

Cada elemento es una matriz unidimensional de enteros. El primer elemento es una matriz de 5 enteros, el segundo es una
matriz de 4 enteros y el tercero es una matriz de 2 enteros.
También se pueden utilizar inicializadores para rellenar los elementos de la matriz con valores, en cuyo caso no es necesario
especificar el tamaño de la matriz: Por ejemplo:
C#
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };

Asimismo, se puede inicializar la matriz en el momento de la declaración de este modo:


C#
int[][] jaggedArray2 = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};

Puede utilizar el formulario abreviado siguiente. Observe que no se puede omitir el operador new de la inicialización de
elementos ya que no existe una inicialización predeterminada para los elementos:
C#
int[][] jaggedArray3 =
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};

Una matriz escalonada es una matriz de matrices y por consiguiente sus elementos son tipos de referencia y se inicializan en
null.
El acceso a elementos individuales de la matriz se realiza como en los siguientes ejemplos:
C#
// Assign 77 to the second element ([1]) of the first array ([0]):
jaggedArray3[0][1] = 77;

// Assign 88 to the second element ([1]) of the third array ([2]):


jaggedArray3[2][1] = 88;

Es posible combinar matrices multidimensionales con matrices escalonadas. A continuación, se muestra la declaración e
inicialización de una matriz escalonada unidimensional que contiene dos elementos de matriz bidimensionales de diferentes
tamaños:
C#
int[][,] jaggedArray4 = new int[3][,]
{
new int[,] { {1,3}, {5,7} },
new int[,] { {0,2}, {4,6}, {8,10} },
new int[,] { {11,22}, {99,88}, {0,9} }
};

Puede obtener acceso a los elementos individuales como se indica en este ejemplo, que muestra el valor del elemento [1,0]
de la primera matriz (valor 5):
C#
System.Console.Write("{0}", jaggedArray4[0][1, 0]);

El método Length devuelve el número de matrices contenido en la matriz escalonada. Por ejemplo, suponiendo que ha
declarado la matriz anterior, esta línea:
C#
System.Console.WriteLine(jaggedArray4.Length);

devolverá un valor de 3.
Ejemplo
En este ejemplo, se genera una matriz cuyos elementos son también matrices. Cada uno de los elementos de la matriz tiene un
tamaño diferente.
C#
class ArrayTest
{
static void Main()
{
// Declare the array of two elements:
int[][] arr = new int[2][];

// Initialize the elements:


arr[0] = new int[5] { 1, 3, 5, 7, 9 };
arr[1] = new int[4] { 2, 4, 6, 8 };

// Display the array elements:


for (int i = 0; i < arr.Length; i++)
{
System.Console.Write("Element({0}): ", i);
for (int j = 0; j < arr[i].Length; j++)
{
System.Console.Write("{0}{1}", arr[i][j], j == (arr[i].Length - 1) ? "" : "
");
}
System.Console.WriteLine();
}
}
}

Resultados
Element(0): 1 3 5 7 9
Element(1): 2 4 6 8

Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices multidimensionales (Guía de programación de C#)
Array
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Utilizar foreach son matrices (Guía de programación de C#)


C# dispone de la instrucción foreach. Esta instrucción proporciona un modo simple y limpio de recorrer en iteración los
elementos de una matriz. Por ejemplo, el siguiente código crea una matriz denominada numbers y la recorre mediante la
instrucción foreach:
C#
int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
System.Console.WriteLine(i);
}

Con matrices multidimensionales, se puede utilizar el mismo método para recorrer los elementos, por ejemplo:
C#
int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
foreach (int i in numbers2D)
{
System.Console.Write("{0} ", i);
}

El resultado de este ejemplo es:


9 99 3 33 5 55

Sin embargo, con matrices multidimensionales, utilizar un bucle for anidado proporciona más control sobre los elementos de
la matriz.
Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices multidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Array
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Pasar matrices como parámetros (Guía de programación de C#)


Las matrices se pueden pasar a los métodos como parámetros. Cuando las matrices son tipos de referencia, el método puede
cambiar el valor de los elementos.
Pasar matrices unidimensionales como parámetros
Una matriz unidimensional inicializada se puede pasar a un método. Por ejemplo:
C#
PrintArray(theArray);

El método llamado en la línea anterior se podría definir como:


C#
void PrintArray(int[] arr)
{
// method code
}

Asimismo, es posible inicializar y pasar una matriz en una sola operación. Por ejemplo:
C#
PrintArray(new int[] { 1, 3, 5, 7, 9 });

Ejemplo 1
En el siguiente ejemplo, una matriz de cadena se inicializa y se pasa como parámetro al método PrintArray, el cual muestra
los elementos de la matriz:
C#
class ArrayClass
{
static void PrintArray(string[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
}
System.Console.WriteLine();
}

static void Main()


{
// Declare and initialize an array:
string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
// Pass the array as a parameter:
PrintArray(weekDays);
}
}

Resultado 1
Sun Mon Tue Wed Thu Fri Sat

Pasar matrices multidimensionales como parámetros


Una matriz multidimensional inicializada se puede pasar a un método. Por ejemplo, si theArray es una matriz bidimensional:
C#
PrintArray(theArray);

El método llamado en la línea anterior se podría definir como:


C#
void PrintArray(int[,] arr)
{
// method code
}

Asimismo, es posible inicializar y pasar una matriz en una sola operación. Por ejemplo:
C#
PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } });

Ejemplo 2
En el siguiente ejemplo, una matriz bidimensional de cadena se inicializa y se pasa como parámetro al método PrintArray, el
cual muestra los elementos de la matriz:
C#
class ArrayClass2D
{
static void PrintArray(int[,] arr)
{
// Display the array elements:
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 2; j++)
{
System.Console.WriteLine("Element({0},{1})={2}", i, j, arr[i, j]);
}
}
}
static void Main()
{
// Pass the array as a parameter:
PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } });
}
}

Resultado 2
Element(0,0)=1
Element(0,1)=2
Element(1,0)=3
Element(1,1)=4
Element(2,0)=5
Element(2,1)=6
Element(3,0)=7
Element(3,1)=8

Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices multidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Pasar matrices mediante Ref y Out (Guía de programación de


C#)
Al igual que todos los parámetros out, un parámetro out de tipo de matriz debe asignarse antes de utilizarlo; es decir, debe
asignarlo el destinatario. Por ejemplo:
C#
static void TestMethod1(out int[] arr)
{
arr = new int[10]; // definite assignment of arr
}

Al igual que todos los parámetros ref, un parámetro ref de tipo de matriz debe asignarlo el llamador. Por consiguiente, no es
necesario que lo asigne el destinatario. Un parámetro ref de un tipo de matriz puede cambiar como resultado de la llamada.
Por ejemplo, a la matriz se le puede asignar el valor null o se puede inicializar con otra matriz. Por ejemplo:
C#
static void TestMethod2(ref int[] arr)
{
arr = new int[10]; // arr initialized to a different array
}

Los dos ejemplos siguientes muestran la diferencia entre out y ref cuando se utilizan para pasar matrices a métodos.
Ejemplo 1
En este ejemplo, la matriz theArray se declara en el llamador (el método Main) y se inicializa en el método FillArray. A
continuación, los elementos de la matriz se devuelven al método que realizó la llamada y se muestran.
C#
class TestOut
{
static void FillArray(out int[] arr)
{
// Initialize the array:
arr = new int[5] { 1, 2, 3, 4, 5 };
}

static void Main()


{
int[] theArray; // Initialization is not required

// Pass the array to the callee using out:


FillArray(out theArray);
// Display the array elements:
System.Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
System.Console.Write(theArray[i] + " ");
}
}
}

Resultado 1
Array elements are:
1 2 3 4 5
Ejemplo 2
En este ejemplo, la matriz theArray se inicializa en el llamador (el método Main) y se pasa al método FillArray mediante el
parámetro ref. Algunos de los elementos de la matriz se actualizan en el método FillArray. A continuación, los elementos de
la matriz se devuelven al método que realizó la llamada y se muestran.
C#
class TestRef
{
static void FillArray(ref int[] arr)
{
// Create the array on demand:
if (arr == null)
{
arr = new int[10];
}
// Fill the array:
arr[0] = 1111;
arr[4] = 5555;
}

static void Main()


{
// Initialize the array:
int[] theArray = { 1, 2, 3, 4, 5 };

// Pass the array using ref:


FillArray(ref theArray);

// Display the updated array:


System.Console.WriteLine("Array elements are:");
for (int i = 0; i < theArray.Length; i++)
{
System.Console.Write(theArray[i] + " ");
}
}
}

Resultado 2
Array elements are:
1111 2 3 4 5555

Vea también
Referencia
Matrices unidimensionales (Guía de programación de C#)
Matrices multidimensionales (Guía de programación de C#)
Matrices escalonadas (Guía de programación de C#)
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Cadenas (Guía de programación de C#)


Las secciones siguientes describen el tipo de datos string, que es un alias para la clase String.
En esta sección
Utilizar cadenas (Guía de programación de C#)
Cómo: Analizar cadenas con el método Split (Guía de programación de C#)
Cómo: Buscar cadenas mediante los métodos String (Guía de programación de C#)
Cómo: Buscar cadenas mediante expresiones regulares (Guía de programación de C#)
Cómo: Unir varias cadenas (Guía de programación de C#)
Cómo: Modificar el contenido de cadenas (Guía de programación de C#)
Secciones relacionadas
Operaciones básicas de cadenas
Comparar cadenas
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Utilizar cadenas (Guía de programación de C#)


Una cadena de C# es una matriz de caracteres que se declara utilizando la palabra clave string. Un literal de cadena se declara
utilizando las comillas, como se muestra en el siguiente ejemplo:
C#
string s = "Hello, World!";

Puede extraer subcadenas y concatenar cadenas de la siguiente manera:


C#
string s1 = "orange";
string s2 = "red";

s1 += s2;
System.Console.WriteLine(s1); // outputs "orangered"

s1 = s1.Substring(2, 5);
System.Console.WriteLine(s1); // outputs "anger"

Los objetos de cadena son inmutables, lo que significa que no se pueden cambiar una vez creados. Los métodos que actúan
sobre las cadenas, devuelven los nuevos objetos de cadena. En el ejemplo anterior, cuando el contenido de s1 y s2 se
concatenan para formar una sola cadena, las dos cadenas que contienen "orange" y "red" no se modifican. El operador +=
crea una nueva cadena que contiene el contenido combinado. Como resultado, s1 ahora hace referencia a una cadena
totalmente diferente. Todavía existe una cadena que sólo contiene "orange" , pero deja de hacerse referencia a ella cuando se
concatena s1.
Nota
Tenga cuidado cuando cree referencias a cadenas. Si crea una referencia a una cadena y después "modifica" la cadena, la refe
rencia seguirá señalando al objeto original y no al nuevo objeto que se creó cuando se modificó la cadena. Esta situación peli
grosa se ilustra en el código siguiente:

string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"

Dado que las modificaciones en las cadenas implican la creación de nuevos objetos de tipo string, por motivos de rendimiento,
la concatenación de un gran número de cadenas u otro tipo de manipulación de las cadenas debe realizarse con la clase
StringBuilder, como se muestra a continuación:
C#
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();

La clase StringBuilder se describe con mayor detalle en la sección "Utilizar Stringbuilder".


Trabajar con cadenas
Carácter de escape
Los caracteres de escape como "\n" y (nueva línea) y "\t" (tabulador) se pueden incluir en cadenas. La línea:
C#
string hello = "Hello\nWorld!";

equivale a:
Hello
World!

Si desea incluir una barra diagonal inversa, ésta debe estar precedida de otra barra diagonal inversa. La cadena siguiente:
C#
string filePath = "\\\\My Documents\\";

equivale a:
\\My Documents\

El símbolo @
El símbolo @ indica al constructor de cadena que debe omitir caracteres de escape y saltos de línea. Las dos cadenas siguientes
son, por consiguiente, idénticas:
C#
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";

ToString()
Al igual que todos los objetos derivados de Object, las cadenas proporcionan el método ToString, que convierte un valor en
una cadena. Este método se puede utilizar para convertir valores numéricos en cadenas de la siguiente manera:
C#
int year = 1999;
string msg = "Eve was born in " + year.ToString();
System.Console.WriteLine(msg); // outputs "Eve was born in 1999"

Tener acceso a los caracteres individuales


Se obtiene acceso a los caracteres individuales contenidos en una cadena utilizando métodos como SubString(), Replace(),,
Split() y Trim().
C#
string s3 = "Visual C# Express";

System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#"


System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express"

También es posible copiar los caracteres en una matriz de caracteres, tal como se muestra a continuación:
C#
string s4 = "Hello, World";
char[] arr = s4.ToCharArray(0, s4.Length);

foreach (char c in arr)


{
System.Console.Write(c); // outputs "Hello, World"
}
Puede obtener acceso a los caracteres individuales de una cadena con un índice:
C#
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
{
System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP"
}

Cambiar mayúsculas y minúsculas


Para cambiar las letras en una cadena a mayúsculas o minúsculas, se utiliza ToUpper() o ToLower(), de la siguiente forma:
C#
string s6 = "Battle of Hastings, 1066";

System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066"


System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066"

Comparaciones
La manera más simple de comparar dos cadenas es utilizar los operadores == y !=, que realizan una comparación con
distinción entre mayúsculas y minúsculas.
C#
string color1 = "red";
string color2 = "green";
string color3 = "red";

if (color1 == color3)
{
System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
System.Console.WriteLine("Not equal");
}

Los objetos String también tienen un método CompareTo() que devuelve un valor entero, basado en si una cadena es menor
que (<) o mayor que (>) otra. Al comparar las cadenas, se utiliza el valor Unicode, y las minúsculas tienen un valor menor que
las mayúsculas.
C#
string s7 = "ABC";
string s8 = "abc";

if (s7.CompareTo(s8) > 0)
{
System.Console.WriteLine("Greater-than");
}
else
{
System.Console.WriteLine("Less-than");
}

Para buscar una cadena dentro de otra, utilice IndexOf(). IndexOf() devuelve -1 si la cadena de búsqueda no se encuentra; en
caso contrario devuelve el índice de la primera posición de la cadena, con base cero.
C#
string s9 = "Battle of Hastings, 1066";

System.Console.WriteLine(s9.IndexOf("Hastings")); // outputs 10
System.Console.WriteLine(s9.IndexOf("1967")); // outputs -1

Dividir una cadena en subcadenas


Dividir una cadena en subcadenas (al igual que dividir una frase en palabras) es una tarea común de programación. El método
Split() toma una matriz de char de delimitadores (por ejemplo, un carácter de espacio) y devuelve una matriz de subcadenas.
Para obtener acceso a esta matriz con foreach:
C#
char[] delimit = new char[] { ' ' };
string s10 = "The cat sat on the mat.";
foreach (string substr in s10.Split(delimit))
{
System.Console.WriteLine(substr);
}

Este código genera cada palabra en una línea separada de la siguiente forma:
The
cat
sat
on
the
mat.

Cadenas nulas y cadenas vacías


Una cadena vacía es una instancia de un objeto System.String que contiene cero caracteres. Las cadenas vacías se utilizan
habitualmente en distintos escenarios de programación para representar un campo de texto en blanco. Puede realizar
llamadas a métodos en cadenas vacías porque son objetos System.String válidos. Las cadenas vacías se inicializan del modo
siguiente:

string s = "";

Por el contrario, una cadena nula no hace referencia a una instancia de un objeto System.String y cualquier intento de llamar
a un método en una cadena nula produce una excepción NullReferenceException. Sin embargo, puede utilizar cadenas nulas en
operaciones de concatenación y comparación con otras cadenas. Los ejemplos siguientes muestran algunos casos en los que
se hace referencia a una cadena nula y no se produce una excepción:

string str = "hello";


string nullStr = null;
string emptyStr = "";

string tempStr = str + nullStr; // tempStr = "hello"


bool b = (emptyStr == nullStr);// b = false;
emptyStr + nullStr = ""; // creates a new empty string
int I = nullStr.Length; // throws NullReferenceException

Utilizar StringBuilder
La clase StringBuilder crea un búfer de cadena que proporciona el mejor rendimiento si el programa realiza una gran
manipulación de cadenas. La cadena StringBuilder también permite reasignar los caracteres individuales, algo que el tipo de
datos de cadena integrado no admite. Por ejemplo, este código cambia el contenido de una cadena sin crear una nueva cadena:
C#
System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

En este ejemplo, se utiliza un objeto StringBuilder para crear una cadena a partir de un conjunto de tipos numéricos:
C#
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789

// Copy one character of the string (not possible with a System.String)


sb[0] = sb[9];

System.Console.WriteLine(sb); // displays 9123456789


}
}

Para obtener más información


Del manual Referencia del programador de C#:
string (Referencia de C#)

Vea también
Tareas
Cómo: Buscar cadenas mediante expresiones regulares (Guía de programación de C#)
Cómo: Buscar cadenas mediante los métodos String (Guía de programación de C#)
Cómo: Analizar cadenas con el método Split (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Analizar cadenas
Guía de programación de C#

Cómo: Analizar cadenas con el método Split (Guía de


programación de C#)
El ejemplo de código siguiente muestra cómo analizar una cadena con el método System.String.Split. Este método devuelve
una matriz de cadenas en la que cada elemento es una palabra. Como entrada, Split toma una matriz de caracteres que indican
los caracteres que se utilizan como delimitadores. En este ejemplo, se utilizan espacios, comas, dos puntos, puntos y comas y
tabuladores. Se pasa una matriz que contiene estos delimitadores a Split, y cada palabra de la frase se muestra por separado
utilizando la matriz de cadenas resultante.
Ejemplo
C#
class TestStringSplit
{
static void Main()
{
char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

string text = "one\ttwo three:four,five six seven";


System.Console.WriteLine("Original text: '{0}'", text);

string[] words = text.Split(delimiterChars);


System.Console.WriteLine("{0} words in text:", words.Length);

foreach (string s in words)


{
System.Console.WriteLine(s);
}
}
}

Resultados
Original text: 'one two three:four,five six seven'
7 words in text:
one
two
three
four
five
six
seven

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Cadenas (Guía de programación de C#)
Expresiones regulares de .NET Framework
Programación de .NET en C++
Guía de programación de C#

Cómo: Buscar cadenas mediante los métodos String (Guía de


programación de C#)
El tipo string, que es un alias de la clase System.String, proporciona varios métodos útiles para buscar el contenido de una
cadena. El ejemplo siguiente utiliza los métodos IndexOf, LastIndexOf, StartsWith y EndsWith.
Ejemplo
C#
class StringSearch
{
static void Main()
{
string str = "A silly sentence used for silly purposes.";
System.Console.WriteLine("'{0}'",str);

bool test1 = str.StartsWith("a silly");


System.Console.WriteLine("starts with 'a silly'? {0}", test1);

bool test2 = str.StartsWith("a silly", System.StringComparison.OrdinalIgnoreCase);


System.Console.WriteLine("starts with 'a silly'? {0} (ignoring case)", test2);

bool test3 = str.EndsWith(".");


System.Console.WriteLine("ends with '.'? {0}", test3);

int first = str.IndexOf("silly");


int last = str.LastIndexOf("silly");
string str2 = str.Substring(first, last - first);
System.Console.WriteLine("between two 'silly' words: '{0}'", str2);
}
}

Resultados
'A silly sentence used for silly purposes.'
starts with 'a silly'? False
starts with 'a silly'? True (ignore case)
ends with '.'? True
between two 'silly' words: 'silly sentence used for '

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Cadenas (Guía de programación de C#)
Guía de programación de C#

Cómo: Buscar cadenas mediante expresiones regulares (Guía de


programación de C#)
La clase System.Text.RegularExpressions.Regex se puede utilizar para buscar cadenas. Estas búsquedas pueden tener distinta
complejidad, desde ser muy sencillas hasta hacer un gran uso de expresiones regulares. A continuación se ofrecen dos
ejemplos de búsqueda de cadenas con la clase Regex. Para obtener más información, vea
Expresiones regulares de .NET Framework.
Ejemplo
El código siguiente es una aplicación de consola que realiza una búsqueda simple de cadenas sin distinción entre mayúsculas y
minúsculas en una matriz. El método estático
System.Text.RegularExpressions.Regex.IsMatch(System.String,System.String,System.Text.RegularExpressions.RegexOptions)
realiza la búsqueda a partir de la cadena de búsqueda y de la cadena que contiene el patrón de búsqueda. En este caso, se
utiliza un tercer argumento para indicar que no se debe distinguir entre mayúsculas y minúsculas. Para obtener más
información, vea System.Text.RegularExpressions.RegexOptions.
C#
class TestRegularExpressions
{
static void Main()
{
string[] sentences =
{
"cow over the moon",
"Betsy the Cow",
"cowering in the corner",
"no match here"
};

string sPattern = "cow";

foreach (string s in sentences)


{
System.Console.Write("{0,24}", s);

if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, System.Text.Regul


arExpressions.RegexOptions.IgnoreCase))
{
System.Console.WriteLine(" (match for '{0}' found)", sPattern);
}
else
{
System.Console.WriteLine();
}
}
}
}

Resultados
cow over the moon (match for 'cow' found)
Betsy the Cow (match for 'cow' found)
cowering in the corner (match for 'cow' found)
no match here

El código siguiente es una aplicación de consola que utiliza expresiones regulares para validar el formato de cada cadena de
una matriz. La validación requiere que cada cadena tenga la forma de un número de teléfono en el que tres grupos de dígitos
se separan por guiones. Los dos primeros grupos contienen tres dígitos, y el tercero, cuatro. Esto se logra con la expresión
regular ^\\d{3}-\\d{3}-\\d{4}$. Para obtener más información, vea Elementos del lenguaje de expresiones regulares.
C#
class TestRegularExpressionValidation
{
static void Main()
{
string[] numbers =
{
"123-456-7890",
"444-234-22450",
"690-203-6578",
"146-893-232",
"146-839-2322",
"4007-295-1111",
"407-295-1111",
"407-2-5555",
};

string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";


foreach (string s in numbers)
{
System.Console.Write("{0,14}", s);

if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
{
System.Console.WriteLine(" - valid");
}
else
{
System.Console.WriteLine(" - invalid");
}
}
}
}

Resultados
123-456-7890 - valid
444-234-22450 - invalid
690-203-6578 - valid
146-893-232 - invalid
146-839-2322 - valid
4007-295-1111 - invalid
407-295-1111 - valid
407-2-5555 - invalid

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Cadenas (Guía de programación de C#)
Guía de programación de C#

Cómo: Unir varias cadenas (Guía de programación de C#)


Hay dos maneras de unir varias cadenas: con el operador + que la clase String sobrecarga y con la clase StringBuilder. El
operador + es fácil de usar y hace el código más intuitivo, pero trabaja en serie; se crea una nueva cadena para cada uso del
operador, de modo que cambiar varios operadores a la vez es ineficiente. Por ejemplo:
C#
string two = "two";
string str = "one " + two + " three";
System.Console.WriteLine(str);

Aunque aparecen cuatro cadenas en el código (las tres cadenas que se combinan y la cadena final que contiene las otras tres),
se crean cinco cadenas en total porque las dos primeras se combinan primero y crean una cadena que contiene "one two". La
tercera se anexa separadamente para formar la cadena final almacenada en str.
Alternativamente, la clase StringBuilder se puede utilizar para agregar cada cadena a un objeto que, a continuación, crea la
cadena final en un paso. Esta estrategia se muestra en el ejemplo siguiente.
Ejemplo
En el código siguiente se utiliza el método Append de la clase StringBuilder para combinar tres cadenas sin el efecto de
encadenamiento del operador +.
C#
class StringBuilderTest
{
static void Main()
{
string two = "two";

System.Text.StringBuilder sb = new System.Text.StringBuilder();


sb.Append("one ");
sb.Append(two);
sb.Append(" three");
System.Console.WriteLine(sb.ToString());

string str = sb.ToString();


System.Console.WriteLine(str);
}
}

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Cadenas (Guía de programación de C#)
Guía de programación de C#

Cómo: Modificar el contenido de cadenas (Guía de


programación de C#)
Las cadenas son inmutables, por lo que no es posible modificar su contenido. Sin embargo, el contenido de una cadena se
puede extraer a un formulario no inmutable y modificarse para formar a continuación una nueva instancia de la cadena.
Ejemplo
En el ejemplo siguiente se utiliza el método ToCharArray para extraer el contenido de una cadena a una matriz de tipo char. A
continuación, se modifican algunos de los elementos de esa matriz. Después se utiliza la matriz char para crear una nueva
instancia de la cadena.
C#
class ModifyStrings
{
static void Main()
{
string str = "The quick brown fox jumped over the fence";
System.Console.WriteLine(str);

char[] chars = str.ToCharArray();


int animalIndex = str.IndexOf("fox");
if (animalIndex != -1)
{
chars[animalIndex++] = 'c';
chars[animalIndex++] = 'a';
chars[animalIndex] = 't';
}

string str2 = new string(chars);


System.Console.WriteLine(str2);
}
}

Resultados
The quick brown fox jumped over the fence
The quick brown cat jumped over the fence

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Cadenas (Guía de programación de C#)
Guía de programación de C#

Instrucciones, expresiones y operadores (Guía de programación


de C#)
Esta sección contiene información con respecto a los elementos fundamentales que constituyen un programa de C#. El código
de C# que comprende una aplicación consta de instrucciones que comprenden palabras clave, expresiones y operadores de C#.
Para obtener más información al respecto, vea:
Instrucciones (Guía de programación de C#)
Expresiones (Guía de programación de C#)
Operadores (Guía de programación de C#)
Operadores sobrecargables (Guía de programación de C#)
Operadores de conversión (Guía de programación de C#)
Utilizar operadores de conversión (Guía de programación de C#)
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Cómo: Utilizar la sobrecarga de operadores para crear una clase de números complejos (Guía de programación de C#)
Directrices para sobrecargar Equals() y el operador == (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.4 Expresiones
1.5 Instrucciones
1.6.6.5 Operadores
5.3.3 Reglas precisas para determinar asignaciones definitivas
7 Expresiones
7.2 Operadores
8 Instrucciones
Vea también
Referencia
Conversión (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Instrucciones (Guía de programación de C#)


Una instrucción es una unidad de creación de procedimientos a partir de la cual se construyen todos los programas de C#. Una
instrucción puede declarar una variable o constante local, llamar a un método, crear un objeto o asignar un valor a una
variable, propiedad o campo. Una instrucción de control puede crear un bucle, por ejemplo un bucle for, u optar por bifurcarse
a un nuevo bloque de código, por ejemplo una instrucción if o switch. Generalmente, las instrucciones finalizan con un punto y
coma. Para obtener más información, vea Tipos de instrucciones (Referencia de C#).
Una serie de instrucciones que aparecen entre llaves forma un bloque de código. El cuerpo de un método es un ejemplo de
bloque de código. A menudo, los bloques de código siguen una instrucción de control. Las variables o constantes declaradas
dentro de un bloque de código sólo están disponibles para las instrucciones dentro del mismo bloque de código. Por ejemplo,
el siguiente código muestra un bloque de método y un bloque de código después de una instrucción de control:
C#
bool IsPositive(int number)
{
if (number > 0)
{
return true;
}
else
{
return false;
}
}

Las instrucciones de C# a menudo contienen expresiones. Una expresión de C# es un fragmento de código que contiene un
valor literal, un nombre simple o un operador y sus operandos. Las expresiones más comunes, cuando se evalúan, producen
un valor literal, una variable, una propiedad de objeto o un acceso a indizador de objeto. Cada vez que se identifica una
variable, propiedad de objeto o acceso a indizador de objeto desde una expresión, el valor de dicho elemento se utiliza como
valor de la expresión. En C#, una expresión puede colocarse en cualquier lugar donde se requiera un valor u objeto, siempre y
cuando la expresión evalúe finalmente el tipo requerido.
Algunas expresiones se evalúan como espacio de nombres, tipo, grupo de métodos o acceso de eventos. Estas expresiones de
propósito especial sólo son válidas en determinados momentos, generalmente como parte de una expresión más grande y
producirán un error del compilador si se utilizan en forma inadecuada.
Secciones relacionadas
Tipos de instrucciones (Referencia de C#)
Expresiones (Guía de programación de C#)
Operadores (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#.
1.5 Instrucciones
7 Expresiones
8 Instrucciones
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Expresiones (Guía de programación de C#)


Una expresión es un fragmento de código que se puede evaluar como un valor, objeto, método o espacio de nombres único.
Las expresiones pueden contener un valor literal, una invocación de método, un operador y sus operandos o un nombre
simple. Los nombres simples pueden ser el nombre de una variable, miembro de tipo, parámetro de método, espacio de
nombres o tipo.
Las expresiones pueden utilizar operadores que, a su vez, utilizan otras expresiones como parámetros o llamadas a métodos
cuyos parámetros son, a su vez, otras llamadas a métodos, de modo que pueden variar de simples a muy complejas.
Literales y nombres simples
Los dos tipos de expresiones más simples son literales y nombres simples. Un literal es un valor constante que no tiene ningún
nombre. Por ejemplo, en el código siguiente, 5 y "Hello World" son valores literales:
C#
int i = 5;
string s = "Hello World";

Para obtener más información sobre literales, vea Tipos (Referencia de C#).
En el ejemplo anterior, tanto i como s son nombres simples que identifican variables locales. Cuando esas variables se utilizan
en una expresión, el valor de la variable se recupera y se utiliza para la expresión. Por ejemplo, en el código siguiente, cuando
se llama a DoWork, el método recibe el valor 5 de forma predeterminada y no es posible tener acceso a la variable var:
C#
int var = 5;
DoWork(var);

Expresiones de invocación
En el ejemplo de código siguiente, la llamada a DoWork es otro tipo de expresión, denominada expresión de invocación.
C#
DoWork(var);

Específicamente, llamar a un método es una expresión de invocación de método. Una invocación de método requiere el
nombre del método, ya sea un nombre como en el ejemplo anterior o el resultado de otra expresión, seguido de paréntesis y
los parámetros del método. Para obtener más información, vea Métodos (Guía de programación de C#). Una invocación de
delegado utiliza el nombre de un delegado y los parámetros de método entre paréntesis. Para obtener más información, vea
Delegados (Guía de programación de C#). Las invocaciones de método e invocaciones de delegado se evalúan como el valor
que devuelve el método, si devuelve alguno. Los métodos que devuelven un valor nulo no se pueden utilizar en lugar de un
valor en una expresión.
Comentarios
Siempre que se identifica un acceso a una variable, propiedad de objeto o indizador de objeto desde una expresión, el valor de
ese elemento se utiliza como valor de la expresión. Una expresión se puede colocar en cualquier parte de C# donde se requiera
un valor u objeto, siempre que la expresión finalmente se evalúe como el tipo requerido.
Vea también
Referencia
Métodos (Guía de programación de C#)
Operadores (Guía de programación de C#)
Tipos de datos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Guía de programación de C#

Operadores (Guía de programación de C#)


En C#, un operador es un término o un símbolo que acepta como entrada una o más expresiones, denominadas operandos, y
devuelve un valor. Los operadores que requieren un operando, como el operador de incremento (++) o new, se denominan
operadores unarios. Los operadores que requieren dos operandos, como los operadores aritméticos (+, -, *, /) se denominan
operadores binarios. Un operador, el operador condicional (?:), utiliza tres operandos y es el único operador terciario de C#.
La instrucción de C# siguiente contiene un solo operador unario y un solo operando. El operador de incremento, ++, modifica
el valor del operando y.
C#
y++;

La instrucción de C# siguiente contiene dos operadores binarios, cada uno con dos operandos. El operador de asignación, =,
tiene el entero y y la expresión 2 + 3 como operandos. La propia expresión 2 + 3 contiene el operador de suma y utiliza los
valores enteros 2 y 3 como operandos:
C#
y = 2 + 3;

Un operando puede ser una expresión válida de cualquier tamaño, compuesta por una cantidad cualquiera de otras
operaciones.
Los operadores de una expresión se evalúan en un orden concreto conocido como prioridad de operadores. La tabla siguiente
divide a los operadores en categorías basadas en el tipo de operación que realizan. Las categorías se muestran en orden de
prioridad.

Principal x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked

Unario +, -, !, ~, ++x, --x, (T)x

Aritméticos: multiplicativos *, /, %

Aritméticos: aditivos +, -

Desplazamiento <<, >>

Comprobación de tipos y relacionales <, >, <=, >=, is, as

Igualdad ==, !=

Lógicos, en orden de prioridad &, ^, |

Condicionales, en orden de prioridad &&, ||, ?:

Asignación =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

Cuando dos operadores con la misma prioridad están presentes en una expresión, se evalúan según su asociatividad. Los
operadores que son asociativos por la izquierda se evalúan en orden de izquierda a derecha. Por ejemplo, x * y / z se evalúa
como (x * y) / z. Los operadores que son asociativos por la derecha se evalúan en orden de derecha a izquierda. Los
operadores de asignación y el operador terciario (?:) son asociativos por la derecha. Todos los otros operadores binarios son
asociativos por la izquierda. Sin embargo, el estándar de C# no especifica cuándo se ejecuta la parte "fija" de una instrucción de
incremento en una expresión. Por ejemplo, el resultado del código de ejemplo siguiente es 6:
C#
int num1 = 5;
num1++;
System.Console.WriteLine(num1);

Sin embargo, el resultado del código de ejemplo siguiente es indefinido:


C#
int num2 = 5;
num2 = num2++; //not recommended
System.Console.WriteLine(num2);

Por consiguiente, no se recomienda el último ejemplo. Los paréntesis se pueden utilizar para envolver una expresión y hacer
que esa expresión sea evaluada antes que cualquier otra. Por ejemplo, 2 + 3 * 2 normalmente darían 8 como resultado. Esto
es porque los operadores multiplicativos tienen prioridad sobre los operadores aditivos. Escribir la expresión (2 + 3 ) * 2 da
como resultado 10, ya que ésta indica al compilador de C# que el operador de adición (+) se debe evaluar antes que el
operador de multiplicación (*).
Se puede cambiar el comportamiento de los operadores con las estructuras y cargas personalizadas. Este proceso se denomina
sobrecarga de operadores. Para obtener más información, vea Operadores sobrecargables (Guía de programación de C#).
Secciones relacionadas
Para obtener más información, vea Palabras clave de operadores (Referencia de C#) y Operadores de C#.
Vea también
Referencia
Instrucciones, expresiones y operadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Operadores sobrecargables (Guía de programación de C#)


C# permite sobrecargar operadores en los tipos definidos por el usuario, mediante la definición, con la palabra clave operator,
de funciones miembro estáticas. No obstante, no todos los operadores se pueden sobrecargar y algunos presentan
restricciones, como se indica en la siguiente tabla:
Operadores Posibilidad de sobrecarga
+, -, !, ~, ++, --, true, false Estos operadores unarios sí se pueden sobrecargar.

+, -, *, /, %, &, |, ^, <<, >> Estos operadores binarios sí se pueden sobrecargar.

==, !=, <, >, <=, >= Los operadores de comparación se pueden sobrecargar (pero vea la nota que aparece a continuaci
ón de esta tabla).

&&, || Los operadores lógicos condicionales no se pueden sobrecargar, pero se evalúan mediante & y |, l
os cuales sí se pueden sobrecargar.

[] El operador de indización de matrices no se puede sobrecargar, pero se pueden definir indizadores


.

() El operador de conversión explícita de tipos no se puede sobrecargar, pero se pueden definir nuev
os operadores de conversión (vea explicit e implicit).

+=, -=, *=, /=, %=, &=, |=, Los operadores de asignación no se pueden sobrecargar, pero +=, por ejemplo, se evalúa con +, el
^=, <<=, >>= cual sí se puede sobrecargar.

=, ., ?:, ->, new, is, sizeof, Estos operadores no se pueden sobrecargar.


typeof
Nota
Si se sobrecargan los operadores de comparación, dicha sobrecarga debe realizarse en parejas; es decir, si se sobrecarga ==,
también se debe sobrecargar !=. Lo contrario también es cierto y similar para < y >, y para <= y >=.

Sobrecargar un operador en una clase personalizada requiere la creación de un método en la clase con la firma correcta. El
método se debe denominar "operador X", donde X es el nombre o símbolo del operador que se va a sobrecargar. Los
operadores unarios tienen un parámetro y los operadores binarios tienen dos. En cada caso, un parámetro debe tener el
mismo tipo que la clase o estructura que declara el operador, como se muestra en el siguiente ejemplo:
C#
public static Complex operator +(Complex c1, Complex c2)

Para obtener más información, vea


Cómo: Utilizar la sobrecarga de operadores para crear una clase de números complejos (Guía de programación de C#).
Vea también
Referencia
Instrucciones, expresiones y operadores (Guía de programación de C#)
Operadores (Guía de programación de C#)
Operadores de C#
Conceptos
Guía de programación de C#
Guía de programación de C#

Operadores de conversión (Guía de programación de C#)


C# permite a los programadores declarar conversiones de clases o estructuras para convertirlas en otras clases o estructuras o
en tipos básicos. Las conversiones se definen como operadores con el nombre del tipo al cual convierten. El tipo contenedor
debe ser el argumento de tipo que se va a convertir o el tipo del resultado de la conversión, pero no ambos.
C#
class SampleClass
{
public static explicit operator SampleClass(int i)
{
SampleClass temp = new SampleClass();
// code to convert from int to SampleClass...

return temp;
}
}

Información general de operadores de conversión


Los operadores de conversión tienen las propiedades siguientes:
Las conversiones declaradas como implicit se producen automáticamente cuando son necesarias.
Las conversiones declaradas como explicit requieren que se llame a una conversión de tipos.
Todas las conversiones deben ser de tipo static.
Secciones relacionadas
Para obtener más información:
Utilizar operadores de conversión (Guía de programación de C#)
Instrucciones de diseño de operadores de conversión
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
explicit (Referencia de C#)
implicit (Referencia de C#)
static (Referencia de C#)
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Utilizar operadores de conversión (Guía de programación de


C#)
Los operadores de conversión pueden ser explicit o implicit. Los operadores de conversión implícita son más fáciles de
utilizar, pero los operadores explícitos son útiles cuando se desea que los usuarios del operador sepan que está teniendo lugar
una conversión. En este tema se muestran ambos tipos.
Ejemplo 1
Description
Éste es un ejemplo de un operador de conversión explícita. Este operador convierte el tipo Byte en un tipo de valor
denominado Digit. Como no todos los bytes se pueden convertir en valores de tipo digit, la conversión es explícita, lo que
significa que se debe utilizar una conversión, como se muestra en el método Main.
C#
struct Digit
{
byte value;

public Digit(byte value) //constructor


{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}

public static explicit operator Digit(byte b) // explicit byte to digit conversion ope
rator
{
Digit d = new Digit(b); // explicit conversion

System.Console.WriteLine("conversion occurred");
return d;
}
}

class TestExplicitConversion
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (System.Exception e)
{
System.Console.WriteLine("{0} Exception caught.", e);
}
}
}

Resultado 1
conversion occurred

Ejemplo 2
Description
En este ejemplo se muestra un operador de conversión implícita mediante la definición de un operador de conversión que
deshace lo que hizo el ejemplo anterior: convierte una clase de valor denominada Digit en el tipo integral Byte. Dado que
cualquier dígito se puede convertir en Byte, no hay ninguna necesidad de obligar a los usuarios a que definan la conversión.
C#
struct Digit
{
byte value;

public Digit(byte value) //constructor


{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static implicit operator byte(Digit d) // implicit digit to byte conversion ope
rator
{
System.Console.WriteLine("conversion occurred");
return d.value; // implicit conversion
}
}

class TestImplicitConversion
{
static void Main()
{
Digit d = new Digit(3);
byte b = d; // implicit conversion -- no cast needed
}
}

Resultado 2
conversion occurred

Vea también
Conceptos
Guía de programación de C#
Operadores de conversión (Guía de programación de C#)
Otros recursos
Referencia de C#
Guía de programación de C#

Cómo: Implementar conversiones entre estructuras definidas


por el usuario (Guía de programación de C#)
Este ejemplo define dos estructuras, RomanNumeral y BinaryNumeral, y muestra dos conversiones entre ellas.
Ejemplo
C#
struct RomanNumeral
{
private int value;

public RomanNumeral(int value) //constructor


{
this.value = value;
}

static public implicit operator RomanNumeral(int value)


{
return new RomanNumeral(value);
}

static public implicit operator RomanNumeral(BinaryNumeral binary)


{
return new RomanNumeral((int)binary);
}

static public explicit operator int(RomanNumeral roman)


{
return roman.value;
}

static public implicit operator string(RomanNumeral roman)


{
return ("Conversion not yet implemented");
}
}
struct BinaryNumeral
{
private int value;
public BinaryNumeral(int value) //constructor
{
this.value = value;
}
static public implicit operator BinaryNumeral(int value)
{
return new BinaryNumeral(value);
}

static public explicit operator int(BinaryNumeral binary)


{
return (binary.value);
}

static public implicit operator string(BinaryNumeral binary)


{
return ("Conversion not yet implemented");
}
}
class TestConversions
{
static void Main()
{
RomanNumeral roman;
BinaryNumeral binary;
roman = 10;

// Perform a conversion from a RomanNumeral to a BinaryNumeral:


binary = (BinaryNumeral)(int)roman;
// Perform a conversion from a BinaryNumeral to a RomanNumeral:
// No cast is required:
roman = binary;
System.Console.WriteLine((int)binary);
System.Console.WriteLine(binary);
}
}

Resultados
10
Conversion not yet implemented

Programación eficaz
En el ejemplo anterior, la instrucción:
C#
binary = (BinaryNumeral)(int)roman;

realiza una conversión de un RomanNumeral a un BinaryNumeral. Como no existe una conversión directa de RomanNumeral
a BinaryNumeral, se utiliza una conversión explícita de un RomanNumeral a un int, y otra conversión explícita para
convertir de un int a un BinaryNumeral.
Además, la instrucción
C#
roman = binary;

realiza una conversión de un BinaryNumeral a un RomanNumeral. Como RomanNumeral define una conversión implícita
desde BinaryNumeral, no se requiere ninguna conversión explícita.

Vea también
Conceptos
Guía de programación de C#
Operadores de conversión (Guía de programación de C#)
Otros recursos
Referencia de C#
Guía de programación de C#

Cómo: Utilizar la sobrecarga de operadores para crear una clase


de números complejos (Guía de programación de C#)
Este ejemplo muestra cómo utilizar la sobrecarga de operadores para crear una clase de números complejos Complex que
define la suma compleja. El programa muestra las partes real e imaginaria de los números y el resultado de la suma mediante
un método sustituto del método ToString.
Ejemplo
C#
public struct Complex
{
public int real;
public int imaginary;

public Complex(int real, int imaginary) //constructor


{
this.real = real;
this.imaginary = imaginary;
}

// Declare which operator to overload (+),


// the types that can be added (two Complex objects),
// and the return type (Complex):
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
}

// Override the ToString() method to display a complex number in the traditional format
:
public override string ToString()
{
return (System.String.Format("{0} + {1}i", real, imaginary));
}
}

class TestComplex
{
static void Main()
{
Complex num1 = new Complex(2, 3);
Complex num2 = new Complex(3, 4);
// Add two Complex objects through the overloaded plus operator:
Complex sum = num1 + num2;

// Print the numbers and the sum using the overriden ToString method:
System.Console.WriteLine("First complex number: {0}", num1);
System.Console.WriteLine("Second complex number: {0}", num2);
System.Console.WriteLine("The sum of the two numbers: {0}", sum);
}
}

Resultados
First complex number: 2 + 3i
Second complex number: 3 + 4i
The sum of the two numbers: 5 + 7i

Vea también
Referencia
Operadores de C#
operator (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Directrices para sobrecargar Equals() y el operador == (Guía de


programación de C#)
En C#, hay dos tipos diferentes de igualdad: igualdad de referencia e igualdad de valor. La igualdad de valor es el significado de
igualdad más conocido: significa que dos objetos contienen los mismos valores. Por ejemplo, dos enteros con el valor 2 tienen
igualdad de valor. La igualdad de referencia significa que no hay dos objetos que se puedan comparar. Mas bien, hay dos
referencias a objeto que se refieren al mismo objeto. Esto puede suceder mediante una asignación simple, como se muestra en
el ejemplo siguiente:
C#
System.Object a = new System.Object();
System.Object b = a;
System.Object.ReferenceEquals(a, b); //returns true

En este código, sólo existe un objeto, pero hay varias referencias a ese objeto: a y b. Como ambas hacen referencia al mismo
objeto, tienen la igualdad de referencia. Si dos objetos tienen igualdad de referencia, también tienen igualdad de valor, pero la
igualdad de valor no garantiza la igualdad de referencia.
Para comprobar la igualdad de referencia, utilice ReferenceEquals. Para comprobar la igualdad de valor, utilice Equals o Equals.
Reemplazar Equals
Equals es un método virtual que permite que cualquier clase reemplace su implementación. Toda clase que representa un
valor (básicamente cualquier tipo de valor) o un conjunto de valores como un grupo, por ejemplo una clase de números
complejos, debe reemplazar Equals. Si el tipo implementa IComparable, deberá reemplazar Equals.
La nueva implementación de Equals debe seguir todas las garantías de Equals:
x.Equals(x) devuelve true.
x.Equals(y) devuelve el mismo valor que y.Equals(x).
si (x.Equals(y) && y.Equals(z)) devuelve true, x.Equals(z) devuelve true.
Las invocaciones sucesivas de x.Equals(y) devuelven el mismo valor siempre que no se modifiquen los objetos a los que
se hace referencia mediante x e y.
x.Equals(null) devuelve false.
La nueva implementación de Equals no debe producir excepciones. Se recomienda que toda clase que reemplaza Equals
también reemplace System.Object.GetHashCode. También se recomienda que además de implementar Equals (objeto),
cualquier clase implemente también Equals (tipo) para su propio tipo con el fin de mejorar el rendimiento. Por ejemplo:
C#
class TwoDPoint : System.Object
{
public readonly int x, y;

public TwoDPoint(int x, int y) //constructor


{
this.x = x;
this.y = y;
}
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
TwoDPoint p = obj as TwoDPoint;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
public bool Equals(TwoDPoint p)
{
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
public override int GetHashCode()
{
return x ^ y;
}
}

Cualquier clase derivada que puede llamar a Equals en la clase base debe hacerlo antes de finalizar su comparación. En el
siguiente ejemplo, Equals llama a la clase base Equals, la cual busca un parámetro nulo y compara el tipo del parámetro con
el tipo de la clase derivada. Esto deja a la implementación de Equals en la clase derivada la tarea de comprobar el nuevo
campo de datos declarado en la clase derivada:
C#
class ThreeDPoint : TwoDPoint
{
public readonly int z;
public ThreeDPoint(int x, int y, int z)
: base(x, y)
{
this.z = z;
}

public override bool Equals(System.Object obj)


{
// If parameter cannot be cast to ThreeDPoint return false:
ThreeDPoint p = obj as ThreeDPoint;
if ((object)p == null)
{
return false;
}

// Return true if the fields match:


return base.Equals(obj) && z == p.z;
}

public bool Equals(ThreeDPoint p)


{
// Return true if the fields match:
return base.Equals((TwoDPoint)p) && z == p.z;
}
public override int GetHashCode()
{
return base.GetHashCode() ^ z;
}
}

Reemplazar el operador ==
De forma predeterminada, el operador == prueba la igualdad de referencia al determinar si las dos referencias indican el
mismo objeto, de manera que no es necesario que los tipos de referencias implementen el operador == para obtener esta
funcionalidad. Cuando un tipo es inmutable, es decir, cuando los datos contenidos en la instancia no pueden cambiarse, la
sobrecarga del operador == para comparar la igualdad de valor en lugar de la igualdad de referencia puede ser útil porque,
como objetos inmutables, se pueden considerar iguales siempre y cuando tengan el mismo valor. No se recomienda
reemplazar el operador == en tipos no inmutables.
Las implementaciones del operador sobrecargado == no deben producir excepciones. Cualquier tipo que sobrecargue el
operador == también debe sobrecargar el operador !=. Por ejemplo:
C#
//add this code to class ThreeDPoint as defined previously
//
public static bool operator ==(ThreeDPoint a, ThreeDPoint b)
{
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))
{
return true;
}

// If one is null, but not both, return false.


if (((object)a == null) || ((object)b == null))
{
return false;
}

// Return true if the fields match:


return a.x == b.x && a.y == b.y && a.z == b.z;
}

public static bool operator !=(ThreeDPoint a, ThreeDPoint b)


{
return !(a == b);
}

Nota
Un error común en las sobrecargas del operador == es utilizar (a == b), (a == null) o (b == null) para comprobar la igu
aldad de referencia. Por el contrario, esto produce una llamada al operador sobrecargado ==, lo que origina un bucle infinito
. Utilice ReferenceEquals o convierta el tipo a Object, para evitar el bucle.

Vea también
Referencia
Instrucciones, expresiones y operadores (Guía de programación de C#)
Operadores (Guía de programación de C#)
Operadores sobrecargables (Guía de programación de C#)
Operador == (Referencia de C#)
Operador () (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Objetos, clases y estructuras (Guía de programación de C#)


C# es un lenguaje de programación orientado a objetos que utiliza clases y estructuras para implementar tipos como
formularios Windows Forms, controles de interfaz de usuario y estructuras de datos. Una aplicación de C# típica se compone
de clases definidas por el programador, junto con clases de .NET Framework.
C# ofrece varias maneras eficaces de definir clases, por ejemplo, proporcionar niveles de acceso diferentes, heredar
características de otras clases y permitir que el programador especifique qué sucede cuando se crean o destruyen instancias de
tipos.
Las clases también se pueden definir como genéricas mediante la utilización de parámetros de tipo que permiten que el código
de cliente personalice la clase de una manera eficiente y con seguridad de tipos. Una clase genérica única, por ejemplo
System.Collections.Generic.List en la biblioteca de clases de .NET Framework, se puede ser utilizada en el código de cliente para
almacenar enteros, cadenas y cualquier otro tipo de objeto.
Información general
Los objetos, clases y estructuras tienen las propiedades siguientes:
Los objetos son instancias de un tipo de datos determinado. El tipo de datos proporciona un plano para el objeto que se
crea, o del cual se crean instancias, cuando se ejecuta la aplicación.
Los nuevos tipos de datos se definen mediante clases y estructuras.
Las clases y estructuras conforman las unidades de creación de aplicaciones de C#, ya que contienen código y datos. Una
aplicación de C# siempre contendrá al menos una clase.
Una estructura se puede considerar una clase ligera, idónea para crear tipos de datos que almacenan pequeñas
cantidades de datos, y no representa un tipo que después se podría extender por medio de la herencia.
Las clases de C# son compatibles con la herencia, lo que significa que se pueden derivar de una clase previamente
definida.
Secciones relacionadas
Instrucciones de diseño de tipos
Objetos
Clases
Estructuras
Herencia
Miembros
Métodos
Constructores
Destructores
Utilizar constructores y destructores
Campos
Constantes
Tipos anidados
Modificadores de acceso
Definiciones de clase parciales
Clases estáticas y sus miembros (Guía de programación de C#)
Cómo: Saber las diferencias entre pasar a un método una estructura y una referencia a clase (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
1.6 Clases y objetos
1.7 Estructuras
3.4.4 Miembros de clase
4.2.1 Tipos de clase
10 Clases
11 Estructuras
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Objetos (Guía de programación de C#)


Los objetos son construcciones de programación que se componen de datos, comportamiento e identidad. Los datos del
objeto se encuentran en los campos, propiedades y eventos del objeto; los métodos e interfaces del objeto definen los
comportamientos del objeto.
Los objetos tienen identidad, es decir, dos objetos con el mismo conjunto de datos no son necesariamente el mismo objeto.
En C#, los objetos se definen mediante classes y structs, que conforman el plano único a partir del cual operan todos los
objetos de ese tipo.
Información general sobre objetos
Los objetos tienen las propiedades siguientes:
Todo lo que se utiliza en C# es un objeto, incluidos los formularios Windows Forms y los controles.
Se crean instancias de objetos; es decir, éstos se crean a partir de plantillas definidas por clases y estructuras.
Los objetos utilizan Propiedades (Guía de programación de C#) para obtener y cambiar la información que contienen.
A menudo, los objetos tienen métodos y eventos que les permiten realizar acciones.
Visual Studio proporciona herramientas para manipular objetos: la Propiedades (Ventana) permite cambiar los atributos
de los objetos, como formularios Windows Forms. El Examinador de objetos permite examinar el contenido de un objeto.
Todos los objetos de C# heredan de Object.
Secciones relacionadas
Para obtener más información:
Clases (Guía de programación de C#)
Estructuras (Guía de programación de C#)
Constructores (Guía de programación de C#)
Destructores (Guía de programación de C#)
Eventos (Guía de programación de C#)
Vea también
Referencia
object (Referencia de C#)
Herencia (Guía de programación de C#)
class (Referencia de C#)
struct (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Objetos remotos
Guía de programación de C#

Clases (Guía de programación de C#)


En C#, una clase es un tipo de datos muy eficaz. Como las estructuras, las clases definen los datos y el comportamiento del tipo
de datos. Los programadores pueden crear objetos que son instancias de una clase. A diferencia de las estructuras, las clases
admiten herencia, que es una parte fundamental de la programación orientada a objetos. Para obtener más información, vea
Herencia.
Declarar clases
Las clases se definen mediante la palabra clave class, como se muestra en el ejemplo siguiente:
C#
public class Customer
{
//Fields, properties, methods and events go here...
}

El nivel de acceso precede a la palabra clave class. En este caso, se utiliza public, que significa que cualquiera puede crear
objetos a partir de esta clase. El nombre de la clase sigue a la palabra clave class. El resto de la definición es el cuerpo de clase,
donde se definen el comportamiento y los datos. Los campos, propiedades, métodos y eventos de una clase se conocen
colectivamente como miembros de clase.
Crear objetos
Aunque se utilizan a veces de forma intercambiable, una clase y un objeto son cosas diferentes. Una clase define un tipo de
objeto, pero no es propiamente un objeto. Un objeto es una entidad concreta basada en una clase y, a veces, se denomina
instancia de una clase.
Los objetos se pueden crear con la palabra clave new seguida del nombre de la clase en la que se basará el objeto, de la
manera siguiente:
C#
Customer object1 = new Customer();

Cuando se crea una instancia de una clase, una referencia al objeto se vuelve a pasar al programador. En el ejemplo anterior,
object1 es una referencia a un objeto basado en Customer. Esta referencia hace referencia el nuevo objeto, pero no contiene
los datos del propio objeto. De hecho, se puede crear una referencia a objeto sin crear un objeto:
C#
Customer object2;

No se recomienda la creación de referencias a objetos como ésta, que no hace referencia a un objeto, porque al intentar el
acceso a un objeto a través de esa referencia se producirá un error en tiempo de ejecución. Sin embargo, este tipo de
referencia se puede crear para hacer referencia a un objeto, ya sea creando un nuevo objeto o asignándola a un objeto
existente, de la forma siguiente:
C#
Customer object3 = new Customer();
Customer object4 = object3;

Este código crea dos referencias a objeto que se refieren al mismo objeto. Por consiguiente, los cambios realizados en el objeto
a través de object3 se reflejarán en los usos posteriores de object4. El hecho de que las clases se conozcan como tipos de
referencia se debe a que se hace referencia a los objetos basados en clases por referencia.
Herencia de clase
La herencia se realiza a través de una derivación, lo que significa que una clase se declara utilizando una clase base de la cual
hereda los datos y el comportamiento. Una clase base se especifica anexando dos puntos y el nombre de la clase base a
continuación del nombre de la clase derivada, del modo siguiente:
C#
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}

Cuando una clase declara una clase base, todos los miembros de clase definidos para la clase base también pasan a formar
parte de la nueva clase. Dado que una clase base se puede heredar de otra clase, que a su vez se heredó de otra clase y así
sucesivamente, una clase puede provenir de varias clases base.
Ejemplo
En el ejemplo siguiente, se define una clase pública que contiene un campo único, un método y un método especial
denominado constructor. Para obtener más información, vea Constructores (Guía de programación de C#). Luego se crean
instancias de la clase con la palabra clave new.
C#
public class Person
{
// Field
public string name;

// Constructor
public Person()
{
name = "unknown";
}

// Method
public void SetName(string newName)
{
name = newName;
}
}
class TestPerson
{
static void Main()
{
Person person1 = new Person();
System.Console.WriteLine(person1.name);

person1.SetName("John Smith");
System.Console.WriteLine(person1.name);
}
}

Resultado
unknown
John Smith

Información general sobre las clases


Las clases tienen las propiedades siguientes:
A diferencia de C++, sólo se admite una herencia única: una clase puede heredar la implementación solamente de una
clase base.
Una clase puede implementar más de una interfaz. Para obtener más información, vea
Interfaces (Guía de programación de C#).
Las definiciones de clase se pueden dividir entre archivos de código fuente diferentes. Para obtener más información, vea
Definiciones de clase parciales (Guía de programación de C#).
Las clases estáticas son clases selladas que contienen sólo métodos estáticos. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6 Clases y objetos
10 Clases
Vea también
Referencia
Miembros (Guía de programación de C#)
Métodos (Guía de programación de C#)
Destructores (Guía de programación de C#)
Objetos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Estructuras (Guía de programación de C#)


Las estructuras se definen mediante la palabra clave struct, por ejemplo:
C#
public struct PostalAddress
{
// Fields, properties, methods and events go here...
}

Casi todas las estructuras comparten la misma sintaxis que las clases, aunque están más limitadas que éstas:
Dentro de una declaración de estructura, los campos no se pueden inicializar a menos que se declaren como constantes o
estáticos.
Una estructura no puede declarar un constructor predeterminado (es decir, un constructor sin parámetros) ni un
destructor.
El compilador crea y destruye automáticamente copias de estructuras, de modo que un constructor y destructor
predeterminados son innecesarios. De hecho, el compilador implementa el constructor predeterminado asignando a todos los
campos sus valores predeterminados (vea Tabla de valores predeterminados (Referencia de C#)). Las estructuras no pueden
heredar de clases u otras estructuras.
Las estructuras son tipos de valor; cuando un objeto se crea a partir de una estructura y se asigna a una variable, la variable
contiene el valor completo de la estructura. Cuando se copia una variable que contiene una estructura, todos los datos se
copian y cualquier modificación a la nueva copia no cambia los datos de la copia antigua. Como las estructuras no utilizan
referencias, no tienen identidad; no existe ninguna forma de distinguir entre dos instancias de un tipo de valor con los mismos
datos. En C#, todos los tipos de valor derivan inherentemente de ValueType, que hereda de Object.
El compilador puede convertir tipos de valor en tipos de referencia en un proceso conocido como conversión boxing. Para
obtener más información, vea Boxing y Unboxing.
Información general sobre las estructuras
Las estructuras tienen las propiedades siguientes:
Las estructuras son tipos de valor, mientras que las clases son tipos de referencia.
A diferencia de las clases, se pueden crear instancias de las estructuras sin utilizar un operador new.
Las estructuras pueden declarar constructores, pero deben utilizar parámetros.
Una estructura no puede heredar de otra estructura o clase, ni puede ser la base de una clase. Todas las estructuras
heredan directamente de System.ValueType, que hereda de System.Object.
Una estructura puede implementar interfaces.
Secciones relacionadas
Para obtener más información:
Utilizar estructuras (Guía de programación de C#)
Utilizar constructores y destructores
Cómo: Saber las diferencias entre pasar a un método una estructura y una referencia a clase (Guía de programación de C#)
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Conceptos
Guía de programación de C#
Diseño de estructuras
Clases (Guía de programación de C#)
Guía de programación de C#

Utilizar estructuras (Guía de programación de C#)


El tipo struct es adecuado para representar objetos de poca complejidad, como Point, Rectangle y Color. Aunque es posible
representar un punto como una clase, una estructura es más eficaz en algunos casos. Por ejemplo, si declara una matriz de
1000 objetos Point, asignará memoria adicional para hacer referencia a cada objeto; en este caso, una estructura sería menos
costosa. Puesto que .NET Framework contiene un objeto denominado Point, llamaremos en su lugar a la estructura "CoOrds".
C#
public struct CoOrds
{
public int x, y;

public CoOrds(int p1, int p2)


{
x = p1;
y = p2;
}
}

Es un error declarar un constructor predeterminado (sin parámetros) para una estructura. Siempre existe un constructor
predeterminado que inicializa los miembros de la estructura con sus valores predeterminados. También es un error inicializar
un campo de instancia en una estructura.
Cuando se crea un objeto struct mediante el operador new, se crea y se llama al constructor apropiado. A diferencia de las
clases, es posible crear instancias de las estructuras sin utilizar el operador new. Si no se utiliza new, los campos
permanecerán sin asignar y el objeto no se podrá utilizar hasta haber inicializado todos los campos.
A diferencia de las clases, para las estructuras no existe herencia. Una estructura no puede heredar de otra estructura o clase, ni
puede ser la base de una clase. Sin embargo, las estructuras heredan de la clase base Object. Una estructura puede
implementar interfaces del mismo modo que las clases.
A diferencia de C++, no se puede declarar una clase mediante la palabra clave struct. En C#, las clases y las estructuras son
semánticamente diferentes. Una estructura es un tipo de valor, mientras que una clase es un tipo de referencia. Para obtener
más información, vea Tipos de valores (Referencia de C#).
A menos que se necesite semántica de tipo de referencia, el sistema puede controlar más eficazmente las clases pequeñas si se
definen como estructuras.
Ejemplo 1
Description
Este ejemplo muestra la inicialización de tipo struct mediante constructores predeterminados y constructores con parámetros.
C#
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}

C#
// Declare and initialize struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);

// Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);

System.Console.Write("CoOrds 2: ");
System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
}
}

Resultado
CoOrds 1: x = 0, y = 0
CoOrds 2: x = 10, y = 10

Ejemplo 2
Description
Este ejemplo muestra una característica exclusiva de las estructuras. Crea un objeto CoOrds sin utilizar el operador new. Si se
reemplaza la palabra struct por la palabra class, el programa no se compilará.
C#
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}

C#
// Declare a struct object without "new."
class TestCoOrdsNoNew
{
static void Main()
{
// Declare an object:
CoOrds coords1;

// Initialize:
coords1.x = 10;
coords1.y = 20;

// Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
}
}

Resultado
CoOrds 1: x = 10, y = 20

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Conceptos
Guía de programación de C#
Estructuras (Guía de programación de C#)
Guía de programación de C#

Herencia (Guía de programación de C#)


Las clases pueden heredar de otra clase. Para conseguir esto, se coloca un signo de dos puntos después del nombre de la clase
al declarar la clase y se denomina la clase de la cual se hereda (la clase base) después del signo de dos puntos, del modo
siguiente:
C#
public class A
{
public A() { }
}

public class B : A
{
public B() { }
}

La nueva clase (la clase derivada) obtiene todos los datos no privados y el comportamiento de la clase base, además de todos
los demás datos y comportamientos que define para sí misma. La nueva clase tiene dos tipos efectivos: el tipo de la nueva
clase y el tipo de la clase que hereda.
En el ejemplo anterior, la clase B es claramente B y A. Cuando se tiene acceso a un objeto B, se puede utilizar la operación de
conversión de tipos para convertirlo en un objeto A. La conversión de tipos no cambia el objeto B, pero la vista del objeto B se
restringe a los datos y comportamientos de A. Después de convertir un objeto B en un objeto A, es posible volver a convertir
ese objeto A en un objeto B. No todas las instancias de A se pueden convertir en B, sólo aquellas que son realmente instancias
de B. Si se tiene acceso a la clase B como tipo B, se obtienen los datos y comportamientos tanto de la clase A como de la clase
B. La capacidad que tiene un objeto de representar más de un tipo se denomina polimorfismo. Para obtener más información,
vea Polimorfismo (Guía de programación de C#). Para obtener más información sobre conversión, vea
Conversión (Guía de programación de C#).
Las estructuras no pueden heredar de otras estructuras o clases. Tanto las clases como las estructuras pueden heredar de una
o más interfaces. Para obtener más información, vea Interfaces (Guía de programación de C#)
En esta sección
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Polimorfismo (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
class (Referencia de C#)
struct (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Clases y miembros de clase abstractos y sellados (Guía de


programación de C#)
La palabra clave abstract permite crear clases y miembros de clase únicamente con propósitos de herencia: para definir
características de clases derivadas, no abstractas. La palabra clave sealed permite impedir la herencia de una clase o de ciertos
miembros de clase marcados previamente como virtuales. Para obtener más información, vea
Cómo: Definir propiedades abstractas (Guía de programación de C#).
Clases y miembros de clase abstractos
Las clases se pueden declarar como abstractas. Esto se logra colocando la palabra clave abstract antes de la palabra clave
class en la definición de clase. Por ejemplo:
C#
public abstract class A
{
// Class members here.
}

No se pueden crear instancias de una clase abstracta. El propósito de una clase abstracta es proporcionar una definición
común de una clase base que múltiples clases derivadas pueden compartir. Por ejemplo, una biblioteca de clase puede definir
una clase abstracta que se utiliza como parámetro para muchas de sus funciones y solicitar a los programadores que utilizan
esa biblioteca que proporcionen su propia implementación de la clase mediante la creación de una clase derivada.
Las clases abstractas también pueden definir métodos abstractos. Esto se consigue agregando la palabra clave abstract antes
del tipo de valor que devuelve el método. Por ejemplo:
C#
public abstract class A
{
public abstract void DoWork(int i);
}

Los métodos abstractos no tienen ninguna implementación, de modo que la definición de método va seguida por un punto y
coma en lugar de un bloque de método normal. Las clases derivadas de la clase abstracta deben implementar todos los
métodos abstractos. Cuando una clase abstracta hereda un método virtual de una clase base, la clase abstracta puede
reemplazar el método virtual con un método abstracto. Por ejemplo:
C#
// compile with: /target:library
public class D
{
public virtual void DoWork(int i)
{
// Original implementation.
}
}
public abstract class E : D
{
public abstract override void DoWork(int i);
}
public class F : E
{
public override void DoWork(int i)
{
// New implementation.
}
}

Si un método virtual se declara abstracto, sigue siendo virtual para cualquier clase que se herede de la clase abstracta. Una
clase que hereda un método abstracto no puede tener acceso a la implementación original del método; en el ejemplo anterior,
DoWork de la clase F no puede llamar a DoWork de la clase D. De esta forma, una clase abstracta puede obligar a las clases
derivadas a proporcionar nuevas implementaciones de método para los métodos virtuales.
Clases y miembros de clase sellados
Las clases pueden declararse como selladas. Esto se logra colocando la palabra clave sealed antes de la palabra clave class en
la definición de clase. Por ejemplo:
C#
public sealed class D
{
// Class members here.
}

Una clase sellada no se puede utilizar como clase base. Por esta razón, tampoco puede ser una clase abstracta. Las clases
selladas se utilizan principalmente para impedir la derivación. Puesto que nunca se pueden utilizar como una clase base,
algunas optimizaciones en tiempo de ejecución pueden hacer que sea un poco más rápido llamar a miembros de clase sellada.
Un miembro de clase, método, campo, propiedad o evento de una clase derivada que reemplaza a un miembro virtual de la
clase base puede declarar ese miembro como sellado. Esto niega el aspecto virtual del miembro para cualquier clase derivada
adicional. Esto se logra colocando la palabra clave sealed antes de la palabra clave override en la declaración del miembro de
clase. Por ejemplo:
C#
public class D : C
{
public sealed override void DoWork() { }
}

Vea también
Tareas
Cómo: Definir propiedades abstractas (Guía de programación de C#)
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Herencia (Guía de programación de C#)
Métodos (Guía de programación de C#)
Campos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Definir propiedades abstractas (Guía de programación


de C#)
En el ejemplo siguiente, se muestra cómo definir propiedades abstractas. Una declaración de propiedad abstracta no
proporciona una implementación de descriptores de acceso de la propiedad; por el contrario, declara que la clase acepta
propiedades pero deja la implementación de los descriptores de acceso a las clases derivadas. El ejemplo siguiente muestra
cómo implementar las propiedades abstractas heredadas de una clase base.
Este ejemplo consta de tres archivos, cada uno de los cuales se compila individualmente; la compilación siguiente hace
referencia al ensamblado resultante:
abstractshape.cs: la clase Shape que contiene una propiedad Area abstracta.
shapes.cs: las subclases de la clase Shape.
shapetest.cs: un programa de prueba que muestra en pantalla las áreas de algunos objetos derivados de Shape.
Para compilar el ejemplo, utilice el comando siguiente:
csc abstractshape.cs shapes.cs shapetest.cs

De esta forma, se creará el archivo ejecutable shapetest.exe.


Ejemplo
Este archivo declara la clase Shape que contiene la propiedad Area del tipo double.
C#
// compile with: csc /target:library abstractshape.cs
public abstract class Shape
{
private string m_id;

public Shape(string s)
{
// calling the set accessor of the Id property.
Id = s;
}
public string Id
{
get
{
return m_id;
}

set
{
m_id = value;
}
}
// Area is a read-only property - only a get accessor is needed:
public abstract double Area
{
get;
}

public override string ToString()


{
return Id + " Area = " + string.Format("{0:F2}", Area);
}
}
Los modificadores de la propiedad se colocan en la misma declaración de propiedad. Por ejemplo:

public abstract double Area

Cuando se declara una propiedad abstracta (tal como Area en este ejemplo), simplemente se indica qué descriptores de
acceso a la propiedad están disponibles, pero no se implementan. En este ejemplo, sólo se dispone de un descriptor de
acceso get, de modo que la propiedad es de sólo lectura.
El siguiente código muestra tres subclases de Shape y cómo reemplazan la propiedad Area para proporcionar sus propias
implementaciones.
C#
// compile with: csc /target:library /reference:abstractshape.dll shapes.cs
public class Square : Shape
{
private int m_side;
public Square(int side, string id)
: base(id)
{
m_side = side;
}

public override double Area


{
get
{
// Given the side, return the area of a square:
return m_side * m_side;
}
}
}

public class Circle : Shape


{
private int m_radius;
public Circle(int radius, string id)
: base(id)
{
m_radius = radius;
}

public override double Area


{
get
{
// Given the radius, return the area of a circle:
return m_radius * m_radius * System.Math.PI;
}
}
}
public class Rectangle : Shape
{
private int m_width;
private int m_height;

public Rectangle(int width, int height, string id)


: base(id)
{
m_width = width;
m_height = height;
}

public override double Area


{
get
{
// Given the width and height, return the area of a rectangle:
return m_width * m_height;
}
}
}

El siguiente código muestra un programa de prueba que crea una serie de objetos derivados de Shape e imprime sus áreas.
C#
// compile with: csc /reference:abstractshape.dll;shapes.dll shapetest.cs
class TestClass
{
static void Main()
{
Shape[] shapes =
{
new Square(5, "Square #1"),
new Circle(3, "Circle #1"),
new Rectangle( 4, 5, "Rectangle #1")
};

System.Console.WriteLine("Shapes Collection");
foreach (Shape s in shapes)
{
System.Console.WriteLine(s);
}
}
}

Resultados
Shapes Collection
Square #1 Area = 25.00
Circle #1 Area = 28.27
Rectangle #1 Area = 20.00

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Polimorfismo (Guía de programación de C#)


A través de la herencia, una clase puede utilizarse como más de un tipo; puede utilizarse como su propio tipo, cualquier tipo
base o cualquier tipo de interfaz si implementa interfaces. Esto se denomina polimorfismo. En C#, todos los tipos son
polimórficos. Los tipos se pueden utilizar como su propio tipo o como una instancia de Object, porque cualquier tipo trata
automáticamente a Object como tipo base.
El polimorfismo no sólo es importante para las clases derivadas, sino también para las clases base. Cualquiera que utilice la
clase base podría, de hecho, estar utilizando un objeto de la clase derivada que se haya convertido en el tipo de clase base. Los
diseñadores de una clase base pueden anticipar qué aspectos de su clase base cambiarán probablemente para un tipo
derivado. Por ejemplo, es posible que una clase base para automóviles contenga un comportamiento sujeto a cambios si el
automóvil en cuestión es un vehículo familiar o uno descapotable. Una clase base puede marcar esos miembros de clase como
virtuales, lo cual permite que las clases derivadas que representan automóviles descapotables y vehículos familiares
reemplacen ese comportamiento.
Para obtener más información, vea Herencia.
Información general sobre el polimorfismo
Cuando una clase derivada hereda de una clase base, obtiene todos los métodos, campos, propiedades y eventos de la clase
base. Para cambiar los datos y el comportamiento de una clase base, existen dos opciones: se puede reemplazar el miembro
base por un nuevo miembro derivado o se puede reemplazar un miembro base virtual.
Para reemplazar un miembro de una clase base por un nuevo miembro derivado, se requiere la palabra clave new. Si una clase
base define un método, campo o propiedad, la palabra clave new se utiliza para crear una nueva definición de ese método,
campo o propiedad en una clase derivada. La palabra clave new se coloca antes del tipo de valor devuelto de un miembro de
clase que se reemplaza. Por ejemplo:
C#
public class BaseClass
{
public void DoWork() { }
public int WorkField;
public int WorkProperty
{
get { return 0; }
}
}
public class DerivedClass : BaseClass
{
public new void DoWork() { }
public new int WorkField;
public new int WorkProperty
{
get { return 0; }
}
}

Cuando se utiliza la palabra clave new, se llama a los nuevos miembros de clase en lugar de los miembros de clase base que
se han reemplazado. Esos miembros de clase base se denominan miembros ocultos. Aún es posible llamar a los miembros de
clase ocultos si una instancia de la clase derivada se convierte en una instancia de la clase base. Por ejemplo:
C#
DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork(); // Calls the old method.

Para que una instancia de una clase derivada controle por completo un miembro de clase de una clase base, la clase base debe
declarar ese miembro como virtual. Esto se consigue agregando la palabra clave virtual antes del tipo de valor devuelto del
miembro. Una clase derivada tiene entonces la opción de utilizar la palabra clave override, en lugar de new, para reemplazar la
implementación de la clase base por la propia. Por ejemplo:
C#
public class BaseClass
{
public virtual void DoWork() { }
public virtual int WorkProperty
{
get { return 0; }
}
}
public class DerivedClass : BaseClass
{
public override void DoWork() { }
public override int WorkProperty
{
get { return 0; }
}
}

Los campos no pueden ser virtuales. Sólo los métodos, propiedades, eventos e indizadores pueden serlo. Cuando una clase
derivada reemplaza un miembro virtual, se llama a ese miembro aunque se tenga acceso a una instancia de esa clase como
instancia de la clase base. Por ejemplo:
C#
DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork(); // Also calls the new method.

Los métodos y propiedades virtuales permiten hacer planes para una expansión futura. El hecho de llamar a un miembro
virtual sin importar cuál es el tipo que el llamador utiliza proporciona a las clases derivadas la opción de cambiar
completamente el comportamiento aparente de la clase base.
Los miembros virtuales siguen siendo virtuales de forma indefinida, independientemente de cuántas clases se hayan declarado
en la clase que originalmente declaró el miembro virtual. Si la clase A declara un miembro virtual, la clase B deriva de A y la
clase C deriva de B, la clase C hereda el miembro virtual y tiene la opción de reemplazarlo, independientemente de si la clase B
declaró la sustitución de ese miembro. Por ejemplo:
C#
public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}

C#
public class C : B
{
public override void DoWork() { }
}

Una clase derivada puede detener la herencia virtual si la sustitución se declara como sellada. Para ello es necesario colocar la
palabra clave sealed antes de la palabra clave override en la declaración del miembro de clase. Por ejemplo:
C#
public class C : B
{
public sealed override void DoWork() { }
}

En el ejemplo anterior, el método DoWork ya no es virtual para ninguna clase derivada de C. Todavía es virtual para instancias
de C, aunque se conviertan al tipo B o A. Los métodos sellados se pueden reemplazar por clases derivadas mediante la palabra
clave new, como se muestra en el ejemplo siguiente:
C#
public class D : C
{
public new void DoWork() { }
}

En este caso, si se llama a DoWork en D mediante una variable de tipo D, se llama al nuevo DoWork. Si se utiliza una variable de
tipo C, B o A para tener acceso a una instancia de D, una llamada a DoWork seguirá las reglas de la herencia virtual y enrutará
esas llamadas a la implementación de DoWork en la clase C.
Una clase derivada que ha reemplazado un método o propiedad todavía puede tener acceso al método o propiedad de la clase
base utilizando la palabra clave base. Por ejemplo:
C#
public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}

C#
public class C : B
{
public override void DoWork()
{
// Call DoWork on B to get B's behavior:
base.DoWork();

// DoWork behavior specific to C goes here:


// ...
}
}

Para obtener más información, vea base.


Nota
Se recomienda que los miembros virtuales utilicen la palabra clave base para llamar a la implementación de la clase base de
ese miembro en su propia implementación. Al permitir que se produzca el comportamiento de la clase base, se permite que l
a clase derivada se concentre en implementar el comportamiento específico de la clase derivada. Si no se llama a la impleme
ntación de la clase base, la compatibilidad del comportamiento de la clase derivada con el comportamiento de la clase base d
epende de la clase derivada.
En esta sección
Para obtener más información:
Control de versiones con las palabras clave Override y New (Guía de programación de C#)
Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#)
Cómo: Reemplazar el método ToString (Guía de programación de C#)

Vea también
Referencia
Herencia (Guía de programación de C#)
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Métodos (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#
Eventos (Guía de programación de C#)
Guía de programación de C#

Control de versiones con las palabras clave Override y New


(Guía de programación de C#)
El lenguaje C# está diseñado de modo que las versiones entre las clases base y derivadas de diferentes bibliotecas puedan
evolucionar y mantener la compatibilidad con versiones anteriores. Esto significa, por ejemplo, que la inserción de un nuevo
miembro en una clase base con el mismo nombre que un miembro de una clase derivada es totalmente compatible con C# y
no lleva a un comportamiento inesperado. También significa que una clase debe declarar explícitamente si un método va a
reemplazar a un método heredado o si es un nuevo método que simplemente oculta un método heredado con un nombre
similar.
C# permite que las clases derivadas contengan métodos con el mismo nombre que los métodos de clase base.
El método de la clase base debe definirse como virtual.
Si el método de la clase derivada no va precedido de las palabras clave new u override, el compilador emite una
advertencia y el método se comporta como si la palabra clave new estuviera presente.
Si el método de la clase derivada va precedido de la palabra clave new, el método se define como independiente del
método de la clase base.
Si el método de la clase derivada va precedido de la palabra clave override, los objetos de la clase derivada llamarán a
ese método, no al método de la clase base.
El método de la clase base puede llamarse desde dentro de la clase derivada con la palabra clave base.
Las palabras clave override, virtual y new también pueden aplicarse a propiedades, indizadores y eventos.
De forma predeterminada, los métodos de C# no son virtuales; si se declara un método como virtual, toda clase que hereda el
método puede implementar su propia versión Para hacer que un método sea virtual, se utiliza el modificador virtual en la
declaración de método de la clase base. La clase derivada puede entonces reemplazar el método base virtual mediante la
palabra clave override u ocultar el método virtual de la clase base mediante la palabra clave new. Si no se especifica la
palabra clave override ni la palabra clave new, el compilador emite una advertencia y el método de la clase derivada oculta el
método de la clase base. Para obtener más información, vea Advertencia del compilador (nivel 2) CS0108.
Para demostrar esto en la práctica, supongamos por un momento que la compañía A ha creado una clase denominada
GraphicsClass, que el programa utiliza. GraphicsClass tiene el siguiente aspecto:

C#
class GraphicsClass
{
public virtual void DrawLine() { }
public virtual void DrawPoint() { }
}

La compañía utiliza esta clase, que se utiliza para derivar clases propias, mediante la adición de un nuevo método:
C#
class YourDerivedGraphicsClass : GraphicsClass
{
public void DrawRectangle() { }
}

La aplicación se utiliza sin problemas, hasta que la compañía lanza una nueva versión de GraphicsClass, que tiene el siguiente
aspecto:
C#
class GraphicsClass
{
public virtual void DrawLine() { }
public virtual void DrawPoint() { }
public virtual void DrawRectangle() { }
}

La nueva versión de GraphicsClass contiene ahora un método denominado DrawRectangle. Inicialmente, no sucede nada. La
nueva versión aún es compatible a nivel binario con la anterior; todo el software que se haya implementado continuará
funcionando, aunque la nueva clase esté instalada en los equipos. Cualquier llamada existente al método DrawRectangle
continuará haciendo referencia a la versión, en la clase derivada.
Sin embargo, una vez que se vuelve a compilar la aplicación mediante la nueva versión de GraphicsClass, se recibe una
advertencia del compilador. Para obtener más información, vea Advertencia del compilador (nivel 2) CS0108.
Esta advertencia informa de que el usuario debe considerar cómo desea que el método DrawRectangle se comporte en la
aplicación.
Si desea que el método reemplace el nuevo método de clase base, utilice la palabra clave override, como se muestra a
continuación:
C#
class YourDerivedGraphicsClass : GraphicsClass
{
public override void DrawRectangle() { }
}

La palabra clave override se asegura de que cualquier objeto derivado de YourDerivedGraphicsClass utilizará la versión de
clase derivada de DrawRectangle. Los objetos derivados de YourDerivedGraphicsClass aún pueden tener acceso a la versión
de clase base de DrawRectangle con la palabra clave base, de la forma siguiente:
C#
base.DrawRectangle();

Si no desea que el método reemplace el nuevo método de clase base, tenga en cuenta las consideraciones siguientes. Para
evitar la confusión entre los dos métodos, puede cambiar el nombre del método. Esto puede requerir mucho tiempo, llevar a
errores y, simplemente, no ser práctico en algunas situaciones. Sin embargo, si el proyecto es relativamente pequeño, se
pueden utilizar las opciones de refactorización de Visual Studio para cambiar el nombre del método. Para obtener más
información, vea Refactorizar clases y tipos.
Por otro lado, se puede evitar la advertencia mediante la palabra clave new en la definición de la clase derivada, de la forma
siguiente:
C#
class YourDerivedGraphicsClass : GraphicsClass
{
public new void DrawRectangle() { }
}

Con la palabra clave new se indica al compilador que la definición oculta la definición contenida en la clase base. Éste es el
comportamiento predeterminado.
Selección de método y reemplazo
Cuando se nombra un método en una clase, el compilador de C# selecciona el mejor método que se va a llamar si más de un
método es compatible con la llamada, al igual que cuando hay dos métodos con el mismo nombre y parámetros que son
compatibles con el parámetro pasado. Los métodos siguientes serían compatibles:
C#
public class Derived : Base
{
public override void DoWork(int param) { }
public void DoWork(double param) { }
}

Cuando se llama a DoWork en una instancia de Derived, el compilador de C# intentará primero hacer que la llamada sea
compatible con las versiones de DoWork declaradas originalmente en Derived. Los métodos de reemplazo no se consideran
como declarados en una clase; son nuevas implementaciones de un método declarado en una clase base. Sólo si el compilador
de C# no puede hacer coincidir la llamada de método con un método original de Derived, intentará hacer que la llamada
coincida con un método de reemplazo que tenga el mismo nombre y parámetros compatibles. Por ejemplo:
C#
int val = 5;
Derived d = new Derived();
d.DoWork(val); // Calls DoWork(double).

Puesto que la variable val se puede convertir implícitamente en double, el compilador de C# llama a DoWork(double) en lugar
de DoWork(int). Existen dos formas para evitar esto. En primer lugar, se debe evitar declarar nuevos métodos con el mismo
nombre que los métodos virtuales. En segundo lugar, se puede indicar al compilador de C# que llame al método virtual
haciendo que busque la lista de métodos de la clase base mediante la conversión de la instancia de Derived en Base. Debido a
que el método es virtual, se llamará a la implementación de DoWork(int) en Derived. Por ejemplo:
C#
((Base)d).DoWork(val); // Calls DoWork(int) on Derived.

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Métodos (Guía de programación de C#)
Herencia (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Saber cuándo utilizar las palabras clave Override y New (Guía


de programación de C#)
C# habilita métodos en clases derivadas para tener el mismo nombre que los métodos en clases base, siempre y cuando se sea
muy específico a la hora de establecer cómo se debería tratar el nuevo método. El siguiente ejemplo muestra el uso de las
palabras clave new y override.
En primer lugar, se declaran tres clases: una clase base denominada Car y dos clases que se derivan de ésta, ConvertibleCar y
Minivan. La clase base contiene un método único, DescribeCar que envía una descripción del automóvil a la consola. Los
métodos de la clase derivada también incluyen un método denominado DescribeCar que muestra sus propiedades únicas.
Estos métodos, a su vez, también llaman al método de clase base DescribeCar para mostrar cómo han heredado las
propiedades de la clase Car.
Para resaltar la diferencia, la clase ConvertibleCar se define con la palabra clave new, mientras que la clase Minivan se define
con override.
C#
// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}

// Define the derived classes


class ConvertibleCar : Car
{
public new virtual void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("A roof that opens up.");
}
}

class Minivan : Car


{
public override void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("Carries seven people.");
}
}

Ahora es posible escribir algún código que declara instancias de estas clases y llama a sus correspondientes métodos, de modo
que los objetos se puedan describir a sí mismos:
C#
public static void TestCars1()
{
Car car1 = new Car();
car1.DescribeCar();
System.Console.WriteLine("----------");

ConvertibleCar car2 = new ConvertibleCar();


car2.DescribeCar();
System.Console.WriteLine("----------");

Minivan car3 = new Minivan();


car3.DescribeCar();
System.Console.WriteLine("----------");
}

Como se podría esperar, el resultado es el siguiente:


Four wheels and an engine.
----------
Four wheels and an engine.
A roof that opens up.
----------
Four wheels and an engine.
Carries seven people.
----------

Sin embargo, en la siguiente sección de código, se declara una matriz de objetos derivada de la clase base Car. Esta matriz
puede almacenar los objetos Car, ConvertibleCar y Minivan. La matriz se declara de la siguiente manera:
C#
public static void TestCars2()
{
Car[] cars = new Car[3];
cars[0] = new Car();
cars[1] = new ConvertibleCar();
cars[2] = new Minivan();
}

Es posible utilizar un bucle foreach para visitar a cada objeto Car contenido en la matriz y llamar al método DescribeCar de la
siguiente manera:
C#
foreach (Car vehicle in cars)
{
System.Console.WriteLine("Car object: " + vehicle.GetType());
vehicle.DescribeCar();
System.Console.WriteLine("----------");
}

Los resultados de este bucle son los siguientes:


Car object: YourApplication.Car
Four wheels and an engine.
----------
Car object: YourApplication.ConvertibleCar
Four wheels and an engine.
----------
Car object: YourApplication.Minivan
Four wheels and an engine.
Carries seven people.
----------

Se puede observar que la descripción ConvertibleCar no es como se podría esperar. Como la palabra clave new se utilizó
para definir este método, no se llamó al método de la clase derivada sino que, en su lugar, se llamó al método de la clase base.
El objeto Minivan llama correctamente al método reemplazado, lo que genera los resultados esperados.
Si se desea reforzar la regla de que todas las clases derivadas de Car deben implementar el método DescribeCar, se debe crear
una nueva clase base que defina el método DescribeCar como abstract. Un método abstracto no contiene ningún código, sólo
la firma del método. Cualquier clase derivada de esta clase base debe proporcionar una implementación de DescribeCar. Para
obtener más información, vea abstract.
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Conceptos
Guía de programación de C#
Control de versiones con las palabras clave Override y New (Guía de programación de C#)
Guía de programación de C#

Cómo: Reemplazar el método ToString (Guía de programación


de C#)
Cada objeto de C# hereda el método ToString, que devuelve una representación de cadena de ese objeto. Por ejemplo, todas
los variables de tipo int tienen un método ToString, que les permite devolver su contenido como una cadena:
C#
int x = 42;
string strx = x.ToString();
System.Console.WriteLine(strx);

Cuando cree una clase o estructura personalizada, debe reemplazar el método ToString para proporcionar información sobre
el tipo al código de cliente.
Nota de seguridad
Cuando decida qué información va a proporcionar a través de este método, considere si la clase o estructura se va a utilizar a
lguna vez en código que no sea de confianza. Asegúrese de que no proporciona información que pueda ser aprovechada por
código malintencionado.

Para reemplazar el método OnString en una clase o estructura:


1. Declare un método ToString con los modificadores y tipo de valor devuelto siguientes:

public override string ToString(){}

2. Implemente el método para que devuelva una cadena.


El ejemplo siguiente devuelve no sólo el nombre de la clase, sino también los datos concretos de una instancia
determinada de la clase. Observe que también utiliza el método ToString en la variable age para convertir el valor int en
una cadena que se pueda generar.

class Person
{
string name;
int age;
SampleObject(string name, int age)
{
this.name = name;
this.age = age;
}
public override string ToString()
{
string s = age.ToString();
return "Person: " + name + " " + s;
}
}

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
new (Referencia de C#)
override (Referencia de C#)
virtual (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Interfaces (Guía de programación de C#)


Las interfaces se definen utilizando la palabra clave interface. Por ejemplo:
C#
interface IComparable
{
int CompareTo(object obj);
}

Las interfaces describen un grupo de comportamientos relacionados que pueden pertenecer a cualquier clase o estructura. Las
interfaces pueden estar compuestas de métodos, propiedades, eventos, indizadores o cualquier combinación de estos cuatro
tipos de miembros. Una interfaz no puede contener campos. Los miembros de interfaz son automáticamente públicos.
Al igual que las clases se pueden heredar de una clase base o estructura, las clases y estructuras se pueden heredar de
interfaces, con dos excepciones:
Una clase o estructura puede heredar más de una interfaz.
Cuando una clase o la estructura hereda una interfaz, hereda sólo los nombres de método y las firmas, ya que la propia
interfaz no contiene ninguna implementación. Por ejemplo:
C#
public class Minivan : Car, IComparable
{
public int CompareTo(object obj)
{
//implementation of CompareTo
return 0; //if the Minivans are equal
}
}

Para implementar un miembro de interfaz, el miembro correspondiente de la clase debe ser público, no estático y tener el
mismo nombre y la misma firma que el miembro de interfaz. Las propiedades e indizadores de una clase pueden definir
descriptores de acceso adicionales para una propiedad o indizador definidos en una interfaz. Por ejemplo, una interfaz puede
declarar una propiedad con un descriptor de acceso get, pero la clase que implementa la interfaz puede declarar la misma
propiedad con descriptores de acceso get y set. Sin embargo, si la propiedad o el indizador utiliza una implementación
explícita, los descriptores de acceso deben coincidir.
Las interfaces y los miembros de interfaz son abstractos; las interfaces no proporcionan una implementación predeterminada.
Para obtener más información, vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#).
La interfaz IComparable informa al usuario del objeto de que éste se puede comparar con otros objetos del mismo tipo y el
usuario de la interfaz no necesita saber cómo se implementa.
Las interfaces pueden heredar otras interfaces. Es posible que una clase herede una interfaz varias veces, a través de las clases
base o interfaces que hereda. En ese caso, la clase sólo puede implementar la interfaz una vez, siempre que ésta se declare
como parte de la nueva clase. Si la interfaz heredada no está declarada como parte de la nueva clase, la clase base que la
declaró proporcionará su implementación. Es posible que una clase base implemente miembros de interfaz a través de
miembros virtuales. En ese caso, la clase que hereda la interfaz puede cambiar el comportamiento de la interfaz reemplazando
los miembros virtuales. Para obtener más información sobre miembros virtuales, vea Polimorfismo.
Información general sobre interfaces
Una interfaz tiene las siguientes propiedades:
Una interfaz es similar a una clase base abstracta. Cualquier tipo no abstracto que hereda la interfaz debe implementar
todos sus miembros.
No se pueden crear instancias directamente de una interfaz.
Las interfaces pueden contener eventos, métodos, indizadores y propiedades.
Las interfaces no contienen implementaciones de métodos.
Las clases y estructuras se pueden heredar de más de una interfaz.
Una interfaz se puede heredar de varias interfaces.
En esta sección
Implementación explícita de interfaz (Guía de programación de C#)
Propiedades de interfaces (Guía de programación de C#)
Indizadores en interfaces (Guía de programación de C#)
Cómo: Implementar eventos de interfaz (Guía de programación de C#)
Cómo: Implementar explícitamente miembros de interfaz (Guía de programación de C#)
Cómo: Implementar explícitamente miembros de interfaz con herencia (Guía de programación de C#)
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Herencia (Guía de programación de C#)
Métodos (Guía de programación de C#)
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Métodos (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Polimorfismo (Guía de programación de C#)
Eventos (Guía de programación de C#)
Guía de programación de C#

Implementación explícita de interfaz (Guía de programación de


C#)
Si una clase implementa dos interfaces que contienen un miembro con la misma firma, la implementación de ese miembro en
la clase hará que ambas interfaces usen ese miembro como implementación. Por ejemplo:
C#
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
}
}

Sin embargo, s los miembros de dos interfaces no realizan la misma función, esto puede llevar a una implementación
incorrecta de una o ambas interfaces. Es posible implementar un miembro de interfaz explícitamente, creando un miembro de
clase que sólo se llama a través de la interfaz y es específico de ésta. Esto se puede llevar a cabo asignando al miembro de
clase el nombre de la interfaz y un punto. Por ejemplo:
C#
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}

El miembro de clase IControl.Paint sólo está disponible a través de la interfaz IControl, mientras que ISurface.Paint sólo
está disponible a través de ISurface. Ambas implementaciones de método son independientes y ninguna está directamente
disponible en la clase. Por ejemplo:
C#
SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.

ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.

La implementación explícita también se usa para resolver casos donde cada una de las dos interfaces declara miembros
diferentes del mismo nombre como propiedad y método:
C#
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}

Para implementar ambas interfaces, una clase tiene que utilizar implementación explícita, ya sea para la propiedad P, el
método P o ambos, con el fin de evitar un error del compilador. Por ejemplo:
C#
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Herencia (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Implementar explícitamente miembros de interfaz (Guía


de programación de C#)
En este ejemplo se declara una interfaz IDimensions y una clase Box, la cual implementa explícitamente los miembros de la
interfaz getLength y getWidth. El acceso a los miembros se realiza a través de la instancia de interfaz dimensions.
Ejemplo
C#
interface IDimensions
{
float getLength();
float getWidth();
}

class Box : IDimensions


{
float lengthInches;
float widthInches;

Box(float length, float width)


{
lengthInches = length;
widthInches = width;
}
// Explicit interface member implementation:
float IDimensions.getLength()
{
return lengthInches;
}
// Explicit interface member implementation:
float IDimensions.getWidth()
{
return widthInches;
}

static void Main()


{
// Declare a class instance box1:
Box box1 = new Box(30.0f, 20.0f);
// Declare an interface instance dimensions:
IDimensions dimensions = (IDimensions)box1;

// The following commented lines would produce compilation


// errors because they try to access an explicitly implemented
// interface member from a class instance:
//System.Console.WriteLine("Length: {0}", box1.getlength());
//System.Console.WriteLine("Width: {0}", box1.getwidth());
// Print out the dimensions of the box by calling the methods
// from an instance of the interface:
System.Console.WriteLine("Length: {0}", dimensions.getLength());
System.Console.WriteLine("Width: {0}", dimensions.getWidth());
}
}

Resultados
Length: 30
Width: 20

Programación eficaz
Observe que las siguientes líneas, en el método Main, están desactivadas mediante comentarios, ya que producirían
errores de compilación. No se puede obtener acceso desde una instancia de clase a un miembro de interfaz
implementado explícitamente:
C#
//System.Console.WriteLine("Length: {0}", box1.getlength());
//System.Console.WriteLine("Width: {0}", box1.getwidth());

Observe también que las siguientes líneas del método Main imprimen correctamente las dimensiones del cuadro, ya
que los métodos se invocan desde una instancia de la interfaz:
C#
System.Console.WriteLine("Length: {0}", dimensions.getLength());
System.Console.WriteLine("Width: {0}", dimensions.getWidth());

Vea también
Tareas
Cómo: Implementar explícitamente miembros de interfaz con herencia (Guía de programación de C#)
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Implementar explícitamente miembros de interfaz con


herencia (Guía de programación de C#)
La implementación explícita de interfaces también permite al programador implementar dos interfaces que tienen los mismos
nombres de miembros y dar a cada miembro de una interfaz una implementación independiente. Este ejemplo muestra las
dimensiones de un cuadro, tanto en unidades métricas como inglesas. La clase Box implementa dos interfaces,
IEnglishDimensions e IMetricDimensions, que representan los diferentes sistemas de medida. Ambas interfaces tienen
nombres de miembros idénticos, Length y Width.
Ejemplo
C#
// Declare the English units interface:
interface IEnglishDimensions
{
float Length();
float Width();
}

// Declare the metric units interface:


interface IMetricDimensions
{
float Length();
float Width();
}

// Declare the Box class that implements the two interfaces:


// IEnglishDimensions and IMetricDimensions:
class Box : IEnglishDimensions, IMetricDimensions
{
float lengthInches;
float widthInches;

public Box(float length, float width)


{
lengthInches = length;
widthInches = width;
}

// Explicitly implement the members of IEnglishDimensions:


float IEnglishDimensions.Length()
{
return lengthInches;
}

float IEnglishDimensions.Width()
{
return widthInches;
}

// Explicitly implement the members of IMetricDimensions:


float IMetricDimensions.Length()
{
return lengthInches * 2.54f;
}
float IMetricDimensions.Width()
{
return widthInches * 2.54f;
}

static void Main()


{
// Declare a class instance box1:
Box box1 = new Box(30.0f, 20.0f);
// Declare an instance of the English units interface:
IEnglishDimensions eDimensions = (IEnglishDimensions)box1;
// Declare an instance of the metric units interface:
IMetricDimensions mDimensions = (IMetricDimensions)box1;

// Print dimensions in English units:


System.Console.WriteLine("Length(in): {0}", eDimensions.Length());
System.Console.WriteLine("Width (in): {0}", eDimensions.Width());

// Print dimensions in metric units:


System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());
}
}

Resultados
Length(in): 30
Width (in): 20
Length(cm): 76.2
Width (cm): 50.8

Programación eficaz
Si desea realizar las medidas en unidades inglesas de forma predeterminada, implemente los métodos Length y Width con
normalidad e implemente explícitamente los métodos Length y Width de la interfaz IMetricDimensions:
C#
// Normal implementation:
public float Length()
{
return lengthInches;
}
public float Width()
{
return widthInches;
}

// Explicit implementation:
float IMetricDimensions.Length()
{
return lengthInches * 2.54f;
}
float IMetricDimensions.Width()
{
return widthInches * 2.54f;
}

En este caso, se puede tener acceso a las unidades inglesas desde la instancia de clase y acceso a las unidades métricas desde
la instancia de interfaz:
C#
public static void Test()
{
Box box1 = new Box(30.0f, 20.0f);
IMetricDimensions mDimensions = (IMetricDimensions)box1;
System.Console.WriteLine("Length(in): {0}", box1.Length());
System.Console.WriteLine("Width (in): {0}", box1.Width());
System.Console.WriteLine("Length(cm): {0}", mDimensions.Length());
System.Console.WriteLine("Width (cm): {0}", mDimensions.Width());
}
Vea también
Tareas
Cómo: Implementar explícitamente miembros de interfaz (Guía de programación de C#)
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Miembros (Guía de programación de C#)


Las clases y estructuras tienen miembros que representan sus datos y comportamiento. Esos miembros incluyen:
Campos (Guía de programación de C#)
Los campos son instancias de objetos que se consideran parte de una clase y que normalmente contienen datos de la clase.
Por ejemplo, una clase de calendario puede tener un campo con la fecha actual.
Propiedades (Guía de programación de C#)
Las propiedades son métodos de una clase a los que se obtiene acceso como si fueran campos de esa clase. Una propiedad
puede proporcionar protección a un campo de clase con el fin de evitar que se cambie sin el conocimiento del objeto.
Métodos (Guía de programación de C#)
Los métodos definen las acciones que una clase puede realizar. El método puede aceptar parámetros que proporcionan
datos de entrada y puede devolver datos de salida a través de parámetros. Los métodos también pueden devolver un valor
directamente, sin utilizar ningún parámetro.
Eventos (Guía de programación de C#)
Los eventos son una manera de proporcionar a otros objetos notificaciones sobre lo que ocurre, como clics en botones o la
realización correcta de un método. Los eventos se definen y desencadenan mediante delegados. Para obtener más
información, vea Eventos y delegados.
Operadores (Guía de programación de C#)
Los operadores son condiciones o símbolos que realizan operaciones en operandos, por ejemplo +, *, <, etc. Los operadores
se pueden volver a definir para realizar operaciones en tipos de datos personalizados. Para obtener más información, vea
Operadores sobrecargables (Guía de programación de C#).
Indizadores (Guía de programación de C#)
Los indizadores permiten indizar un objeto de una manera similar a como se hace con las matrices.
Constructores (Guía de programación de C#)
Los constructores son métodos a los que se llama cuando el objeto se crea por primera vez. Se utilizan a menudo para
inicializar los datos del objeto.
Destructores (Guía de programación de C#)
Los destructores son métodos a los que llama el motor de ejecución cuando el objeto está a punto de quitarse de la
memoria. Generalmente se utilizan para asegurarse de que los recursos que se tienen que liberar se controlan
apropiadamente.
Tipos anidados (Guía de programación de C#)
Los tipos anidados son tipos declarados dentro de una clase o estructura. Los tipos anidados se utilizan a menudo para
describir objetos únicamente utilizados por los tipos que los contienen.
Vea también
Referencia
Métodos (Guía de programación de C#)
Métodos (Guía de programación de C#)
Destructores (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Campos (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Tipos anidados (Guía de programación de C#)
Operadores (Guía de programación de C#)
Operadores sobrecargables (Guía de programación de C#)
Conceptos
Guía de programación de C#
Clases (Guía de programación de C#)
Eventos (Guía de programación de C#)
Eventos y delegados
Otros recursos
Instrucciones de diseño de miembros
Constructores (Guía de programación de C#)
Guía de programación de C#

Métodos (Guía de programación de C#)


Los métodos son un bloque de código que contiene una serie de instrucciones. En C#, cada instrucción se ejecuta en el
contexto de un método.
Los métodos se declaran en una clase o estructura especificando el nivel de acceso, el valor devuelto, el nombre del método y
los parámetros de método. Los parámetros de método se incluyen entre paréntesis y separados por comas. Los paréntesis
vacíos indican que el método no requiere ningún parámetro. Esta clase contiene tres métodos:
C#
class Motorcycle
{
public void StartEngine() { }
public void AddGas(int gallons) { }
public int Drive(int miles, int speed) { return 0; }
}

Llamar a un método en un objeto es similar a tener acceso a un campo. Después del nombre de objeto, agregue un punto, el
nombre del método y paréntesis. Los argumentos se enumeran entre paréntesis y separados por comas. Por tanto, se puede
llamar a los métodos de la clase Motorcycle del modo siguiente:
C#
Motorcycle moto = new Motorcycle();

moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);

Parámetros de métodos
Como se muestra en el fragmento de código anterior, para pasar argumentos a un método simplemente hay que
proporcionarlos entre paréntesis cuando se llama al método. En el método al que se llama, los argumentos de entrada se
denominan parámetros.
Los parámetros que un método recibe también se proporcionan entre paréntesis, pero se debe especificar el tipo y nombre de
cada parámetro. El nombre no tiene por qué ser igual que el argumento. Por ejemplo:
C#
public static void PassesInteger()
{
int fortyFour = 44;
TakesInteger(fortyFour);
}
static void TakesInteger(int i)
{
i = 33;
}

Aquí un método denominado PassesInteger pasa un argumento a un método denominado TakesInteger. En PassesInteger
el argumento se denomina fortyFour, pero en TakeInteger es un parámetro denominado i. Este parámetro sólo existe dentro
del método TakesInteger. Otras variables también pueden denominarse i y pueden ser de cualquier tipo, siempre y cuando
no sean parámetros o variables declaradas en ese método.
Observe que TakesInteger asigna un nuevo valor al argumento proporcionado. Se podría esperar que este cambio se reflejara
en el método PassesInteger una vez que TakeInteger devuelve un valor, pero de hecho, el valor de la variable fortyFour se
mantiene sin cambios. Esto se debe a que int es un tipo de valor. De forma predeterminada, cuando un tipo de valor se pasa a
un método, se pasa una copia en lugar del propio objeto. Dado que son copias, cualquier cambio realizado en el parámetro no
tiene ningún efecto en el método de llamada. Los tipos de valor reciben su nombre del hecho de que se pasa una copia del
objeto en lugar del propio objeto. Se pasa el valor, pero no el objeto mismo.
Para obtener más información sobre el paso de tipos de valor, vea
Pasar parámetros de tipo de valor (Guía de programación de C#). Para obtener una lista de tipos de valores integrales de C#,
vea Tabla de tipos de valores (Referencia de C#).
Esto es diferente de los tipos de referencia, que se pasan por referencia. Cuando un objeto basado en un tipo de referencia se
pasa a un método, no se realiza ninguna copia del objeto. En su lugar, se hace una referencia al objeto que se utiliza como
argumento del método y se pasa dicha referencia. Los cambios realizados a través de esta referencia se reflejarán por
consiguiente en el método de llamada. Un tipo de referencia se crea con la palabra clave class, de la forma siguiente:
C#
public class SampleRefType
{
public int value;
}

Ahora, si un objeto basado en este tipo se pasa a un método, se pasará por referencia. Por ejemplo:
C#
public static void TestRefType()
{
SampleRefType rt = new SampleRefType();
rt.value = 44;
ModifyObject(rt);
System.Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
obj.value = 33;
}

Este ejemplo hace esencialmente lo mismo que el ejemplo anterior. Pero, como se utiliza un tipo de referencia, la modificación
realizada por ModifyObject se efectúa en el objeto creado en el método TestRefType. Por consiguiente, el método
TestRefType mostrará el valor 33.

Para obtener más información, vea Pasar parámetros Reference-Type (Guía de programación de C#) y
Tipos de referencia (Referencia de C#).
Valores devueltos
Los métodos pueden devolver un valor al llamador. Si el tipo de valor devuelto (el que aparece antes del nombre de método)
no es void, el método puede devolver el valor mediante la palabra clave return. Una instrucción con la palabra clave return,
seguida de un valor que coincida con el tipo de valor devuelto, devolverá ese valor al llamador del método. La palabra clave
return también detiene la ejecución del método. Si el tipo de valor devuelto es void, una instrucción return sin ningún valor
sigue siendo útil para detener la ejecución del método. Sin la palabra clave return, el método detendrá la ejecución cuando
llegue al fin del bloque de código. Es necesario que los métodos con un tipo de valor devuelto no nulo utilicen la palabra clave
return para devolver un valor. Por ejemplo, estos dos métodos utilizan la palabra clave return para devolver enteros:
C#
class SimpleMath
{
public int AddTwoNumbers(int number1, int number2)
{
return number1 + number2;
}

public int SquareANumber(int number)


{
return number * number;
}
}
Para emplear un valor devuelto por un método, el método de llamada puede utilizar la propia llamada del método en cualquier
parte donde un valor del mismo tipo sea suficiente. El valor devuelto también se puede asignar a una variable. Por ejemplo, los
dos ejemplos de código siguientes logran el mismo objetivo:
C#
int result = obj.AddTwoNumbers(1, 2);
obj.SquareANumber(result);

C#
obj.SquareANumber(obj.AddTwoNumbers(1, 2));

El uso de una variable intermedia, en este caso result, para almacenar un valor es opcional. La legibilidad del código puede
ser útil o puede ser necesaria si el valor se va a utilizar más de una vez.
Para obtener más información, vea return (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
1.6.5 Métodos
10.5 Métodos
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Modificadores de acceso (Guía de programación de C#)
Clases estáticas y sus miembros (Guía de programación de C#)
Herencia (Guía de programación de C#)
params (Referencia de C#)
return (Referencia de C#)
out (Referencia de C#)
ref (Referencia de C#)
Pasar parámetros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Pasar parámetros (Guía de programación de C#)


En C#, los parámetros se pueden pasar por valor o por referencia. El paso de parámetros por referencia permite a los
miembros de funciones, métodos, propiedades, indizadores, operadores y constructores, cambiar el valor de los parámetros y
hacer que ese cambio persista. Para pasar un parámetro por referencia, utilice una de las palabras clave ref o out. En los
ejemplos de este tema, para simplificar, sólo se utiliza la palabra clave ref. Para más información sobre las diferencias entre ref
y out, vea ref, out, y Pasar matrices utilizando ref y out. Por ejemplo:
C#
// Passing by value
static void Square(int x)
{
// code...
}

C#
// Passing by reference
static void Square(ref int x)
{
// code...
}

En este tema, se incluyen las siguientes secciones:


Pasar parámetros de tipo de valor
Pasar parámetros de tipo de referencia
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5.1 Parámetros
5.1.4 Parámetros de valores
5.1.5 Parámetros de referencia
5.1.6 Parámetros de salida
10.5.1 Parámetros de métodos
Vea también
Referencia
Métodos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Pasar parámetros de tipo de valor (Guía de programación de


C#)
Una variable de tipo de valor contiene directamente los datos, a diferencia de una variable de tipo de referencia, que contiene
una referencia a los datos. Por lo tanto, pasar una variable de tipo de valor a un método significa pasar una copia de la variable
al método. Cualquier cambio en el parámetro que se produzca dentro del método no afectará a los datos originales
almacenados en la variable. Si se desea que el método llamado pueda cambiar el valor del parámetro, deberá pasarlo por
referencia, utilizando la palabra clave ref uout. Para simplificar, los siguientes ejemplos utilizan ref.
Ejemplo 1: pasar tipos de valor por valor
El siguiente ejemplo ilustra el paso de parámetros de tipo de valor por valor. La variable n se pasa por valor al método
SquareIt. Cualquier cambio que se produzca dentro del método no afectará al valor original de la variable.

C#
class PassingValByVal
{
static void SquareIt(int x)
// The parameter x is passed by value.
// Changes to x will not affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);

SquareIt(n); // Passing the variable by value.


System.Console.WriteLine("The value after calling the method: {0}", n);
}
}

Resultados
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 5

Descripción del código


La variable n, que es un tipo de valor, contiene su dato, el valor 5. Cuando se invoca SquareIt, el contenido de n se copia en el
parámetro x, el cual se eleva al cuadrado dentro del método. Sin embargo, en Main, el valor de n es el mismo, antes y después
de llamar al método SquareIt. De hecho, el cambio que se produce dentro del método sólo afecta a la variable local x.
Ejemplo 1: pasar tipos de valor por referencia
El siguiente ejemplo es igual que el ejemplo anterior, excepto que el parámetro se pasa mediante la palabra clave ref. El valor
del parámetro cambia después de llamar al método.
C#
class PassingValByRef
{
static void SquareIt(ref int x)
// The parameter x is passed by reference.
// Changes to x will affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);

SquareIt(ref n); // Passing the variable by reference.


System.Console.WriteLine("The value after calling the method: {0}", n);
}
}

Resultados
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25

Descripción del código


En este ejemplo, no se pasa el valor de n, sino una referencia a n. El parámetro x no es de tipo int; es una referencia a un valor
de tipo int, en este caso, una referencia a n. Por lo tanto, cuando x se eleva al cuadrado dentro del método, lo que realmente se
eleva al cuadrado es la variable a la que x hace referencia, es decir, n.
Ejemplo 3: intercambiar tipos de valor
Un ejemplo habitual de cambio de valores de los parámetros pasados es el método Swap, en el que se pasan dos variables, x e
y, y el método intercambia su contenido. Los parámetros se deben pasar al método Swap por referencia; de otro modo, se
estarán utilizando copias locales de los parámetros dentro del método. El siguiente es un ejemplo del método Swap que utiliza
parámetros por referencia:
C#
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}

Cuando se invoca este método, se debe utilizar la palabra clave ref en la llamada, como se muestra a continuación:
C#
static void Main()
{
int i = 2, j = 3;
System.Console.WriteLine("i = {0} j = {1}" , i, j);

SwapByRef (ref i, ref j);


System.Console.WriteLine("i = {0} j = {1}" , i, j);
}

Resultados
i = 2 j = 3
i = 3 j = 2

Vea también
Referencia
Pasar parámetros (Guía de programación de C#)
Pasar parámetros Reference-Type (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Pasar parámetros Reference-Type (Guía de programación de


C#)
Una variable de un tipo de referencia no contiene directamente sus datos; contiene una referencia a ellos. Cuando se pasa un
parámetro de tipo de referencia por valor, es posible cambiar los datos a los que apunta la referencia, como el valor de un
miembro de clase. Sin embargo, no se puede cambiar el valor de la propia referencia; es decir, no se puede utilizar la misma
referencia para asignar memoria a una nueva clase y hacer que persista fuera del bloque. Para hacer esto, se debe pasar el
parámetro mediante la palabra clave ref u out. Para simplificar, los siguientes ejemplos utilizan ref.
Ejemplo 1: pasar tipos de referencia por valor
El siguiente ejemplo ilustra el paso de un parámetro de tipo de referencia, arr, por valor, a un método, Change. Como el
parámetro es una referencia a arr, es posible cambiar los valores de los elementos de la matriz. Sin embargo, el intento de
volver a asignar el parámetro a otra ubicación de memoria sólo funciona dentro del método y no afecta a la variable original,
arr.

C#
class PassingRefByVal
{
static void Change(int[] pArray)
{
pArray[0] = 888; // This change affects the original element.
pArray = new int[5] {-3, -1, -2, -3, -4}; // This change is local.
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0])
;
}

static void Main()


{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside Main, before calling the method, the first element
is: {0}", arr [0]);

Change(arr);
System.Console.WriteLine("Inside Main, after calling the method, the first element
is: {0}", arr [0]);
}
}

Resultados
Inside Main, before calling the method, the first element is: 1
Inside the method, the first element is: -3
Inside Main, after calling the method, the first element is: 888

Descripción del código


En el ejemplo anterior, la matriz arr, que es un tipo de referencia, se pasa al método sin el parámetro ref. En ese caso, lo que se
pasa al método es una copia de la referencia, la cual apunta a arr. El resultado muestra cómo el método puede cambiar el
contenido de un elemento de la matriz, en este caso de 1 a 888. Sin embargo, cuando se asigna una nueva porción de memoria
mediante el operador new dentro del método Change, la variable pArray hace referencia a una nueva matriz. De este modo,
cualquier cambio posterior no afectará a la matriz original, arr, que se crea dentro de Main. De hecho, en este ejemplo se crean
dos matrices, una dentro de Main y otra dentro del método Change.
Ejemplo 1: pasar tipos de referencia por referencia
Este ejemplo es el mismo que el ejemplo anterior, excepto que utiliza la palabra clave ref en el encabezado del método y en la
llamada. Cualquier cambio que se realice en el método afectará a las variables originales del programa que hace la llamada.
C#
class PassingRefByRef
{
static void Change(ref int[] pArray)
{
// Both of the following changes will affect the original variables:
pArray[0] = 888;
pArray = new int[5] {-3, -1, -2, -3, -4};
System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0])
;
}
static void Main()
{
int[] arr = {1, 4, 5};
System.Console.WriteLine("Inside Main, before calling the method, the first element
is: {0}", arr[0]);

Change(ref arr);
System.Console.WriteLine("Inside Main, after calling the method, the first element
is: {0}", arr[0]);
}
}

Resultados
Inside Main, before calling the method, the first element is: 1
Inside the method, the first element is: -3
Inside Main, after calling the method, the first element is: -3

Descripción del código


Todos los cambios que tienen lugar dentro del método afectan a la matriz original en Main. De hecho, la matriz original se
reasigna mediante el operador new. De esta forma, después de llamar al método Change, cualquier referencia a arr apunta a la
matriz de cinco elementos que se crea en el método Change.
Ejemplo: intercambiar dos cadenas
El intercambio de cadenas constituye un buen ejemplo de paso de parámetros de tipo de referencia por referencia. En el
ejemplo, se inicializan dos cadenas, str1 y str2, en Main y se pasan al método SwapStrings como parámetros modificados por
la palabra clave ref. Las dos cadenas se intercambian dentro del método y también dentro de Main.
C#
class SwappingStrings
{
static void SwapStrings(ref string s1, ref string s2)
// The string parameter is passed by reference.
// Any changes on parameters will affect the original variables.
{
string temp = s1;
s1 = s2;
s2 = temp;
System.Console.WriteLine("Inside the method: {0} {1}", s1, s2);
}
static void Main()
{
string str1 = "John";
string str2 = "Smith";
System.Console.WriteLine("Inside Main, before swapping: {0} {1}", str1, str2);

SwapStrings(ref str1, ref str2); // Passing strings by reference


System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
}
}

Resultados
Inside Main, before swapping: John Smith
Inside the method: Smith John
Inside Main, after swapping: Smith John

Descripción del código


En este ejemplo, los parámetros se deben pasar por referencia para que afecten a las variables del programa que realiza la
llamada. Si se elimina la palabra clave ref del encabezado del método y de la llamada al método, no se producirá ningún
cambio en el programa que realiza la llamada.
Para obtener más información sobre las cadenas, vea string.
Vea también
Referencia
Pasar parámetros (Guía de programación de C#)
Pasar matrices mediante Ref y Out (Guía de programación de C#)
ref (Referencia de C#)
Tipos de referencia (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Constructores (Guía de programación de C#)


Cada vez que se crea una clase o estructura, se llama a su constructor. Una clase o estructura puede tener varios constructores
que toman argumentos diferentes. Los constructores permiten al programador establecer valores predeterminados, limitar la
creación de instancias y escribir código flexible y fácil de leer.
Si no proporciona un constructor para el objeto, C# creará uno de forma predeterminada que crea instancias del objeto y
establecer las variables miembro con los valores predeterminados indicados en:
Tabla de valores predeterminados (Referencia de C#). Las clases y estructuras estáticas también pueden tener constructores.
En esta sección
Utilizar constructores (Guía de programación de C#)
Constructores de instancias (Guía de programación de C#)
Constructores privados (Guía de programación de C#)
Constructores estáticos (Guía de programación de C#)
Cómo: Escribir un constructor Copy (Guía de programación de C#)
Secciones relacionadas
Guía de programación de C#
Objetos, clases y estructuras (Guía de programación de C#)
Diseño de constructores
Destructores (Guía de programación de C#)
static (Referencia de C#)
Guía de programación de C#

Utilizar constructores (Guía de programación de C#)


Los constructores son métodos de clase que se ejecutan cuando se crea un objeto de un tipo determinado. Los constructores
tienen el mismo nombre que la clase y, normalmente, inicializan los miembros de datos del nuevo objeto.
En el ejemplo siguiente, una clase denominada Taxi se define con un constructor simple. Esta clase crea instancias con el
operador new. El operador new invoca el constructor Taxi inmediatamente después de asignar la memoria al nuevo objeto.
C#
public class Taxi
{
public bool isInitialized;
public Taxi()
{
isInitialized = true;
}
}

class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
System.Console.WriteLine(t.isInitialized);
}
}

Un constructor que no toma ningún parámetro se denomina constructor predeterminado. Se invocan los constructores
predeterminados cada vez que se crea una instancia de un objeto mediante el operador new y no se proporciona ningún
argumento a new. Para obtener más información, vea Constructores de instancias (Guía de programación de C#).
A menos que la clase sea estática, a las clases sin constructores se les asigna un constructor público predeterminado a través
del compilador de C# con el fin de habilitar la creación de instancias de clases. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).
Es posible evitar que se creen instancias de una clase mediante la conversión del constructor a privado, como se muestra a
continuación:
C#
class NLog
{
// Private Constructor:
private NLog() { }

public static double e = System.Math.E; //2.71828...


}

Para obtener más información, vea Constructores privados (Guía de programación de C#).
Los constructores para los tipos struct son similares a los constructores de clases, pero los tipos structs no pueden contener
un constructor predeterminado explícito porque el compilador proporciona uno automáticamente. Este constructor inicializa
cada campo de la estructura en los valores predeterminados mostrados en la
Tabla de valores predeterminados (Referencia de C#). Sin embargo, este constructor predeterminado sólo se invoca si se crean
instancias de la estructura con new. Por ejemplo, en este código se utiliza el constructor predeterminado para Int32, lo que
garantiza que se inicializa el tipo integral:

int i = new int();


Console.WriteLine(i);

Sin embargo, el código siguiente da como resultado el Error del compilador CS0165 porque no se utiliza new y se intenta
utilizar un objeto que no se ha inicializado:

int i;
Console.WriteLine(i);

Alternativamente, se pueden inicializar objetos basados en structs o asignarse y, a continuación, utilizarse de la forma
siguiente:

int a = 44; // Initialize the value type...


int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

En consecuencia no se requiere llamar al constructor predeterminado para un tipo de valor.


Tanto las clases como las structs pueden definir constructores que acepten parámetros. Se debe llamar a constructores que
toman parámetros a través de una instrucción new o base. Las clases y las structs también pueden definir varios
constructores y no se requiere ninguno para definir un constructor predeterminado. Por ejemplo:
C#
public class Employee
{
public int salary;

public Employee(int annualSalary)


{
salary = annualSalary;
}

public Employee(int weeklySalary, int numberOfWeeks)


{
salary = weeklySalary * numberOfWeeks;
}
}

Esta clase se puede crear mediante cualquiera de las siguientes instrucciones:


C#
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Cualquier constructor puede utilizar la palabra clave base para llamar al constructor de una clase base. Por ejemplo:
C#
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}

En este ejemplo, se llama al constructor de la clase base antes de ejecutar el bloque del constructor. La palabra clave base se
puede utilizar con o sin parámetros. Cualquier parámetro del constructor se puede utilizar como parámetro de base o como
parte de una expresión. Para obtener más información, vea base (Referencia de C#).
En una clase derivada, si no se llama explícitamente al constructor de la clase base mediante la palabra clave base, se llama
implícitamente al constructor predeterminado, si hay uno. Esto significa que las siguientes declaraciones del constructor son
efectivamente las mismas:
C#
public Manager(int initialdata)
{
//Add further instructions here.
}

C#
public Manager(int initialdata) : base()
{
//Add further instructions here.
}

Si una clase base no proporciona un constructor predeterminado, la clase derivada debe realizar una llamada explícita a un
constructor base mediante base.
Un constructor puede invocar a otro constructor en el mismo objeto a través de la palabra clave this. Al igual que base, this se
puede utilizar con o sin parámetros y cualquier parámetro en el constructor está disponible como parámetro para this o como
parte de una expresión. Por ejemplo, el segundo constructor del ejemplo anterior se puede rescribir con this:
C#
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}

El uso de la palabra clave this utilizada anteriormente hace que este constructor se denomine:
C#
public Employee(int annualSalary)
{
salary = annualSalary;
}

Los constructores se pueden marcar como public, private, protected, internal o protected internal. Estos modificadores de
acceso definen cómo los usuarios de la clase pueden construir la clase. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Un constructor se puede declarar como estático mediante la palabra clave static. Se llama automáticamente a los constructores
estáticos de forma inmediata antes de que se tenga acceso a cualquier campo estático y, normalmente, se utilizan para
inicializar los miembros de clase estáticos. Para obtener más información, vea
Constructores estáticos (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las siguientes secciones en la Especificación del lenguaje C#:
1.6.6.1 Constructores
10.10 Constructores de instancia (Clases)
10.11 Constructores de instancia (Clases)
11.3.8 Constructores (Estructuras)
11.3.10 Constructores estáticos (Estructuras)
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Destructores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Constructores de instancias (Guía de programación de C#)


Los constructores de instancia se utilizan para crear e inicializar instancias. El constructor de clase se invoca al crear un objeto
nuevo, por ejemplo:
C#
class CoOrds
{
public int x, y;

// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}

Nota
Para mayor claridad, esta clase contiene los miembros de datos públicos. Esto no es un buen hábito de programación porque
permite que cualquier método de cualquier parte del programa tenga acceso sin restricciones ni comprobaciones al trabajo i
nterno de un objeto. Los miembros de datos generalmente deberían ser privados y sólo se debería obtener acceso a ellos a t
ravés de los métodos y propiedades de clase.

Se llama a este constructor cada vez que se crea un objeto basado en la clase CoOrds. Un constructor como éste, que no toma
ningún argumento, se denomina constructor predeterminado. Sin embargo, suele ser útil proporcionar constructores
adicionales. Por ejemplo, se puede agregar a la clase CoOrds un constructor que permita especificar los valores iniciales de los
miembros de datos:
C#
// A constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}

Esto permite crear objetos CoOrd con valores iniciales concretos o predeterminados, del modo siguiente:
C#
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

Si una clase no tiene un constructor predeterminado, se genera uno automáticamente y se utilizan los valores
predeterminados para inicializar los campos del objeto, por ejemplo, un campo de tipo int se inicializa en 0. Para obtener más
información sobre los valores predeterminados, vea Tabla de valores predeterminados (Referencia de C#). Por consiguiente,
como el constructor predeterminado de la clase CoOrds inicializa todos los miembros de datos en cero, se puede quitar del
todo sin cambiar el funcionamiento de la clase. En el ejemplo 1, más adelante en este tema, hay un objeto completo del uso de
varios constructores. Además, en el ejemplo 2 se proporciona un ejemplo de un constructor generado automáticamente.
Los constructores de instancia también se pueden utilizar para llamar a los constructores de instancia de clases base. El
constructor de clase puede invocar el constructor de la clase base a través del inicializador, del modo siguiente:
C#
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}

En este ejemplo, la clase Circle pasa los valores que representan el radio y alto al constructor proporcionado por Shape del
que se deriva Circle. En el ejemplo 3 de este tema aparece un ejemplo completo del uso de Shape y Circle.
Ejemplo 1
En el siguiente ejemplo se muestra una clase con dos constructores de clase, uno sin argumentos y el otro con dos
argumentos.
C#
class CoOrds
{
public int x, y;
// Default constructor:
public CoOrds()
{
x = 0;
y = 0;
}
// A constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}

// Override the ToString method:


public override string ToString()
{
return (System.String.Format("({0},{1})", x, y));
}
}

class MainClass
{
static void Main()
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

// Display the results using the overriden ToString method:


System.Console.WriteLine("CoOrds #1 at {0}", p1);
System.Console.WriteLine("CoOrds #2 at {0}", p2);
}
}

Resultado
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)

Ejemplo 2
En este ejemplo, la clase Person no tiene ningún constructor, por lo que se proporciona automáticamente un constructor
predeterminado y los campos se inicializan con los valores predeterminados.
C#
public class Person
{
public int age;
public string name;
}

class TestPerson
{
static void Main()
{
Person p = new Person();

System.Console.Write("Name: {0}, Age: {1}", p.name, p.age);


}
}

Resultado
Name: , Age: 0

Observe que el valor predeterminado de age es 0 y el de name es null. Para obtener más información sobre los valores
predeterminados, vea Tabla de valores predeterminados (Referencia de C#).
Ejemplo 3
En el siguiente ejemplo se muestra el uso del inicializador de clase base. La clase Circle se deriva de la clase general Shape y la
clase Cylinder se deriva de la clase Circle. El constructor utiliza su inicializador de clase base en cada clase derivada.
C#
abstract class Shape
{
public const double pi = System.Math.PI;
protected double x, y;
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public abstract double Area();
}

class Circle : Shape


{
public Circle(double radius)
: base(radius, 0)
{
}
public override double Area()
{
return pi * x * x;
}
}

class Cylinder : Circle


{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}

public override double Area()


{
return (2 * base.Area()) + (2 * pi * x * y);
}
}

class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;

Circle ring = new Circle(radius);


Cylinder tube = new Cylinder(radius, height);

System.Console.WriteLine("Area of the circle = {0:F2}", ring.Area());


System.Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
}
}

Resultado
Area of the circle = 19.63
Area of the cylinder = 86.39

Para obtener más ejemplos sobre cómo invocar los constructores de clase base, vea virtual (Referencia de C#),
override (Referencia de C#) y base (Referencia de C#).
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Destructores (Guía de programación de C#)
static (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Constructores privados (Guía de programación de C#)


Un constructor private es un caso especial de constructor de instancia. Se utiliza normalmente en clases que contienen sólo
miembros estáticos. Si una clase tiene uno o más constructores privados y ningún constructor público, el resto de clases
(excepto las anidadas) no tiene permiso para crear instancias de esta clase. Por ejemplo:
C#
class NLog
{
// Private Constructor:
private NLog() { }

public static double e = System.Math.E; //2.71828...


}

La declaración de un constructor vacío evita la generación automática de un constructor predeterminado. Observe que si no
utiliza un modificador de acceso en el constructor, éste será private de manera predeterminada. Sin embargo, normalmente se
utiliza el modificador private de manera explícita para aclarar que no es posible crear una instancia de la clase.
Los constructores privados se utilizan para evitar la creación de instancias de una clase cuando no hay campos o métodos de
instancia, por ejemplo la clase Math, o cuando se llama a un método para obtener una instancia de una clase. Si todos los
métodos de la clase son estáticos, considere convertir la clase completa en estática. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).
Ejemplo
El siguiente es un ejemplo de clase que utiliza un constructor private.
C#
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error

Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}", Counter.currentCount);
}
}

Resultado
New count: 101

Observe que si quita el comentario de la siguiente instrucción del ejemplo, se producirá un error porque el constructor es
inaccesible debido a su nivel de protección:
C#
// Counter aCounter = new Counter(); // Error
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.10.5 Constructores privados
25.2 Clases estáticas
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Destructores (Guía de programación de C#)
private (Referencia de C#)
public (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Constructores estáticos (Guía de programación de C#)


Un constructor estático se utiliza para inicializar cualquier dato estático o realizar una acción determinada que sólo debe
realizarse una vez. Es llamado automáticamente antes de crear la primera instancia o de hacer referencia a cualquier miembro
estático.
C#
class SimpleClass
{
// Static constructor
static SimpleClass()
{
//...
}
}

Los constructores estáticos tienen las propiedades siguientes:


Un constructor estático no permite modificadores de acceso ni tiene parámetros.
Se le llama automáticamente para inicializar la clase antes de crear la primera instancia o de hacer referencia a cualquier
miembro estático.
El constructor estático no puede ser llamado directamente.
El usuario no puede controlar cuando se ejecuta el constructor estático en el programa.
Los constructores estáticos se utilizan normalmente cuando la clase hace uso de un archivo de registro y el constructor
escribe entradas en dicho archivo.
Los constructores estáticos también son útiles al crear clases contenedoras para código no administrado, cuando el
constructor puede llamar al método LoadLibrary.
Ejemplo
En este ejemplo, la clase Bus tiene un constructor estático y un miembro estático, Drive(). Cuando se llama a Drive(), se
invoca el constructor estático para inicializar la clase.
C#
public class Bus
{
// Static constructor:
static Bus()
{
System.Console.WriteLine("The static constructor invoked.");
}
public static void Drive()
{
System.Console.WriteLine("The Drive method invoked.");
}
}

class TestBus
{
static void Main()
{
Bus.Drive();
}
}

Resultado
The static constructor invoked.
The Drive method invoked.

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Destructores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Cómo: Escribir un constructor Copy (Guía de programación de


C#)
A diferencia de algunos lenguajes, C# no proporciona un constructor Copy. Si crea un nuevo objeto y desea copiar los valores
de un objeto existente, tiene que escribir de nuevo el método adecuado.
Ejemplo
En este ejemplo, la clase Person contiene un constructor que toma como argumento otro objeto de tipo Person. El contenido
de los campos de este objeto se asigna a continuación a los campos del nuevo objeto.
C#
class Person
{
private string name;
private int age;
// Copy constructor.
public Person(Person previousPerson)
{
name = previousPerson.name;
age = previousPerson.age;
}

// Instance constructor.
public Person(string name, int age)
{
this.name = name;
this.age = age;
}

// Get accessor.
public string Details
{
get
{
return name + " is " + age.ToString();
}
}
}
class TestPerson
{
static void Main()
{
// Create a new person object.
Person person1 = new Person("George", 40);

// Create another new object, copying person1.


Person person2 = new Person(person1);
System.Console.WriteLine(person2.Details);
}
}

Resultados
George is 40

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Destructores (Guía de programación de C#)
ICloneable
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Destructores (Guía de programación de C#)


Los destructores se utilizan para destruir instancias de clases.
Comentarios
Los destructores no se pueden definir en estructuras. Sólo se utilizan con clases.
Una clase sólo puede tener un destructor.
Los destructores no se pueden heredar ni sobrecargar.
No se puede llamar a los destructores. Se invocan automáticamente.
Un destructor no permite modificadores de acceso ni tiene parámetros.
Por ejemplo, el siguiente código muestra una declaración de un destructor para la clase Car:
C#
class Car
{
~ Car() // destructor
{
// cleanup statements...
}
}

El destructor llama implícitamente al método Finalize en la case base del objeto. Por lo tanto, el código de destructor anterior
se traduce implícitamente a:

protected override void Finalize()


{
try
{
// cleanup statements...
}
finally
{
base.Finalize();
}
}

Esto significa que se llama al método Finalize de forma recursiva para todas las instancias de la cadena de herencia, desde la
más derivada hasta la menos derivada.
Nota
No se deben utilizar destructores vacíos. Cuando una clase contiene un destructor, se crea una entrada en la cola Finalize. C
uando se llama al destructor, se invoca al recolector de elementos no utilizados para procesar la cola. Si el destructor está vac
ío, simplemente se produce una pérdida de rendimiento innecesaria.

El programador no puede controlar cuándo se llama al destructor, porque esto lo determina el recolector de elementos no
utilizados. El recolector de elementos no utilizados comprueba si hay objetos que ya no están siendo utilizados por ninguna
aplicación. Si considera un objeto elegible para su destrucción, llama al destructor (si existe) y reclama la memoria utilizada
para almacenar el objeto. También se llama a los destructores cuando se cierra el programa.
Es posible forzar la recolección de elementos no utilizados llamando al método Collect, pero en la mayoría de los casos debe
evitarse su uso por razones de rendimiento. Para obtener más información, vea
Forzar una recolección de elementos no utilizados.
Utilizar destructores para liberar recursos
En general, C# no requiere tanta administración de memoria como se necesita al desarrollar con un lenguaje que no está
diseñado para un motor en tiempo de ejecución con recolección de elementos no utilizados. Esto es debido a que el recolector
de elementos no utilizados de .NET Framework administra implícitamente la asignación y liberación de memoria para los
objetos. Sin embargo, cuando la aplicación encapsule recursos no administrados como ventanas, archivos y conexiones de red,
debería utilizar destructores para liberar dichos recursos. Cuando el objeto se marca para su destrucción, el recolector de
elementos no utilizados ejecuta el método Finalize.
Liberación explícita de recursos
Si la aplicación utiliza un recurso externo caro, también es recomendable liberar explícitamente el recurso antes de que el
recolector de elementos utilizados libere el objeto. Para ello debe implementar un método Dispose desde la interfaz
IDisposable que realiza la limpieza del objeto necesaria. Esto puede mejorar considerablemente el rendimiento de la aplicación.
Aunque controle explícitamente los recursos, el destructor garantiza la liberación de recursos si falla la llamada al método
Dispose.

Para obtener más detalles sobre la liberación de recursos, vea los siguientes temas:
Limpiar recursos no administrados
Implementar un método Dispose
using (Instrucción, Referencia de C#)
Ejemplo
En el siguiente ejemplo se crean tres clases que forman una cadena de herencia. La clase First es la clase base, Second se
deriva de First y Third se deriva de Second. Las tres tienen destructores. En Main(), se crea una instancia de la clase más
derivada. Cuando ejecute el programa, observe que se llama a los destructores de las tres clases automáticamente y en orden,
desde la más derivada hasta la menos derivada.
C#
class First
{
~First()
{
System.Console.WriteLine("First's destructor is called");
}
}

class Second: First


{
~Second()
{
System.Console.WriteLine("Second's destructor is called");
}
}

class Third: Second


{
~Third()
{
System.Console.WriteLine("Third's destructor is called");
}
}

class TestDestructors
{
static void Main()
{
Third t = new Third();
}
}

Resultados
Third's destructor is called
Second's destructor is called
First's destructor is called

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.6 Destructores
10.2.7.4 Nombres de miembros reservados para destructores
10.12 Destructores (Clases)
11.3.9 Destructores (Estructuras)
Vea también
Referencia
IDisposable
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Recolección de elementos no utilizados
Guía de programación de C#

Campos (Guía de programación de C#)


En este tema se describen campos, que son objetos o valores contenidos en una clase o estructura. Los campos permiten a las
clases y estructuras encapsular datos.
Para mayor simplicidad, estos ejemplos utilizan campos que son public, pero esto no se recomienda en la práctica. Los
campos generalmente deberían ser private. El acceso a campos por parte de clases externas debería ser indirecto, por medio
de métodos, propiedades o indizadores. Para obtener más información, vea Métodos (Guía de programación de C#),
Propiedades (Guía de programación de C#) e Indizadores (Guía de programación de C#).
Campos
Los campos almacenan los datos que una clase necesita para cumplir su cometido. Por ejemplo, una clase que representara
una fecha del calendario podría tener tres campos enteros: uno para el mes, otro para el día y un tercero para el año. Los
campos se declaran dentro del bloque de la clase especificando el nivel de acceso del campo, seguido por el tipo del campo, y
seguido por el nombre del campo. Por ejemplo:
C#
public class CalendarDate
{
public int month;
public int day;
public int year;
}

El acceso a un campo en un objeto se realiza agregando un punto después del nombre de objeto, seguido del nombre del
campo, como en objectname.fieldname. Por ejemplo:
C#
CalendarDate birthday = new CalendarDate();
birthday.month = 7;

Se puede proporcionar un valor inicial a un campo utilizando el operador de asignación cuando se declara el campo. Para
asignar automáticamente al campo month el valor 7, por ejemplo, declararía month de la manera siguiente:
C#
public class CalendarDateWithInitialization
{
public int month = 7;
//...
}

Los campos se inicializan inmediatamente antes de llamar al constructor para la instancia de objeto, de modo que si el
constructor asigna el valor de un campo, sobrescribirá cualquier valor dado durante la declaración del campo. Para obtener
más información, vea Utilizar constructores (Guía de programación de C#).
Nota
Un inicializador de campo no puede hacer referencia a campos de otra instancia.

Los campos se pueden marcar como public, private, protected, internal o protected internal. Estos modificadores de acceso
definen cómo pueden tener acceso a los campos los usuarios de la clase. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Un campo puede declararse de forma opcional como static. Esto hace que el campo esté siempre disponible para los
llamadores, aunque no exista ninguna instancia de la clase. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).
Un campo puede declararse como readonly. Sólo es posible asignar un valor a un campo de tipo readonly durante la
inicialización o en un constructor. Un campo static readonly es muy similar a una constante, excepto en que el compilador de
C# no tiene acceso a él en tiempo de compilación, sólo en tiempo de ejecución. Para obtener más información, vea
Constantes (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.4 Campos
10.4 Campos
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Utilizar constructores (Guía de programación de C#)
Herencia (Guía de programación de C#)
Modificadores de acceso (Guía de programación de C#)
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Constantes (Guía de programación de C#)


Las clases y las estructuras pueden declarar las constantes como miembros. Las constantes son valores que se conocen en
tiempo de compilación y no cambian. (Para crear un valor constante que se inicializa en el tiempo de ejecución, utilice la
palabra clave readonly.) Las constantes se declaran como campo utilizando la palabra clave const antes del tipo del campo. Las
constantes se deben inicializar tal como se declaran. Por ejemplo:
C#
class Calendar1
{
public const int months = 12;
}

En este ejemplo, la constante months siempre será 12 y no se puede cambiar, ni siquiera puede hacerlo la propia clase. Las
constantes tienen que ser de un tipo integral (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal,
bool o string), una enumeración o una referencia a null.
Se pueden declarar varias constantes del mismo tipo al mismo tiempo, por ejemplo:
C#
class Calendar2
{
const int months = 12, weeks = 52, days = 365;
}

La expresión utilizada para inicializar una constante puede hacer referencia a otra constante siempre que no cree una
referencia circular. Por ejemplo:
C#
class Calendar3
{
const int months = 12;
const int weeks = 52;
const int days = 365;

const double daysPerWeek = days / weeks;


const double daysPerMonth = days / months;
}

Las constantes se pueden marcar como public, private, protected, internal o protectedinternal. Estos modificadores de acceso
definen cómo los usuarios de la clase pueden tener acceso a la constante. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Es posible tener acceso a las constantes como si fueran campos estáticos, aunque no pueden utilizar la palabra clave static. Las
expresiones que no están contenidas dentro de la clase que define la constante deben usar el nombre de la clase, un punto y el
nombre de la constante para tener acceso a la constante. Por ejemplo:
C#
int birthstones = Calendar.months;

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.3 Constantes
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Tipos de datos (Guía de programación de C#)
readonly (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Tipos anidados (Guía de programación de C#)


Un tipo definido en una clase o estructura se denomina tipo anidado. Por ejemplo:
C#
class Container
{
class Nested
{
Nested() { }
}
}

Independientemente de si los tipos externos son clases o estructuras, los tipos anidados se establecen de forma
predeterminada en private, pero pueden definirse como public, protected internal, protected, internal o private. En el ejemplo
anterior, Nested es inaccesible a los tipos externos, pero se puede establecer en public de la manera siguiente:
C#
class Container
{
public class Nested
{
Nested() { }
}
}

El tipo anidado o interno puede tener acceso al tipo contenedor o externo. Para tener acceso al tipo contenedor, páselo como
un constructor al tipo anidado. Por ejemplo:
C#
public class Container
{
public class Nested
{
private Container m_parent;

public Nested()
{
}
public Nested(Container parent)
{
m_parent = parent;
}
}
}

Los tipos anidados pueden tener acceso a los miembros private y protected del tipo contenedor, incluidos los miembros
private o protected heredados.
En la declaración anterior, el nombre completo de la clase Nested es Container.Nested. Éste es el nombre que se utiliza para
crear una nueva instancia de la clase anidada, como sigue:
C#
Container.Nested nest = new Container.Nested();

Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Modificadores de acceso (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Constructores (Guía de programación de C#)
Guía de programación de C#

Modificadores de acceso (Guía de programación de C#)


Las clases y las estructuras se pueden restringir para que sólo pueda utilizarlas el programa o espacio de nombres en el que se
declaran. Los miembros de clase se pueden restringir de modo que sólo puedan utilizarlos las clases derivadas o las clases
dentro del espacio de nombres o programa actual. Los modificadores de acceso son palabras clave agregadas a la clase,
estructura o declaración de miembro para especificar estas restricciones. Esas palabras clave son public, private, protected y
internal. Por ejemplo:
C#
public class Bicycle
{
public void Pedal() { }
}

Accesibilidad a clases y estructuras


Las clases y estructuras que no se anidan dentro de otras clases o estructuras pueden ser públicas o internas. Es posible tener
acceso a un tipo declarado como público a través de cualquier otro tipo. Sólo es posible tener acceso a un tipo declarado como
interno mediante tipos dentro del mismo ensamblado. Las clases y estructuras se declaran como internas de manera
predeterminada, a menos que la palabra clave public se agregue a la definición de clase, como en el ejemplo anterior. Las
definiciones de clase o estructura pueden agregar la palabra clave internal para hacer que su nivel de acceso sea explícito. Los
modificadores de acceso no afectan a la clase o estructura en sí misma; ésta siempre tiene acceso a ella y a cada uno de sus
propios miembros.
Accesibilidad de un miembro de clase y estructura
Los miembros de clase o estructura se pueden declarar con uno de cinco tipos de acceso. Pueden ser públicos o internos, como
las clases y las estructuras. Un miembro de clase se puede declarar como protected mediante el uso de la palabra clave
protected, lo cual significa que sólo los tipos derivados que usan la clase como base pueden tener acceso al miembro. Al
combinar las palabras clave protected e internal, un miembro de clase se puede marcar como protected internal. Sólo los
tipos derivados o tipos dentro del mismo ensamblado pueden tener acceso a ese miembro. Finalmente, un miembro de clase o
estructura se puede declarar como privado mediante la palabra clave private, lo cual indica que sólo la clase o estructura que
declara el miembro tiene acceso a ese miembro.
Para establecer el nivel de acceso para un miembro de clase o estructura, agregue la palabra clave adecuada a la declaración
del miembro. Algunos ejemplos:
C#
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }

// private field:
private int m_wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return m_wheels; }
}
}

Otros tipos
Las interfaces, como las clases, se pueden declarar como tipos públicos o internos. A diferencia de las clases, las interfaces
establecen como valor predeterminado el acceso interno. Los miembros de interfaz siempre son públicos y no se puede aplicar
ningún modificador de acceso.
Los miembros de espacio de nombres y de enumeración siempre son públicos y no se puede aplicar ningún modificador de
acceso.
Los delegados tienen acceso interno de forma predeterminada.
Cualquier tipo declarado dentro de un espacio de nombres o en el nivel superior de una unidad de compilación (por ejemplo,
no dentro de un espacio de nombres, clase o estructura) es interno de forma predeterminada, pero se puede hacer público.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes en la Especificación del lenguaje C#:
10.2.3 Modificadores de acceso
Vea también
Referencia
Objetos, clases y estructuras (Guía de programación de C#)
Interfaces (Guía de programación de C#)
private (Referencia de C#)
public (Referencia de C#)
internal (Referencia de C#)
protected (Referencia de C#)
class (Referencia de C#)
struct (Referencia de C#)
interface (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Definiciones de clase parciales (Guía de programación de C#)


Es posible dividir la definición de una clase, estructura o interfaz en dos o más archivos de código fuente. Cada archivo de
código fuente contiene una parte de la definición de clase y todas las partes se combinan cuando se compila la aplicación.
Existen diversas situaciones en las que es conveniente dividir una definición de clase:
Al trabajar en proyectos grandes, desplegar una clase en archivos independientes permite que varios programadores
trabajen simultáneamente con ella.
Al trabajar con un código fuente generado automáticamente, se puede agregar el código a la clase sin tener que volver a
crear el archivo de código fuente. Visual Studio utiliza este enfoque al crear formularios Windows Forms, código de
contenedor de Servicio Web, etc. Se puede crear código que utilice estas clases sin tener que modificar el archivo creado
por Visual Studio.
Para dividir una definición de clase, utilice el modificador de palabra clave partial, como se muestra a continuación:
C#
public partial class Employee
{
public void DoWork()
{
}
}

public partial class Employee


{
public void GoToLunch()
{
}
}

Comentarios
La utilización de la palabra clave partial indica que otras partes de la clase, estructura o interfaz se pueden definir dentro del
espacio de nombres. Todas las partes deben utilizar la palabra clave partial. Todas las partes deben estar disponibles en
tiempo de compilación para formar el tipo final. Todas las partes deben tener la misma accesibilidad, ya sea public, private, etc.
Si alguna de las partes se declara abstracta, todo el tipo se considera abstracto. Si alguna de las partes se declara sellada, todo
el tipo se considera sellado. Si alguna de las partes declara un tipo base, todo el tipo hereda esa clase.
Todas las partes que especifican una clase base deben concordar, pero las partes que omiten una clase base heredan
igualmente el tipo base. Las partes pueden especificar diferentes interfaces base, pero el tipo final implementa todas las
interfaces mostradas por todas las declaraciones parciales. Cualquier miembro de clase, estructura o interfaz declarados en
una definición parcial está disponible para todas las demás partes. El tipo final es la combinación de todas las partes en tiempo
de compilación.
Nota
El modificador partial no está disponible en declaraciones de delegado o enumeración.

Los tipos anidados pueden ser parciales, aunque el tipo en el que están anidados no sea propiamente parcial. Por ejemplo:
C#
class Container
{
partial class Nested
{
void Test() { }
}
partial class Nested
{
void Test2() { }
}
}

En tiempo de compilación, se combinan los atributos de definiciones de tipo parcial. Por ejemplo, las siguientes
declaraciones:
C#
[System.SerializableAttribute]
partial class Moon { }
[System.ObsoleteAttribute]
partial class Moon { }

equivalen a:
C#
[System.SerializableAttribute]
[System.ObsoleteAttribute]
class Moon { }

Los siguientes elementos se combinan a partir de todas las definiciones de tipo parcial:
comentarios XML
interfaces
atributos de parámetro de tipo genérico
atributos de clase
miembros
Por ejemplo, las siguientes declaraciones:
C#
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

equivalen a:
C#
class Earth : Planet, IRotate, IRevolve { }

Restricciones
Existen varias reglas que se deben seguir al trabajar con definiciones de clase parciales:
Todas las definiciones de tipo parcial creadas para ser parte del mismo tipo deben modificarse con partial. Por ejemplo,
las siguientes declaraciones de clase generan un error:
C#
public partial class A { }
//public class A { } // Error, must also be marked partial

El modificador partial sólo puede aparecer inmediatamente antes de las palabras clave class, struct o interface.
Se permiten tipos parciales anidados en definiciones de tipo parcial, por ejemplo:
C#
partial class ClassWithNestedClass
{
partial class NestedClass { }
}

partial class ClassWithNestedClass


{
partial class NestedClass { }
}

Todas las definiciones de tipo parcial que deben ser parte del mismo tipo deben definirse en el mismo ensamblado y el
mismo módulo (archivo .exe o .dll). Las definiciones parciales no pueden abarcar varios módulos.
Los parámetros de nombre de clase y tipo genérico deben coincidir en todas las definiciones de tipo parcial. Los tipos
genéricos pueden ser parciales. Todas las declaraciones parciales deben utilizar los mismos nombres de parámetro en el
mismo orden.
Las siguientes palabras clave en una definición de tipo parcial son opcionales, pero si hay alguna en una definición de
tipo parcial, no puede entrar en conflicto con las palabras clave especificadas en otra definición parcial para el mismo
tipo:
public
private
protected
internal
abstract
sealed
clase base
modificador new (partes anidadas)
restricciones genéricas (Para obtener más información, vea
Restricciones de tipos de parámetros (Guía de programación de C#)).
Ejemplo 1
Description
En el siguiente ejemplo, los campos y el constructor de la clase, CoOrds, se declaran en una definición de clase parcial, mientras
que el miembro PrintCoOrds se declara en otra definición de clase parcial.
C#
public partial class CoOrds
{
private int x;
private int y;

public CoOrds(int x, int y)


{
this.x = x;
this.y = y;
}
}

public partial class CoOrds


{
public void PrintCoOrds()
{
System.Console.WriteLine("CoOrds: {0},{1}", x, y);
}

class TestCoOrds
{
static void Main()
{
CoOrds myCoOrds = new CoOrds(10, 15);
myCoOrds.PrintCoOrds();
}
}

Resultado
CoOrds: 10,15

Ejemplo 2
Description
El siguiente ejemplo muestra que también se pueden desarrollar estructuras e interfaces parciales.
C#
partial interface ITest
{
void Interface_Test();
}

partial interface ITest


{
void Interface_Test2();
}

partial struct S1
{
void Struct_Test() { }
}

partial struct S1
{
void Struct_Test2() { }
}

Especificación del lenguaje C#


Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#.
23 tipos parciales
Vea también
Referencia
Interfaces (Guía de programación de C#)
partial (Referencia de C#)
Conceptos
Guía de programación de C#
Clases (Guía de programación de C#)
Estructuras (Guía de programación de C#)
Guía de programación de C#

Clases estáticas y sus miembros (Guía de programación de C#)


Las clases estáticas y sus miembros se utilizan para crear datos y funciones a las que se puede tener acceso sin crear una
instancia de la clase. Los miembros de clases estáticas pueden utilizarse para separar datos y comportamientos independientes
de cualquier identidad de objeto: los datos y las funciones no cambian, sin importar lo que le ocurra al objeto. Las clases
estáticas pueden utilizarse cuando no hay datos ni comportamiento de la clase que dependa de la identidad del objeto.
Clases estáticas
Una clase puede declararse como static, lo que indica que contiene sólo miembros estáticos. No es posible crear instancias de
una clase estática mediante la palabra clave new. Common Language Runtime (CLR) de .NET Framework carga
automáticamente las clases estáticas cuando se carga el programa o espacio de nombres que contiene la clase.
Utilice una clase estática para contener métodos que no estén asociados a un objeto concreto. Por ejemplo, es un requisito
común crear un conjunto de métodos que no actúen sobre datos de instancia y que no estén asociados a un objeto concreto
del código. Puede utilizar una clase estática para contener esos métodos.
Las características principales de una clase estática son:
Sólo contienen miembros estáticos.
No se puede crear instancias de ellas.
Son de tipo sealed.
No pueden contener Constructores de instancias (Guía de programación de C#).
Crear una clase estática es, por consiguiente, muy similar a crear una clase que contiene sólo miembros estáticos y un
constructor privado. Un constructor privado evita que se creen instancias de la clase.
La ventaja de utilizar una clase estática es que el compilador puede comprobar que no se agregue accidentalmente ningún
miembro de instancia. El compilador garantizará que no se puedan crear instancias de esta clase.
Las clases estáticas son de tipo sealed y, por consiguiente, no pueden heredarse. Las clases estáticas no pueden contener un
constructor, aunque sigue siendo posible declarar un constructor estático para asignar los valores iniciales o configurar algún
estado estático. Para obtener más información, vea Constructores estáticos (Guía de programación de C#).
Cuándo utilizar clases estáticas
Suponga que tiene una clase CompanyInfo que contiene los siguientes métodos para obtener información sobre el nombre y la
dirección de la compañía.
C#
class CompanyInfo
{
public string GetCompanyName() { return "CompanyName"; }
public string GetCompanyAddress() { return "CompanyAddress"; }
//...
}

Estos métodos no necesitan adjuntarse a una instancia concreta de la clase. Por consiguiente, en lugar de crear instancias
innecesarias de esta clase, puede declararla como una clase estática; por ejemplo:
C#
static class CompanyInfo
{
public static string GetCompanyName() { return "CompanyName"; }
public static string GetCompanyAddress() { return "CompanyAddress"; }
//...
}

Utilice una clase estática como unidad de organización para métodos no asociados a objetos concretos. Además, una clase
estática puede hacer que la implementación sea más sencilla y rápida, porque no es necesario crear un objeto para llamar a
sus métodos. Es conveniente organizar los métodos dentro de la clase de forma significativa, como los métodos de la clase
Math del espacio de nombres System.
Miembros estáticos
Se puede llamar a métodos, campos, propiedades o eventos estáticos de una clase aunque no se haya creado ninguna
instancia de la misma. Si se crea alguna instancia de la clase, no puede utilizarse para tener acceso al miembro estático. Sólo
existe una copia de los campos y eventos estáticos, y los métodos y propiedades estáticos sólo pueden tener acceso a campos
y eventos estáticos. Los miembros estáticos suelen utilizarse para representar datos o cálculos que no cambian según el estado
del objeto; por ejemplo, una biblioteca matemática puede contener métodos estáticos para calcular el seno y el coseno.
Los miembros de clase estáticos se declaran utilizando la palabra clave static delante del tipo de valor devuelto del miembro,
por ejemplo:
C#
public class Automobile
{
public static int NumberOfWheels = 4;
public static int SizeOfGasTank
{
get
{
return 15;
}
}
public static void Drive() { }
public static event EventType RunOutOfGas;

//other non-static fields and properties...


}

Los miembros estáticos se inicializan antes de que se tenga acceso al miembro estático por primera vez y antes de llamar al
constructor estático, si se va a llamar a alguno. Para tener acceso a un miembro de clase estático, utilice el nombre de la clase
en lugar de un nombre de variable para especificar la ubicación del miembro. Por ejemplo:
C#
Automobile.Drive();
int i = Automobile.NumberOfWheels;

Ejemplo
Este es un ejemplo de clase estática que contiene dos métodos que convierten la temperatura de grados Celsius en Fahrenheit
y viceversa:
C#
public static class TemperatureConverter
{
public static double CelsiusToFahrenheit(string temperatureCelsius)
{
// Convert argument to double for calculations.
double celsius = System.Double.Parse(temperatureCelsius);

// Convert Celsius to Fahrenheit.


double fahrenheit = (celsius * 9 / 5) + 32;

return fahrenheit;
}
public static double FahrenheitToCelsius(string temperatureFahrenheit)
{
// Convert argument to double for calculations.
double fahrenheit = System.Double.Parse(temperatureFahrenheit);

// Convert Fahrenheit to Celsius.


double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}
}

class TestTemperatureConverter
{
static void Main()
{
System.Console.WriteLine("Please select the convertor direction");
System.Console.WriteLine("1. From Celsius to Fahrenheit.");
System.Console.WriteLine("2. From Fahrenheit to Celsius.");
System.Console.Write(":");

string selection = System.Console.ReadLine();


double F, C = 0;
switch (selection)
{
case "1":
System.Console.Write("Please enter the Celsius temperature: ");
F = TemperatureConverter.CelsiusToFahrenheit(System.Console.ReadLine());
System.Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
break;
case "2":
System.Console.Write("Please enter the Fahrenheit temperature: ");
C = TemperatureConverter.FahrenheitToCelsius(System.Console.ReadLine());
System.Console.WriteLine("Temperature in Celsius: {0:F2}", C);
break;

default:
System.Console.WriteLine("Please select a convertor.");
break;
}
}
}

Entrada
2
98.6

Resultados de ejemplo:
Please select the convertor
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:2
Please enter the Fahrenheit temperature: 98.6
Temperature in Celsius: 37.00

A continuación se ofrece otro resultado de ejemplo:


Please select the convertor
1. From Celsius to Fahrenheit.
2. From Fahrenheit to Celsius.
:1
Please enter the Celsius temperature: 37.00
Temperature in Fahrenheit: 98.60

Especificación del lenguaje C#


Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#:
25.2 Clases estáticas
Vea también
Referencia
class (Referencia de C#)
Constructores de instancias (Guía de programación de C#)
Conceptos
Guía de programación de C#
Diseño de clases estáticas
Clases (Guía de programación de C#)
Guía de programación de C#

Cómo: Saber las diferencias entre pasar a un método una


estructura y una referencia a clase (Guía de programación de
C#)
Este ejemplo muestra que cuando una estructura se pasa a un método, lo que se pasa realmente es una copia de la estructura;
sin embargo, cuando se pasa una instancia de una clase, lo que se pasa es una referencia.
El resultado del siguiente ejemplo muestra que, cuando se pasa la instancia de clase al método ClassTaker, sólo cambia el
valor del campo de la clase. Sin embargo, el campo de una estructura no cambia al pasar su instancia al método StructTaker.
Esto es debido a que lo que se pasa al método StructTaker es una copia de la estructura mientras que lo que se pasa al
método ClassTaker es una referencia a la clase.
Ejemplo
C#
class TheClass
{
public string willIChange;
}

struct TheStruct
{
public string willIChange;
}

class TestClassAndStruct
{
static void ClassTaker(TheClass c)
{
c.willIChange = "Changed";
}

static void StructTaker(TheStruct s)


{
s.willIChange = "Changed";
}

static void Main()


{
TheClass testClass = new TheClass();
TheStruct testStruct = new TheStruct();
testClass.willIChange = "Not Changed";
testStruct.willIChange = "Not Changed";

ClassTaker(testClass);
StructTaker(testStruct);

System.Console.WriteLine("Class field = {0}", testClass.willIChange);


System.Console.WriteLine("Struct field = {0}", testStruct.willIChange);
}
}

Resultados
Class field = Changed
Struct field = Not Changed

Vea también
Referencia
Pasar parámetros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Clases (Guía de programación de C#)
Estructuras (Guía de programación de C#)
Guía de programación de C#

Propiedades (Guía de programación de C#)


Las propiedades son miembros que ofrecen un mecanismo flexible para leer, escribir o calcular los valores de campos
privados. Se pueden utilizar las propiedades como si fuesen miembros de datos públicos, aunque en realidad son métodos
especiales denominados descriptores de acceso. De este modo, se puede tener acceso a los datos con facilidad, a la vez que
proporciona la seguridad y flexibilidad de los métodos.
En este ejemplo, la clase TimePeriod almacena un período de tiempo. Internamente, la clase almacena el tiempo en segundos,
pero se proporciona una propiedad denominada Hours que permite que un cliente especifique el tiempo en horas. Los
descriptores de acceso de la propiedad Hours realizan la conversión entre horas y segundos.
Ejemplo
C#
class TimePeriod
{
private double seconds;
public double Hours
{
get { return seconds / 3600; }
set { seconds = value * 3600; }
}
}

class Program
{
static void Main()
{
TimePeriod t = new TimePeriod();

// Assigning the Hours property causes the 'set' accessor to be called.


t.Hours = 24;

// Evaluating the Hours property causes the 'get' accessor to be called.


System.Console.WriteLine("Time in hours: " + t.Hours);
}
}

Resultados
Time in hours: 24

Información general sobre propiedades


Las propiedades permiten que una clase exponga una manera pública de obtener y establecer valores, ocultando el
código de implementación o comprobación.
El descriptor de acceso de una propiedad get se utiliza para devolver el valor de la propiedad y el descriptor de acceso set
se utiliza para asignar un nuevo valor. Estos descriptores de acceso pueden tener niveles de acceso diferentes. Para
obtener más información, vea Accesibilidad del descriptor de acceso.
La palabra clave value se utiliza para definir el valor asignado por el indizador set.
Las propiedades que no implementan un método set son de sólo lectura.
Secciones relacionadas
Utilizar propiedades (Guía de programación de C#)
Propiedades de interfaces (Guía de programación de C#)
Comparación entre propiedades e indizadores (Guía de programación de C#)
Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#)
Ejemplo de propiedades
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.2 Propiedades
10.2.7.1 Nombres de miembros reservados para propiedades
10,6 Propiedades
Vea también
Referencia
Utilizar propiedades (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Diseño de propiedades
Guía de programación de C#

Utilizar propiedades (Guía de programación de C#)


Las propiedades combinan aspectos de los campos y de los métodos. Para el usuario de un objeto, una propiedad es similar a
un campo, el acceso a la propiedad requiere exactamente la misma sintaxis. Para el implementador de una clase, una
propiedad es uno o dos bloques de código que representan un descriptor de acceso get y un descriptor de acceso set. El
bloque de código para el descriptor de acceso get se ejecuta cuando se lee la propiedad; el bloque de código para el descriptor
de acceso set se ejecuta cuando se asigna un nuevo valor a la propiedad. Una propiedad sin un descriptor de acceso set se
considera de sólo lectura. Una propiedad sin un descriptor de acceso get se considera de sólo escritura. Una propiedad con
ambos descriptores de acceso es de lectura y escritura.
A diferencia de los campos, las propiedades no están clasificadas como variables. Por lo tanto, no se puede pasar una
propiedad como un parámetro ref (Referencia de C#) u out (Referencia de C#).
Las propiedades tienen muchos usos: validan datos antes de permitir un cambio; exponen datos de forma transparente en una
clase donde se recuperan realmente los datos de otro origen, como una base de datos; realizan una acción cuando se
modifican datos, por ejemplo, provocar un evento, o cambian el valor de otros campos.
Las propiedades se declaran dentro del bloque de clase especificando el nivel de acceso del campo, seguido por el tipo de la
propiedad, seguido por el nombre de la propiedad y, a continuación, un bloque de código que declara el descriptor de acceso
get y/o el descriptor de acceso set. Por ejemplo:
C#
public class Date
{
private int month = 7; //"backing store"

public int Month


{
get
{
return month;
}
set
{
if ((value > 0) && (value < 13))
{
month = value;
}
}
}
}

En este ejemplo, Month se declara como una propiedad para que el descriptor de acceso set pueda asegurarse de que el valor
Month se establece entre 1 y 12. La propiedad Month utiliza un campo privado para realizar el seguimiento del valor real. La
ubicación real de los datos de una propiedad suele conocerse como "almacén de respaldo" de la propiedad. Es normal que las
propiedades utilicen campos privados como almacén de respaldo. El campo se marca como privado para asegurarse de que
sólo puede cambiarse llamando a la propiedad. Para obtener más información sobre restricciones de acceso público y privado,
vea Modificadores de acceso (Guía de programación de C#).
El descriptor de acceso get
El cuerpo del descriptor de acceso get es similar al de un método. Debe devolver el valor del tipo de la propiedad. La ejecución
del descriptor de acceso get equivale a leer el valor del campo. Por ejemplo, cuando se devuelve la variable privada del
descriptor de acceso get y las optimizaciones están habilitadas, el compilador pone la llamada al método del descriptor de
acceso get entre líneas para que no se produzca una sobrecarga de método-llamada. Sin embargo, un método de descriptor
de acceso get virtual no se puede poner entre líneas, porque el compilador no sabe en tiempo de compilación qué método
puede llamarse en tiempo de ejecución. A continuación, se muestra un descriptor de acceso get que devuelve el valor de un
campo privado name:
C#
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
}
}

Cuando se haga referencia a la propiedad, se llamará al descriptor de acceso get para leer el valor de la misma, salvo en el
caso de que la referencia se haga como el destino de una asignación. Por ejemplo:
C#
Person p1 = new Person();
//...
System.Console.Write(p1.Name); // the get accessor is invoked here

El descriptor de acceso get debe terminar en una instrucción return o throw, y el control no puede salir del cuerpo del
descriptor de acceso.
Cambiar el estado de un objeto mediante el descriptor de acceso get es una técnica de programación poco recomendable. Por
ejemplo, el siguiente descriptor de acceso cambia, como efecto secundario, el estado del objeto cada vez que se tenga acceso al
campo number.
C#
private int number;
public int Number
{
get
{
return number++; // Don't do this
}
}

Se puede utilizar el descriptor de acceso get para devolver el valor de un campo o para calcularlo y devolverlo. Por ejemplo:
C#
class Employee
{
private string name;
public string Name
{
get
{
return name != null ? name : "NA";
}
}
}

El segmento de código anterior devolverá el valor NA si no se asigna un valor a la propiedad Name.


El descriptor de acceso set
El descriptor de acceso set es similar a un método cuyo tipo de valor devuelto es void. Utiliza un parámetro implícito
denominado value, que tiene el mismo tipo que la propiedad. En el siguiente ejemplo se agrega un descriptor de acceso set a
la propiedad Name:
C#
class Person
{
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
set
{
name = value;
}
}
}

Cuando se asigne un valor a la propiedad, se llamará al descriptor de acceso set con un argumento que proporciona el nuevo
valor. Por ejemplo:
C#
Person p1 = new Person();
p1.Name = "Joe"; // the set accessor is invoked here

System.Console.Write(p1.Name); // the get accessor is invoked here

No es correcto utilizar el nombre de parámetro implícito, value, para una declaración de variable local en un descriptor de
acceso set.
Comentarios
Las propiedades pueden marcarse como public, private, protected, internal o protected internal. Estos modificadores de
acceso definen cómo pueden tener acceso a las propiedades los usuarios de la clase. Los descriptores de acceso get y set para
la misma propiedad pueden tener modificadores de acceso diferentes. Por ejemplo, el descriptor de acceso get puede ser
public para permitir el acceso de sólo lectura desde fuera del tipo, y el descriptor de acceso set puede ser private o
protected. Para obtener más información, vea Modificadores de acceso (Guía de programación de C#).
Una propiedad puede declararse como propiedad estática mediante la palabra clave static. Esto hace que la propiedad esté
siempre disponible para los llamadores, aunque no exista ninguna instancia de la clase. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).
Una propiedad puede marcarse como propiedad virtual mediante la palabra clave virtual. Esto permite que las clases derivadas
reemplacen el comportamiento de la propiedad mediante la palabra clave override. Para obtener más información sobre estas
opciones, vea Herencia (Guía de programación de C#).
Una propiedad que reemplaza una propiedad virtual también puede ser de tipo sealed, lo cual especifica que ya no es virtual
para las clases derivadas. Por último, una propiedad puede declararse como abstract, lo que significa que no hay ninguna
implementación en la clase y las clases derivadas deben escribir su propia implementación. Para obtener más información
sobre estas opciones, vea Clases y miembros de clase abstractos y sellados (Guía de programación de C#).
Nota
No es correcto utilizar un modificador virtual (Referencia de C#), abstract (Referencia de C#) o override (Referencia de C#) en
un descriptor de acceso de una propiedad static.

Ejemplo 1
En este ejemplo se muestra el uso de propiedades de instancia, estáticas y de sólo lectura. Lee el nombre del empleado escrito
mediante el teclado, incrementa el número de empleados NumberOfEmployees en una unidad y muestra el nombre del
empleado y su número correspondiente.
C#
public class Employee
{
public static int NumberOfEmployees;
private static int counter;
private string name;

// A read-write instance property:


public string Name
{
get { return name; }
set { name = value; }
}
// A read-only static property:
public static int Counter
{
get { return counter; }
}

// A Constructor:
public Employee()
{
// Calculate the employee's number:
counter = ++counter + NumberOfEmployees;
}
}

class TestEmployee
{
static void Main()
{
Employee.NumberOfEmployees = 100;
Employee e1 = new Employee();
e1.Name = "Claude Vige";

System.Console.WriteLine("Employee number: {0}", Employee.Counter);


System.Console.WriteLine("Employee name: {0}", e1.Name);
}
}

Resultado 1
Employee number: 101
Employee name: Claude Vige

Ejemplo 2
En este ejemplo se muestra el método para tener acceso a una propiedad de una clase base que está oculta por otra propiedad
con el mismo nombre de una clase derivada.
C#
public class Employee
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}

public class Manager : Employee


{
private string name;

// Notice the use of the new modifier:


public new string Name
{
get { return name; }
set { name = value + ", Manager"; }
}
}

class TestHiding
{
static void Main()
{
Manager m1 = new Manager();

// Derived class property.


m1.Name = "John";

// Base class property.


((Employee)m1).Name = "Mary";

System.Console.WriteLine("Name in the derived class is: {0}", m1.Name);


System.Console.WriteLine("Name in the base class is: {0}", ((Employee)m1).Name);
}
}

Resultado 2
Name in the derived class is: John, Manager
Name in the base class is: Mary

Detalles del código


Es importante tener en cuenta los siguientes detalles del ejemplo anterior:
La propiedad Name de la clase derivada oculta la propiedad Name de la clase base. En este caso, se utiliza el modificador
new en la declaración de la propiedad de la clase derivada:
C#
public new string Name

Se utiliza la conversión (Employee) para tener acceso a la propiedad oculta de la clase base:
C#
((Employee)m1).Name = "Mary";

Para obtener más información sobre miembros ocultos, vea new (Modificador, Referencia de C#).
Ejemplo 3
En este ejemplo se utilizan dos clases, Cube y Square para implementar una clase abstracta, Shape, y reemplazar su propiedad
abstracta Area. Conviene resaltar que se utiliza el modificador override en las propiedades. El programa lee el valor del lado
como entrada y calcula las superficies del cuadrado y el cubo. También lee el valor de la superficie como entrada y calcula el
lado correspondiente del cuadrado y el cubo.
C#
abstract class Shape
{
public abstract double Area
{
get;
set;
}
}

class Square : Shape


{
public double side;

public Square(double s) //constructor


{
side = s;
}

public override double Area


{
get
{
return side * side;
}
set
{
side = System.Math.Sqrt(value);
}
}
}

class Cube : Shape


{
public double side;

public Cube(double s)
{
side = s;
}

public override double Area


{
get
{
return 6 * side * side;
}
set
{
side = System.Math.Sqrt(value / 6);
}
}
}

class TestShapes
{
static void Main()
{
// Input the side:
System.Console.Write("Enter the side: ");
double side = double.Parse(System.Console.ReadLine());

// Compute the areas:


Square s = new Square(side);
Cube c = new Cube(side);

// Display the results:


System.Console.WriteLine("Area of the square = {0:F2}", s.Area);
System.Console.WriteLine("Area of the cube = {0:F2}", c.Area);
System.Console.WriteLine();

// Input the area:


System.Console.Write("Enter the area: ");
double area = double.Parse(System.Console.ReadLine());
// Compute the sides:
s.Area = area;
c.Area = area;
// Display the results:
System.Console.WriteLine("Side of the square = {0:F2}", s.side);
System.Console.WriteLine("Side of the cube = {0:F2}", c.side);
}
}

Entrada
4
24

Resultado 3
Enter the side: 4
Area of the square = 16.00
Area of the cube = 96.00
Enter the area: 24
Side of the square = 4.90
Side of the cube = 2.00

Vea también
Tareas
Ejemplo de propiedades
Referencia
Propiedades (Guía de programación de C#)
Propiedades de interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Propiedades de interfaces (Guía de programación de C#)


Las propiedades se pueden declarar en una interface (Referencia de C#). A continuación se muestra un ejemplo de descriptor
de acceso de un indizador de interfaz:
C#
public interface ISampleInterface
{
// Property declaration:
string Name
{
get;
set;
}
}

Un identificador de acceso de una propiedad de interfaz no tiene cuerpo. Así, el propósito de los descriptores de acceso es
indicar si la propiedad es de lectura y escritura, de sólo lectura o de sólo escritura.
Ejemplo
En este ejemplo, la interfaz IEmployee tiene una propiedad de lectura y escritura, Name, y una propiedad de sólo lectura,
Counter. La clase Employee implementa la interfaz IEmployee y utiliza las dos propiedades. El programa lee el nombre de un
empleado nuevo y el número actual de empleados, y muestra como resultado el nombre del empleado y el nuevo número de
empleados calculado.
Se podría utilizar el nombre completo de la propiedad, que hace referencia a la interfaz en la que se declara el miembro. Por
ejemplo:
C#
string IEmployee.Name
{
get { return "Employee Name"; }
set { }
}

Esto se denomina Implementación explícita de interfaz (Guía de programación de C#). Por ejemplo, si la clase Employee
implementa dos interfaces ICitizen y IEmployee, y ambas tienen la propiedad Name, será necesario implementar
explícitamente el miembro de interfaz. Es decir, la siguiente declaración de propiedad:
C#
string IEmployee.Name
{
get { return "Employee Name"; }
set { }
}

implementa la propiedad Name en la interfaz IEmployee, mientras que la declaración:


C#
string ICitizen.Name
{
get { return "Citizen Name"; }
set { }
}

implementa la propiedad Name en la interfaz ICitizen.


C#
interface IEmployee
{
string Name
{
get;
set;
}
int Counter
{
get;
}
}

public class Employee : IEmployee


{
public static int numberOfEmployees;

private string name;


public string Name // read-write instance property
{
get
{
return name;
}
set
{
name = value;
}
}

private int counter;


public int Counter // read-only instance property
{
get
{
return counter;
}
}

public Employee() // constructor


{
counter = ++counter + numberOfEmployees;
}
}

class TestEmployee
{
static void Main()
{
System.Console.Write("Enter number of employees: ");
Employee.numberOfEmployees = int.Parse(System.Console.ReadLine());

Employee e1 = new Employee();


System.Console.Write("Enter the name of the new employee: ");
e1.Name = System.Console.ReadLine();

System.Console.WriteLine("The employee information:");


System.Console.WriteLine("Employee number: {0}", e1.Counter);
System.Console.WriteLine("Employee name: {0}", e1.Name);
}
}

Entrada
210
Hazem Abolrous

Resultados del ejemplo


Enter number of employees: 210
Enter the name of the new employee: Hazem Abolrous
The employee information:
Employee number: 211
Employee name: Hazem Abolrous

Vea también
Referencia
Propiedades (Guía de programación de C#)
Utilizar propiedades (Guía de programación de C#)
Comparación entre propiedades e indizadores (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Accesibilidad del descriptor de acceso asimétrico (Guía de


programación de C#)
Las partes get y set de una propiedad o indizador se denominan descriptores de acceso. De forma predeterminada estos
descriptores de acceso tienen la misma visibilidad o nivel de acceso: el de la propiedad o indizador al que pertenecen. Para
obtener más información, vea Niveles de accesibilidad. Sin embargo, es a veces útil para restringir el acceso a uno de estos
descriptores de acceso. Normalmente, esto implica restringir la accesibilidad del descriptor de acceso set, al mismo tiempo que
el descriptor de acceso get se mantiene públicamente accesible. Por ejemplo:
C#
public string Name
{
get
{
return name;
}
protected set
{
name = value;
}
}

En este ejemplo, una propiedad denominada Name define un descriptor de acceso get y set. El descriptor de acceso get recibe
el nivel de accesibilidad de la misma propiedad, public en este caso, al mismo tiempo que el descriptor de acceso set se
restringe explícitamente aplicando el modificador de acceso protected al propio descriptor de acceso.
Restricciones en los modificadores y descriptores de acceso
El uso de modificadores de descriptores de acceso en propiedades o indizadores está sujeto a estas condiciones:
No se pueden utilizar modificadores de descriptores de acceso en una interfaz o en una implementación explícita de
miembro de interface.
Sólo se pueden utilizar los modificadores de descriptores de acceso si la propiedad o el indizador tiene descriptores de
acceso set y get. En este caso, sólo se permite el modificador en sólo uno de los dos descriptores de acceso.
Si la propiedad o el indizador tiene un modificador override, el modificador del descriptor de acceso debe coincidir con el
descriptor de acceso del descriptor de acceso de reemplazo, si corresponde.
El nivel de accesibilidad en el descriptor de acceso debe ser más restrictivo que el nivel de accesibilidad en la propiedad o
el indizador.
Modificadores de acceso en descriptores de acceso de reemplazo
Cuando se reemplaza una propiedad o un indizador, los descriptores de acceso reemplazados deben ser accesibles al código
de reemplazo. Además, el nivel de accesibilidad de la propiedad y del indizador, y de los descriptores de acceso debe coincidir
con la propiedad y el indizador reemplazado y los descriptores de acceso correspondientes. Por ejemplo:
C#
public class Parent
{
public virtual int TestProperty
{
// Notice the accessor accessibility level.
protected set { }
// No access modifier is used here.
get { return 0; }
}
}
public class Kid : Parent
{
public override int TestProperty
{
// Use the same accessibility level as in the overridden accessor.
protected set { }
// Cannot use access modifier here.
get { return 0; }
}
}

Implementar interfaces
Cuando utiliza un descriptor de acceso para implementar una interfaz, el descriptor de acceso no puede tener un modificador
de acceso. Sin embargo, si implementa la interfaz mediante un descriptor de acceso, como get, el otro descriptor de acceso
puede tener un modificador de acceso, como se muestra en el siguiente ejemplo:
C#
public interface ISomeInterface
{
int TestProperty
{
// No access modifier allowed here
// because this is an interface.
get;
}
}

public class TestClass : ISomeInterface


{
public int TestProperty
{
// Cannot use access modifier here because
// this is an interface implementation.
get { return 10; }

// Interface property does not have set accessor,


// so access modifier is allowed.
protected set { }
}
}

Dominio de accesibilidad del descriptor de acceso


Si utiliza un modificador de acceso en el descriptor de acceso, este modificador determina el dominio de accesibilidad del
descriptor de acceso.
Si no se ha utilizado un modificador de acceso en el descriptor de acceso, el dominio de accesibilidad del descriptor de acceso
se determina mediante el nivel de accesibilidad de la propiedad o del indizador.
Ejemplo
El siguiente ejemplo contiene tres clases, BaseClass, DerivedClass y MainClass. Hay dos propiedades en BaseClass, Name e Id
en ambas clases. El ejemplo muestra cómo la propiedad Id en DerivedClass se puede ocultar a través de la propiedad Id en
BaseClass cuando se utiliza un modificador de acceso restrictivo como protected o private. Por consiguiente, cuando asigna
valores a esta propiedad, se llama a la propiedad en la clase BaseClass en su lugar. Reemplazar el modificador de acceso a
través de public hará que la propiedad sea accesible.
El ejemplo también muestra que un modificador de acceso restrictivo como private o protected, en el descriptor de acceso
set de la propiedad Name en DerivedClass impide el acceso al descriptor de acceso y genera un error cuando lo asigna.
C#
public class BaseClass
{
private string name = "Name-BaseClass";
private string id = "ID-BaseClass";
public string Name
{
get { return name; }
set { }
}

public string Id
{
get { return id; }
set { }
}
}

public class DerivedClass : BaseClass


{
private string name = "Name-DerivedClass";
private string id = "ID-DerivedClass";

new public string Name


{
get
{
return name;
}
// Using "protected" would make the set accessor not accessible.
set
{
name = value;
}
}

// Using private on the following property hides it in the Main Class.


// Any assignment to the property will use Id in BaseClass.
new private string Id
{
get
{
return id;
}
set
{
id = value;
}
}
}

class MainClass
{
static void Main()
{
BaseClass b1 = new BaseClass();
DerivedClass d1 = new DerivedClass();
b1.Name = "Mary";
d1.Name = "John";

b1.Id = "Mary123";
d1.Id = "John123"; // The BaseClass.Id property is called.

System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);


System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);
}
}

Resultado
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: John, ID-BaseClass

Comentarios
Observe que si reemplaza la declaración new private string Id por new public string Id, obtiene el resultado:
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: John, John123

Vea también
Referencia
Propiedades (Guía de programación de C#)
Indizadores (Guía de programación de C#)
Modificadores de acceso (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Declarar y utilizar propiedades de lectura y escritura


(Guía de programación de C#)
Las propiedades proporcionan la comodidad de utilizar miembros de datos públicos sin los riesgos que implica el acceso no
protegido y sin control ni comprobación a los datos de un objeto. Esto se logra a través de los descriptores de acceso: métodos
especiales que asignan y recuperan los valores del miembro de datos subyacente. El descriptor de acceso set permite asignar
los miembros de datos y el descriptor de acceso get recupera los valores de los miembros de datos.
Este ejemplo muestra una clase Person con dos propiedades: Name (cadena) y Age (entero). Ambas propiedades proporcionan
descriptores de acceso get y set, por lo que se consideran propiedades de lectura y escritura.
Ejemplo
C#
class Person
{
private string m_name = "N/A";
private int m_Age = 0;

// Declare a Name property of type string:


public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}

// Declare an Age property of type int:


public int Age
{
get
{
return m_Age;
}

set
{
m_Age = value;
}
}
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
}

class TestPerson
{
static void Main()
{
// Create a new Person object:
Person person = new Person();

// Print out the name and the age associated with the person:
System.Console.WriteLine("Person details - {0}", person);
// Set some values on the person object:
person.Name = "Joe";
person.Age = 99;
System.Console.WriteLine("Person details - {0}", person);

// Increment the Age property:


person.Age += 1;
System.Console.WriteLine("Person details - {0}", person);
}
}

Resultados
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100

Programación eficaz
En el ejemplo anterior, las propiedades Name y Age son public e incluyen un descriptor de acceso get y set. Esto permite que
cualquier objeto lea y escriba estas propiedades. Sin embargo, a veces es conveniente excluir uno de los descriptores de
acceso. Por ejemplo, al omitir el descriptor de acceso set, la propiedad pasa a ser de sólo lectura:
C#
public string Name
{
get
{
return m_name;
}
}

Opcionalmente, se puede exponer públicamente un descriptor de acceso pero definir el otro como private o protected. Para
obtener más información, vea Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#).
Una vez declaradas las propiedades, se pueden utilizar como si fueran campos de la clase. Esto permite una sintaxis muy
natural, tanto para obtener como para establecer el valor de una propiedad, como se muestra en las siguientes instrucciones:
C#
person.Name = "Joe";
person.Age = 99;

Observe que, en un método set de una propiedad, se dispone de una variable especial value. Esta variable contiene el valor
especificado por el usuario, por ejemplo:
C#
m_name = value;

Observe la sintaxis tan simple que se utiliza para incrementar la propiedad Age de un objeto Person:
C#
person.Age += 1;

Si se utilizaron métodos set y get independientes para modelar las propiedades, el código equivalente tendría el siguiente
aspecto:

person.SetAge(person.GetAge() + 1);

En el siguiente ejemplo, el método ToString se reemplaza:


C#
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}

Observe que ToString no se utiliza explícitamente en el programa. Se invoca de forma predeterminada mediante las llamadas
WriteLine.
Vea también
Referencia
Propiedades (Guía de programación de C#)
Objetos, clases y estructuras (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Indizadores (Guía de programación de C#)


Los indizadores permiten indizar instancias de una clase o una estructura de la misma manera que las matrices. Son similares
a las propiedades, con la diferencia de que los descriptores de acceso utilizan parámetros.
En el ejemplo siguiente, se define una clase genérica y se proporcionan sencillos métodos get y set de acceso como medio de
asignar y recuperar valores. La clase Program crea una instancia de esta clase para almacenar las cadenas.
C#
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}

// This class shows how client code uses the indexer


class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
System.Console.WriteLine(stringCollection[0]);
}
}

Información general de los indizadores


Los indizadores permiten indizar los objetos de una manera similar a las matrices.
Un descriptor de acceso get devuelve un valor. Un descriptor de acceso set asigna un valor.
La palabra clave this se utiliza para definir indizadores.
La palabra clave value se utiliza para definir el valor asignado por el indizador set.
Los indizadores no tienen que ser indizados por un valor entero; depende de usted que defina el mecanismo de
búsqueda concreto.
Se pueden sobrecargar los indizadores.
Los indizadores pueden tener más de un parámetro formal, por ejemplo, al tener acceso a una matriz bidimensional.
Secciones relacionadas
Utilizar indizadores (Guía de programación de C#)
Indizadores en interfaces (Guía de programación de C#)
Comparación entre propiedades e indizadores (Guía de programación de C#)
Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#)
Ejemplo de indizadores
Ejemplo de propiedades indizadas
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.3 Indizadores
10.2.7.3 Nombres de miembros reservados para indizadores
10.8 Indizadores
13.2.4 Indizadores de interfaz
Vea también
Referencia
Propiedades (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Utilizar indizadores (Guía de programación de C#)


Los indizadores permiten indizar una clase, estructura o interfaz de la misma manera que una matriz. Para obtener más
información sobre cómo utilizar los indizadores con una interfaz, vea Indizadores en interfaces (Guía de programación de C#).
Para declarar un indizador en una clase o estructura, utilice la palabra clave this, como en este ejemplo:

public int this[int index] // Indexer declaration


{
// get and set accessors
}

Comentarios
El tipo de un indizador y el tipo de sus parámetros deben ser por lo menos tan accesibles como el propio indizador. Para más
información acerca de los niveles de accesibilidad, vea Modificadores de acceso.
La firma de un indizador está formada por el número de parámetros formales y sus tipos. No incluye el tipo de indizador ni los
nombres de los parámetros formales. Si se declara más de un indizador en una misma clase, cada indizador deberá tener una
firma diferente.
Los valores de un indizador no se clasifican como variables; por ello, no es posible transferir un valor de indizador como un
parámetro ref u out.
Para proporcionar un nombre al indizador que otros lenguajes puedan utilizar, use un atributo name en la declaración. Por
ejemplo:

[System.Runtime.CompilerServices.IndexerName("TheItem")]
public int this [int index] // Indexer declaration
{
}

Este indizador tendrá el nombre TheItem. Si no se proporciona el atributo con nombre, se le dará como nombre
predeterminado Item.
Ejemplo 1
En el ejemplo siguiente se muestra cómo declarar un campo de matriz privado, arr, y un indizador. El uso del indizador
permite el acceso directo a la instancia test[i]. La alternativa a utilizar el indizador es declarar la matriz como miembro de
tipo public y tener acceso directamente a sus miembros, arr[i].
C#
class IndexerClass
{
private int[] arr = new int[100];
public int this[int index] // Indexer declaration
{
get
{
// Check the index limits.
if (index < 0 || index >= 100)
{
return 0;
}
else
{
return arr[index];
}
}
set
{
if (!(index < 0 || index >= 100))
{
arr[index] = value;
}
}
}
}
class MainClass
{
static void Main()
{
IndexerClass test = new IndexerClass();
// Call the indexer to initialize the elements #3 and #5.
test[3] = 256;
test[5] = 1024;
for (int i = 0; i <= 10; i++)
{
System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
}
}
}

Resultados
Element #0 = 0
Element #1 = 0
Element #2 = 0
Element #3 = 256
Element #4 = 0
Element #5 = 1024
Element #6 = 0
Element #7 = 0
Element #8 = 0
Element #9 = 0
Element #10 = 0

Conviene tener en cuenta que cuando se evalúa el acceso de un indizador, por ejemplo, en una instrucción Console.Write se
llama al descriptor de acceso get. Por ello, si no existe un descriptor de acceso get se producirá un error en tiempo de
compilación.
Indizar utilizando otros valores
C# no limita el tipo de índice al entero. Por ejemplo, puede ser útil utilizar una cadena con un indizador. Este tipo de indizador
podría implementarse buscando la cadena dentro de la colección y devolviendo el valor adecuado. Como se pueden
sobrecargar los descriptores de acceso, es posible la coexistencia de cadenas y enteros.
Ejemplo 2
En este ejemplo, se declara una clase que almacena los días de la semana. Se declara un descriptor de acceso get que toma
una cadena, el nombre de un día, y devuelve el entero correspondiente. Por ejemplo, Sunday devolverá 0, Monday devolverá 1,
y así sucesivamente.
C#
// Using a string as an indexer value
class DayCollection
{
string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };

// This method finds the day or returns -1


private int GetDay(string testDay)
{
int i = 0;
foreach (string day in days)
{
if (day == testDay)
{
return i;
}
i++;
}
return -1;
}

// The get accessor returns an integer for a given string


public int this[string day]
{
get
{
return (GetDay(day));
}
}
}
class Program
{
static void Main(string[] args)
{
DayCollection week = new DayCollection();
System.Console.WriteLine(week["Fri"]);
System.Console.WriteLine(week["Made-up Day"]);
}
}

Resultados
5
-1

Programación eficaz
Fundamentalmente, hay dos maneras de mejorar la seguridad y confiabilidad de los indizadores:
Asegúrese siempre de que su código realiza comprobaciones de intervalo y tipo cuando establece y recupera los valores
de cualquier búfer o matriz a la que tienen acceso los indizadores.
Establezca la accesibilidad de los descriptores de acceso get y set para que sea lo más restrictiva posible. Es importante
particularmente para el descriptor de acceso set. Para obtener más información, vea
Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#).
Vea también
Tareas
Ejemplo de indizadores
Referencia
Indizadores (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Indizadores en interfaces (Guía de programación de C#)


Las propiedades se pueden declarar en una interface (Referencia de C#). Los descriptores de acceso de los indizadores de
interfaz se diferencian de los descriptores de acceso de los indizadores de clase en los siguientes aspectos:
Los descriptores de acceso de interfaz no utilizan modificadores.
Un identificador de acceso de interfaz no tiene cuerpo.
Así, el propósito del descriptor de acceso es indicar si el indizador es de lectura y escritura, de sólo lectura o de sólo escritura.
A continuación se muestra un ejemplo de descriptor de acceso de un indizador de interfaz:
C#
public interface ISomeInterface
{
//...

// Indexer declaration:
string this[int index]
{
get;
set;
}
}

La firma de un indizador debe ser diferente de las firmas de los demás indizadores declarados en la misma interfaz.
Ejemplo
En el ejemplo siguiente se muestra cómo se implementan indizadores de interfaz:
C#
// Indexer on an interface:
public interface ISomeInterface
{
// Indexer declaration:
int this[int index]
{
get;
set;
}
}

// Implementing the interface.


class IndexerClass : ISomeInterface
{
private int[] arr = new int[100];
public int this[int index] // indexer declaration
{
get
{
// Check the index limits.
if (index < 0 || index >= 100)
{
return 0;
}
else
{
return arr[index];
}
}
set
{
if (!(index < 0 || index >= 100))
{
arr[index] = value;
}
}
}
}

class MainClass
{
static void Main()
{
IndexerClass test = new IndexerClass();
// Call the indexer to initialize the elements #2 and #5.
test[2] = 4;
test[5] = 32;
for (int i = 0; i <= 10; i++)
{
System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
}
}
}

Resultados
Element #0 = 0
Element #1 = 0
Element #2 = 4
Element #3 = 0
Element #4 = 0
Element #5 = 32
Element #6 = 0
Element #7 = 0
Element #8 = 0
Element #9 = 0
Element #10 = 0

En el ejemplo anterior, se podría usar la implementación de miembro de interfaz explícito mediante el nombre completo del
miembro de interfaz. Por ejemplo:

public string ISomeInterface.this


{
}

Sin embargo, el nombre completo sólo es necesario para evitar la ambigüedad cuando la clase implementa más de una
interfaz con la misma firma de indizador. Por ejemplo, si una clase Employee implementa dos interfaces, ICitizen y IEmployee,
y ambas tienen la misma firma de indizador, será necesario implementar explícitamente el miembro de interfaz. Es decir, la
siguiente declaración de indizador:

public string IEmployee.this


{
}

implementa el indizador en la interfaz IEmployee, mientras que la declaración:

public string ICitizen.this


{
}
implementa el indizador en la interfaz ICitizen.
Vea también
Tareas
Ejemplo de indizadores
Referencia
Indizadores (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Comparación entre propiedades e indizadores (Guía de


programación de C#)
Los indizadores son similares a las propiedades. Con la excepción de las diferencias mostradas en la tabla siguiente, todas las
reglas definidas para los descriptores de acceso de propiedades son válidas para los descriptores de acceso de indizadores.
Propiedad Indizador
Permite llamar a los métodos como si fueran mi Permite llamar a los métodos en un objeto como si el objeto fuese una matri
embros de datos públicos. z.

Se obtiene acceso a través de un nombre sencill Se obtiene acceso a través de un índice.


o.

Puede ser un miembro estático o de instancia. Debe ser un miembro de instancia.

Los descriptores de acceso get de una propiedad Los descriptores de acceso get de un indizador tienen la misma lista de pará
no tienen parámetros. metros formales que el indizador.

Los descriptores de acceso set de una propiedad Los descriptores de acceso set de un indizador tienen la misma lista de pará
contienen el parámetro implícito value. metros formales que el indizador, además del parámetro value.
Vea también
Referencia
Indizadores (Guía de programación de C#)
Propiedades (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Delegados (Guía de programación de C#)


Un delegado es un tipo que hace referencia a un método. Cuando se asigna un método a un delegado, éste se comporta
exactamente como el método. El método delegado se puede utilizar como cualquier otro método, con parámetros y un valor
devuelto, como en este ejemplo:
C#
public delegate int PerformCalculation(int x, int y);

Cualquier método que coincide con la firma del delegado, que está compuesta por los parámetros y el tipo de valor devuelto,
puede asignarse al delegado. Esto permite el cambio mediante programación de las llamadas a métodos y la incorporación de
nuevo código en las clases existentes. Si conoce la firma del delegado, puede asignar su propio método delegado.
Esta capacidad para hacer referencia a un método como parámetro hace que los delegados sean idóneos para definir métodos
de devolución de llamada. Por ejemplo, un algoritmo de ordenación se podría pasar como referencia al método que compara
dos objetos. La separación del código de comparación permite programar el algoritmo de forma más general.
Información general sobre delegados
Los delegados tienen las propiedades siguientes:
Los delegados son similares a los punteros a función de C++, pero poseen seguridad de tipos.
Los delegados permiten pasar los métodos como parámetros.
Los delegados pueden utilizarse para definir métodos de devolución de llamada.
Los delegados pueden encadenarse; por ejemplo, se puede llamar a varios métodos en un solo evento.
No es necesario que los métodos coincidan exactamente con la firma de delegado. Para obtener más información, vea
Covarianza y contravarianza en los delegados (Guía de programación de C#).
La versión 2.0 de C# introduce el concepto de métodos anónimos, que permiten pasar bloques de código como
parámetros en lugar de utilizar métodos definidos independientemente.
En esta sección
Información general sobre delegados
Cuándo utilizar delegados en lugar de interfaces
Métodos con nombre
Métodos anónimos
Covarianza y contravarianza
Cómo: Combinar delegados
Cómo: Declarar un delegado, crear instancias del mismo y utilizarlo
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.11 Delegados
4.2.6 Tipos de delegado
7.5.5.2 Invocaciones de delegado
15 Delegados
Vea también
Referencia
Delegate
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Guía de programación de C#

Utilizar delegados (Guía de programación de C#)


Un delegado es un tipo de objeto que encapsula un método de forma segura, similar a un puntero a función de C y C++. A
diferencia de los punteros a función de C, los delegados están orientados a objetos, proporcionan seguridad de tipos y son
seguros. El tipo de un delegado se define por su nombre. El ejemplo siguiente declara un delegado denominado Del que puede
encapsular un método que toma un valor string como argumento y devuelve un valor void:
C#
public delegate void Del(string message);

Generalmente, un objeto de delegado se crea proporcionando el nombre del método que el delegado contendrá o con un
método anónimo. Una vez que se crean instancias de un delegado, el delegado pasará al método una llamada realizada por
éste al delegado. Los parámetros que el llamador pasó al delegado se pasan al método y el delegado devuelve al llamador el
valor devuelto del método, si hay alguno. Esto se conoce como invocar al delegado. Se puede invocar un delegado con
instancias como si fuera el propio método contenido. Por ejemplo:
C#
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}

C#
// Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.


handler("Hello World");

Los tipos de delegados se derivan de la clase Delegate en .NET Framework. Los tipos de delegados son sealed (no se pueden
derivar) y no es posible derivar clases personalizadas de Delegate. Puesto que el delegado con instancias es un objeto, puede
pasarse como parámetro o asignarse a una propiedad. Esto permite que un método acepte un delegado como parámetro y
llame al delegado posteriormente. Esto se conoce como devolución de llamada asincrónica y constituye un método común de
notificación de un llamador cuando ha finalizado un proceso largo. Cuando se utiliza un delegado de esta forma, no es
necesario que el código que utiliza el delegado conozca la implementación del método que se está utilizando. La funcionalidad
es similar a la encapsulación que proporcionan las interfaces. Para obtener más información, vea
Cuándo se utilizan delegados en lugar de interfaces (Guía de programación de C#).
Otro uso común de devoluciones de llamada es definir un método de comparación personalizado y pasar ese delegado a un
método de ordenación. Esto permite al código del llamador ser parte del algoritmo de ordenación. El método del ejemplo
siguiente utiliza el tipo Del como parámetro:
C#
public void MethodWithCallback(int param1, int param2, Del callback)
{
callback("The number is: " + (param1 + param2).ToString());
}

A continuación, se puede pasar el delegado creado anteriormente a ese método:


C#
MethodWithCallback(1, 2, handler);
y recibir el resultado siguiente en la consola:
The number is: 3

Al utilizar el delegado como abstracción, MethodWithCallback no es necesario llamar a la consola directamente; es decir, el
delegado no se tiene que diseñar pensando en una consola. Lo que MethodWithCallback hace es simplemente preparar una
cadena y pasarla a otro método. Esto es especialmente eficaz, puesto que un método delegado puede utilizar cualquier número
de parámetros.
Cuando se crea un delegado para contener un método de instancia, el delegado hace referencia tanto a la instancia como al
método. Un delegado no conoce el tipo de instancia a parte del método que éste contiene, de modo que un delegado puede
hacer referencia a cualquier tipo de objeto siempre que exista un método en dicho objeto que coincida con la firma del
delegado. Cuando se crea un delegado para contener un método estático, éste sólo hace referencia al método. Considere las
siguientes declaraciones:
C#
public class MethodClass
{
public void Method1(string message) { }
public void Method2(string message) { }
}

Junto con el método estático DelegateMethod que se mostró previamente, ahora tenemos tres métodos que la instancia de Del
puede contener.
Un delegado puede llamar a más de un método cuando se invoca. Esto se denomina multidifusión. Para agregar un método
adicional a la lista de métodos del delegado (lista de invocación), simplemente es necesario agregar dos delegados mediante
los operadores de suma o de asignación de suma ('+' o '+='). Por ejemplo:
C#
MethodClass obj = new MethodClass();
Del d1 = obj.Method1;
Del d2 = obj.Method2;
Del d3 = DelegateMethod;

//Both types of assignment are valid.


Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;

En este momento, allMethodsDelegate contiene tres métodos en su lista de invocación: Method1, Method2 y DelegateMethod.
Los tres delegados originales, d1, d2 y d3 no cambian. Cuando se invoca a allMethodsDelegate, se llama a los tres métodos por
orden. Si el delegado utiliza parámetros de referencia, ésta a su vez se pasa secuencialmente a cada uno de los tres métodos y
todos los cambios efectuados por un método son visibles para el siguiente método. Cuando alguno de los métodos produce
una excepción que no se detecta dentro del método, esa excepción se pasa al llamador del delegado y no se llama a ninguno
de los métodos siguientes de la lista de invocación. Si el delegado tiene un valor devuelto y/o fuera de los parámetros,
devuelve el valor devuelto y los parámetros del último método invocado. Para quitar un método de la lista de invocación,
utilice el operador de resta o de asignación de resta ('-' o '-='). Por ejemplo:
C#
//remove Method1
allMethodsDelegate -= d1;
// copy AllMethodsDelegate while removing d2
Del oneMethodDelegate = allMethodsDelegate - d2;

Puesto que los tipos de delegados se derivan de System.Delegate, los métodos y las propiedades definidos por esa clase se
pueden llamar en el delegado. Por ejemplo, para buscar el número de métodos en la lista de invocación de un delegado, puede
escribir:
C#
int invocationCount = d1.GetInvocationList().GetLength(0);
Los delegados con más de un método en su lista de invocación derivan de MulticastDelegate, que es una subclase de
System.Delegate. El código anterior funciona en ambos casos porque las dos clases admiten GetInvocationList.
Los delegados de multidifusión se utilizan ampliamente en el control de eventos. Los objetos de origen de eventos envían
notificaciones de eventos a objetos de destinatario registrados para recibir ese evento. Para registrar un evento, el destinatario
crea un método diseñado para controlar el evento, a continuación crea un delegado para dicho método y pasa al delegado al
origen de eventos. El origen llama al delegado cuando se produce el evento. Luego el delegado llama al método de control de
eventos del destinatario y entrega los datos del evento. El origen de eventos define el tipo de delegado para un evento dado.
Para obtener más información, vea Eventos (Guía de programación de C#).
La comparación de delegados de dos tipos distintos asignados en tiempo de compilación producirá un error de compilación. Si
las instancias de delegado son estáticamente del tipo System.Delegate, se permite la comparación, pero se devolverá false en
tiempo de ejecución. Por ejemplo:
C#
delegate void Delegate1();
delegate void Delegate2();
static void method(Delegate1 d, Delegate2 e, System.Delegate f)
{
// Compile-time error.
//Console.WriteLine(d == e);

// OK at compile-time. False if the run-time type of f


//is not the same as that of d.
System.Console.WriteLine(d == f);
}

Vea también
Referencia
Covarianza y contravarianza en los delegados (Guía de programación de C#)
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Eventos (Guía de programación de C#)
Guía de programación de C#

Métodos con nombre (Guía de programación de C#)


Se puede asociar un delegado a un método con nombre. Cuando se crean instancias de un delegado mediante un método con
nombre, el método se pasa como parámetro; por ejemplo:
C#
// Declare a delegate:
delegate void Del(int x);

// Define a named method:


void DoWork(int k) { /* ... */ }

// Instantiate the delegate using the method as a parameter:


Del d = obj.DoWork;

Esto se denomina utilizar un método con nombre. Los delegados creados con un método con nombre pueden encapsular un
método estático o con instancias. La utilización de métodos con nombre es el único modo de crear instancias de un delegado
en versiones anteriores de C#. Sin embargo, en una situación en que crear un método nuevo constituye una sobrecarga no
deseada, C# 2.0 permite crear instancias de un delegado y especificar inmediatamente un bloque de código que el delegado
procesará cuando se le llame. Estos métodos se denominan Métodos anónimos (Guía de programación de C#).
Comentarios
El método, que se pasa como parámetro de delegado, debe tener la misma firma que la declaración de delegado.
La instancia de un delegado puede encapsular un método estático o de instancia.
Aunque el delegado puede utilizar un parámetro out, no se recomienda su uso con delegados de evento de multidifusión
porque no hay forma de saber a qué delegado se va a llamar.
Ejemplo 1
El siguiente es un ejemplo sencillo de declaración y uso de un delegado. Observe que tanto el delegado, Del, como el método
asociado, MultiplyNumbers, tienen la misma firma
C#
// Declare a delegate
delegate void Del(int i, double j);
class MathClass
{
static void Main()
{
MathClass m = new MathClass();
// Delegate instantiation using "MultiplyNumbers"
Del d = m.MultiplyNumbers;

// Invoke the delegate object.


System.Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
for (int i = 1; i <= 5; i++)
{
d(i, 2);
}
}

// Declare the associated method.


void MultiplyNumbers(int m, double n)
{
System.Console.Write(m * n + " ");
}
}
Resultado
Invoking the delegate using 'MultiplyNumbers':
2 4 6 8 10

Ejemplo 2
En el siguiente ejemplo, un delegado se asigna a métodos estáticos y de instancia y devuelve información específica de cada
uno de ellos.
C#
// Declare a delegate
delegate void Del();
class SampleClass
{
public void InstanceMethod()
{
System.Console.WriteLine("A message from the instance method.");
}

static public void StaticMethod()


{
System.Console.WriteLine("A message from the static method.");
}
}

class TestSampleClass
{
static void Main()
{
SampleClass sc = new SampleClass();

// Map the delegate to the instance method:


Del d = sc.InstanceMethod;
d();
// Map to the static method:
d = SampleClass.StaticMethod;
d();
}
}

Resultado
A message from the instance method.
A message from the static method.

Vea también
Tareas
Cómo: Combinar delegados (delegados de multidifusión) (Guía de programación de C#)
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Eventos (Guía de programación de C#)
Guía de programación de C#

Métodos anónimos (Guía de programación de C#)


En versiones de C# anteriores a la versión 2.0, la única manera de declarar un delegado era utilizar métodos con nombre. C#
2.0 presenta los métodos anónimos.
La creación de métodos anónimos es básicamente una forma de pasar un bloque de código como parámetro de delegado. Por
ejemplo:
C#
// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };

O bien,
C#
// Create a delegate instance
delegate void Del(int x);

// Instantiate the delegate using an anonymous method


Del d = delegate(int k) { /* ... */ };

Mediante los métodos anónimos, se reduce la sobrecarga de codificación al crear instancias de delegados sin tener que crear
un método independiente.
Por ejemplo, especificar un bloque de código en vez de un delegado puede ser útil en el caso de que la creación de un método
parezca una sobrecarga innecesaria. Un buen ejemplo es cuando se inicia un nuevo subproceso. Esta clase crea un subproceso
y también contiene el código que el subproceso ejecuta, sin necesidad de crear un método adicional para el delegado.
C#
void StartThread()
{
System.Threading.Thread t1 = new System.Threading.Thread
(delegate()
{
System.Console.Write("Hello, ");
System.Console.WriteLine("World!");
});
t1.Start();
}

Comentarios
El ámbito de los parámetros de un método anónimo es anonymous-method-block.
Es un error utilizar una instrucción de salto, como goto, break o continue, en un bloque de método anónimo cuyo destino está
fuera del bloque. También es un error utilizar una instrucción de salto, como goto, break o continue, fuera de un bloque de
método anónimo cuyo destino está dentro del bloque.
Las variables locales y los parámetros cuyo ámbito contiene una declaración de método anónimo se denominan variables
externas o capturadas del método anónimo. Por ejemplo, en el segmento de código siguiente, n es una variable externa:
C#
int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

A diferencia de las variables locales, el período de duración de la variable externa se extiende hasta que los delegados que
hacen referencia a los métodos anónimos cumplan con los requisitos para la recolección de elementos no utilizados. En el
momento en que se crea el delegado, se captura el valor de n.
Un método anónimo no puede tener acceso a los parámetros ref u out de un ámbito externo.
No se puede tener acceso a ningún código no seguro dentro de anonymous-method-block.
Ejemplo
El ejemplo siguiente muestra las dos maneras de crear instancias de un delegado:
Asociar el delegado a un método anónimo.
Asociar el delegado a un método con nombre (DoWork).
En cada uno de los casos, se muestra un mensaje cuando se invoca al delegado.
C#
// Declare a delegate
delegate void Printer(string s);

class TestClass
{
static void Main()
{
// Instatiate the delegate type using an anonymous method:
Printer p = delegate(string j)
{
System.Console.WriteLine(j);
};

// Results from the anonymous delegate call:


p("The delegate using the anonymous method is called.");
// The delegate instantiation using a named method "DoWork":
p = new Printer(TestClass.DoWork);

// Results from the old style delegate call:


p("The delegate using the named method is called.");
}
// The method associated with the named delegate:
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
}

Resultado
The delegate using the anonymous method is called.
The delegate using the named method is called.

Vea también
Referencia
Métodos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Código no seguro y punteros (Guía de programación de C#)
Métodos con nombre (Guía de programación de C#)
Otros recursos
Referencia de C#
Guía de programación de C#

Cuándo se utilizan delegados en lugar de interfaces (Guía de


programación de C#)
Tanto los delegados como las interfaces permiten a un Diseñador de clases separar las declaraciones y la implementación de
tipos. Cualquier clase o estructura puede heredar e implementar una interfaz determinada. También es posible crear un
delegado para un método en cualquier clase, siempre y cuando el método se ajuste a la firma del método para el delegado.
Cualquier objeto puede utilizar una referencia de interfaz o un delegado sin tener conocimiento alguno sobre la clase que
implementa el método de interfaz o delegado. Según estas similitudes: ¿cuándo debería utilizar un diseñador de clase un
delegado? y ¿cuándo debería utilizar una interfaz?
Utilice un delegado cuando:
Se utilice un modelo de diseño de eventos.
Se prefiere a la hora de encapsular un método estático.
El autor de las llamadas no tiene ninguna necesidad de obtener acceso a otras propiedades, métodos o interfaces en el
objeto que implementa el método.
Se desea conseguir una composición sencilla.
Una clase puede necesitar más de una implementación del método.
Utilice una interfaz cuando:
Haya un grupo de métodos relacionados a los que se pueda llamar.
Una clase sólo necesita una implementación del método.
La clase que utiliza la interfaz deseará convertir esa interfaz en otra interfaz o tipos de clase.
El método que se va a implementar está vinculado al tipo o identidad de la clase; por ejemplo, métodos de comparación.
Un buen ejemplo del uso de una interfaz de método único en lugar de un delegado es IComparable o IComparable.
IComparable declara el método CompareTo, que devuelve un entero que especifica una relación menor que, igual que o
mayor que entre dos objetos del mismo tipo. IComparable se puede utilizar como base de un algoritmo de ordenación y,
aunque el uso de un método de comparación de delegados como base de un algoritmo de ordenación sería válido, no es la
opción ideal. Lo ideal es una interfaz de método único, ya que la capacidad de establecer comparaciones pertenece a la clase, y
el algoritmo de comparación no cambia en tiempo de ejecución.
Vea también
Referencia
Métodos (Guía de programación de C#)
Interfaces (Guía de programación de C#)
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Guía de programación de C#

Covarianza y contravarianza en los delegados (Guía de


programación de C#)
La covarianza y contravarianza proporcionan cierta flexibilidad al confrontar las firmas de métodos con tipos de delegado. La
covarianza permite que un método tenga un tipo de valor devuelto más derivado que lo que se define en el delegado. La
contravarianza permite un método con tipos de parámetro que se deriven menos que en el tipo de delegado.
Ejemplo 1 (covarianza)
Este ejemplo muestra cómo se pueden utilizar los delegados con métodos que tienen tipos de valor devueltos que se derivan
del tipo de valor devuelto en la firma de delegado. El tipo de datos devuelto por SecondHandler es de tipo Dogs, que se deriva
del tipo Mammals definido en el delegado.
C#
class Mammals
{
}

class Dogs : Mammals


{
}

class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();

public static Mammals FirstHandler()


{
return null;
}

public static Dogs SecondHandler()


{
return null;
}

static void Main()


{
HandlerMethod handler1 = FirstHandler;

// Covariance allows this delegate.


HandlerMethod handler2 = SecondHandler;
}
}

Ejemplo 2 (contravarianza)
Este ejemplo muestra cómo se pueden utilizar los delegados con métodos que tienen parámetros de un tipo que son tipos
base del tipo de parámetro de la firma de delegado. Con la contravarianza, puede utilizar ahora un controlador de eventos en
lugares donde anteriormente tenía que utilizar controladores distintos. Por ejemplo, ahora puede crear un controlador de
eventos que acepte un parámetro de entrada EventArgs y utilizarlo con el evento Button.MouseClick que envía un tipo
MouseEventArgs como parámetro, y también con el evento TextBox.KeyDown que envía un parámetro KeyEventArgs.
C#
System.DateTime lastActivity;
public Form1()
{
InitializeComponent();

lastActivity = new System.DateTime();


this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs
}

// Event hander for any event with an EventArgs or


// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
lastActivity = System.DateTime.Now;
}

Vea también
Referencia
Delegados genéricos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Delegados (Guía de programación de C#)
Guía de programación de C#

Cómo: Combinar delegados (delegados de multidifusión) (Guía


de programación de C#)
En este ejemplo se muestra cómo componer delegados de multidifusión. Una propiedad útil de los objetos delegate es que se
pueden asignar a una instancia del delegado la multidifusión con el operador +. Un delegado compuesto llama a los dos
delegados de los que se compone. Solo pueden ser compuestos los delegados del mismo tipo.
El operador - se puede utilizar para quitar un delegado componente de un delegado compuesto.
Ejemplo
C#
delegate void Del(string s);

class TestClass
{
static void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}

static void Goodbye(string s)


{
System.Console.WriteLine(" Goodbye, {0}!", s);
}

static void Main()


{
Del a, b, c, d;

// Create the delegate object a that references


// the method Hello:
a = Hello;

// Create the delegate object b that references


// the method Goodbye:
b = Goodbye;
// The two delegates, a and b, are composed to form c:
c = a + b;

// Remove a from the composed delegate, leaving d,


// which calls only the method Goodbye:
d = c - a;

System.Console.WriteLine("Invoking delegate a:");


a("A");
System.Console.WriteLine("Invoking delegate b:");
b("B");
System.Console.WriteLine("Invoking delegate c:");
c("C");
System.Console.WriteLine("Invoking delegate d:");
d("D");
}
}

Resultados
Invoking delegate a:
Hello, A!
Invoking delegate b:
Goodbye, B!
Invoking delegate c:
Hello, C!
Goodbye, C!
Invoking delegate d:
Goodbye, D!

Vea también
Referencia
MulticastDelegate
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Guía de programación de C#

Cómo: Declarar un delegado, crear instancias del mismo y


utilizarlo (Guía de programación de C#)
Los delegados se declaran como se muestra a continuación:
C#
public delegate void Del<T>(T item);
public void Notify(int i) { }

C#
Del<int> d1 = new Del<int>(Notify);

En C# 2.0, también es posible declarar un delegado utilizando esta sintaxis simplificada:


C#
Del<int> d2 = Notify;

El siguiente ejemplo ilustra la declaración, creación de instancias y uso de un delegado. La clase BookDB encapsula una base de
datos de los libros de una librería. Expone un método ProcessPaperbackBooks, el cual busca todos los libros en edición rústica
de la base de datos y llama a un delegado para cada uno. El tipo delegate que se utiliza se denomina ProcessBookDelegate.
La clase Test utiliza esta clase para imprimir los títulos y el precio medio de los libros en rústica.
El uso de delegados promueve una buena separación de la funcionalidad entre la base de datos de la librería y el código del
programa cliente. El código del cliente no tiene conocimiento de cómo están almacenados los libros ni de cómo busca el
código de la librería de los libros en rústica. El código de la librería no conoce qué procesamiento se realiza sobre los libros en
rústica después de encontrarlos.
Ejemplo
C#
// A set of classes for handling a bookstore:
namespace Bookstore
{
using System.Collections;
// Describes a book in the book list:
public struct Book
{
public string Title; // Title of the book.
public string Author; // Author of the book.
public decimal Price; // Price of the book.
public bool Paperback; // Is it paperback?
public Book(string title, string author, decimal price, bool paperBack)
{
Title = title;
Author = author;
Price = price;
Paperback = paperBack;
}
}
// Declare a delegate type for processing a book:
public delegate void ProcessBookDelegate(Book book);
// Maintains a book database.
public class BookDB
{
// List of all books in the database:
ArrayList list = new ArrayList();

// Add a book to the database:


public void AddBook(string title, string author, decimal price, bool paperBack)
{
list.Add(new Book(title, author, price, paperBack));
}
// Call a passed-in delegate on each paperback book to process it:
public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
{
foreach (Book b in list)
{
if (b.Paperback)
// Calling the delegate:
processBook(b);
}
}
}
}

// Using the Bookstore classes:


namespace BookTestClient
{
using Bookstore;
// Class to total and average prices of books:
class PriceTotaller
{
int countBooks = 0;
decimal priceBooks = 0.0m;

internal void AddBookToTotal(Book book)


{
countBooks += 1;
priceBooks += book.Price;
}

internal decimal AveragePrice()


{
return priceBooks / countBooks;
}
}

// Class to test the book database:


class TestBookDB
{
// Print the title of the book.
static void PrintTitle(Book b)
{
System.Console.WriteLine(" {0}", b.Title);
}

// Execution starts here.


static void Main()
{
BookDB bookDB = new BookDB();
// Initialize the database with some books:
AddBooks(bookDB);

// Print all the titles of paperbacks:


System.Console.WriteLine("Paperback Book Titles:");

// Create a new delegate object associated with the static


// method Test.PrintTitle:
bookDB.ProcessPaperbackBooks(PrintTitle);

// Get the average price of a paperback by using


// a PriceTotaller object:
PriceTotaller totaller = new PriceTotaller();

// Create a new delegate object associated with the nonstatic


// method AddBookToTotal on the object totaller:
bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);

System.Console.WriteLine("Average Paperback Book Price: ${0:#.##}",


totaller.AveragePrice());
}

// Initialize the book database with some test books:


static void AddBooks(BookDB bookDB)
{
bookDB.AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M.
Ritchie", 19.95m, true);
bookDB.AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95m, tr
ue);
bookDB.AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95m, false);
bookDB.AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00m, true)
;
}
}
}

Resultados
Paperback Book Titles:
The C Programming Language
The Unicode Standard 2.0
Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97

Programación eficaz
Declarar un delegado.
La siguiente instrucción:
C#
public delegate void ProcessBookDelegate(Book book);

declara un nuevo tipo delegado. Cada tipo delegado describe el número y tipo de los argumentos, así como el tipo del
valor devuelto de los métodos que puede encapsular. Cuando se necesita un nuevo conjunto de tipos de argumentos o
de valor devuelto, se debe declarar un nuevo tipo delegado.
Crear instancias de un delegado.
Una vez declarado un tipo delegado, debe crearse un objeto delegado y asociarlo con un determinado método. En el
ejemplo anterior, esto se hace pasando el método PrintTitle al método ProcessPaperbackBooks de la forma siguiente:
C#
bookDB.ProcessPaperbackBooks(PrintTitle);

Esto crea un nuevo objeto delegado asociado con el método estático Test.PrintTitle. Igualmente, el método no
estático AddBookToTotal del objeto totaller se pasa así:
C#
bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);

En ambos casos, este nuevo objeto delegado se pasa al método ProcessPaperbackBooks.


Una vez que se crea el delegado, el método con el que está asociado no cambia nunca; los objetos delegados son
inmutables.
Llamar a un delegado.
Una vez creado un objeto delegado, éste se pasa normalmente a otro código que llamará al delegado. La llamada a un
objeto delegado se realiza mediante el nombre del objeto delegado, seguido por los argumentos entre paréntesis que se
pasarán al delegado. Un ejemplo de llamada a un delegado es:
C#
processBook(b);

Se puede llamar a un delegado de forma sincrónica, como en este ejemplo, o de forma asincrónica, utilizando los
métodos BeginInvoke y EndInvoke.
Vea también
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Delegados (Guía de programación de C#)
Guía de programación de C#

Eventos (Guía de programación de C#)


Los eventos proporcionan un medio de que una clase u objeto informe a otras clases u objetos cuando sucede algo relevante.
La clase que envía (o produce) el evento recibe el nombre de editor y las clases que reciben (o controlan) el evento se
denominan suscriptores.
En una aplicación de formularios Windows Forms o Web en C# típica, se suscribe a eventos generados por controles como
botones y cuadros de lista. Puede utilizar el entorno de desarrollo integrado (IDE) Visual C# para examinar los eventos que
publica un control y seleccionar los que desea controlar. El IDE agrega automáticamente un método de controlador de eventos
vacío y el código para suscribirse al evento. Para obtener más información, vea
Cómo: Suscribir y cancelar la suscripción a eventos (Guía de programación de C#).
Información general de eventos
Los eventos tienen las propiedades siguientes:
El editor determina cuándo se produce un evento; los suscriptores determinan qué operación se realiza en respuesta al
evento.
Un evento puede tener varios suscriptores. Un suscriptor puede controlar varios eventos de varios editores.
No se llama nunca a los eventos que no tienen suscriptores.
Los eventos se utilizan normalmente para señalar acciones del usuario como hacer clic en un botón o seleccionar un
menú en interfaces gráficas de usuario.
Si un evento tiene varios suscriptores, se invocan los controladores de eventos sincrónicamente cuando se produce el
evento. Para invocar de forma asincrónica los eventos, vea Llamar a métodos sincrónicos de forma asincrónica.
Los eventos se pueden utilizar para sincronizar subprocesos.
En la biblioteca de clases .NET Framework, los eventos se basan en el delegado EventHandler y en la clase base
EventArgs.
Secciones relacionadas
Para obtener más información, vea:
Cómo: Suscribir y cancelar la suscripción a eventos (Guía de programación de C#)
Cómo: Publicar eventos que cumplan las directrices de .NET Framework (Guía de programación de C#)
Cómo: Producir eventos de una clase base en clases derivadas (Guía de programación de C#)
Cómo: Implementar eventos de interfaz (Guía de programación de C#)
Sincronización de subprocesos (Guía de programación de C#)
Cómo: Utilizar un diccionario para almacenar instancias de eventos (Guía de programación de C#)
Ejemplo de eventos
Diseño de eventos
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
1.6.6.4 Eventos
10.2.7.2 Nombres de miembros reservados para eventos
10.7 Eventos
13.2.3 Eventos de interfaz
Vea también
Referencia
EventHandler
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Otros recursos
Crear controladores de eventos en formularios Windows Forms
Guía de programación de C#

Cómo: Suscribir y cancelar la suscripción a eventos (Guía de


programación de C#)
La suscripción a un evento publicado por otra clase se realiza cuando se desea escribir código personalizado al que se llama
cuando se produce ese evento. Por ejemplo, puede suscribirse al evento "click" de un botón para que la aplicación realice
alguna operación cuando el usuario haga clic en el botón.
Para suscribirse a eventos mediante el IDE de Visual Studio 2005
1. Si la ventana Propiedades no está visible, en la vista Diseño, haga clic con el botón secundario del mouse en el
formulario o control para el cual desea crear un controlador de eventos y seleccione Propiedades.
2. En la parte superior de la ventana Propiedades, haga clic en el icono Eventos.
3. Haga doble clic en el evento que desea crear (por ejemplo, el evento Load).
Visual C# crea un método controlador de eventos vacío y lo agrega al código. También puede agregar manualmente el
código en la vista Código. Por ejemplo, las líneas siguientes de código declaran un método controlador de eventos al que
se llamará cuando la clase Form genere el evento Load.
C#
private void Form1_Load(object sender, System.EventArgs e)
{
// Add your form load event handling code here.
}

La línea de código necesaria para suscribirse al evento también se genera automáticamente en el método
InitializeComponent en el archivo Form1.Designer.cs del proyecto. Presenta el aspecto siguiente:

this.Load += new System.EventHandler(this.Form1_Load);

Para suscribirse a eventos mediante programación


1. Defina un método controlador de eventos cuya firma coincida con la firma de delegado del evento. Por ejemplo, si el
evento se basa en el tipo de delegado EventHandler, el siguiente código representa el código auxiliar del método:

void HandleCustomEvent(object sender, CustomEventArgs a)


{
// Do something useful here.
}

2. Utilice el operador de suma y asignación (+ =) para asociar el controlador de eventos al evento. En el ejemplo siguiente,
se asume que un objeto denominado publisher tiene un evento denominado RaiseCustomEvent. Observe que la clase
de suscriptor necesita una referencia a la clase de editor para suscribirse a sus eventos.

publisher.RaiseCustomEvent += HandleCustomEvent;

Observe que la sintaxis anterior es nueva en C# 2.0. Al igual que en la sintaxis de C# 1.0, el delegado encapsulador debe
crearse explícitamente mediante la nueva palabra clave:

publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);

Para suscribirse a eventos mediante un método anónimo


Utilice el operador de suma y asignación (+ =) para asociar el método anónimo al evento. En el ejemplo siguiente, se
asume que un objeto denominado publisher tiene un evento denominado RaiseCustomEvent y que se ha definido una
clase CustomEventArgs para proporcionar algún tipo de información específica del evento. Observe que la clase de
suscriptor necesita una referencia a publisher para suscribirse a sus eventos.

publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)


{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};

Es importante tener en cuenta que puede no resultar fácil cancelar la suscripción a un evento si se ha utilizado un método
anónimo para suscribirse a él. Para cancelar la suscripción en esta situación, regrese al código donde se ha suscrito al evento,
almacene el método anónimo en una variable de delegado y, a continuación, agregue el delegado al evento.
Cancelar una suscripción
Para impedir que se invoque el controlador de eventos cuando se produce el evento, basta con cancelar la suscripción al
evento. Para evitar que se pierdan recursos, es importante cancelar la suscripción a los eventos antes de eliminar un objeto
suscriptor. Hasta que se cancela la suscripción a un evento, el delegado multidifusión subyacente al evento en el objeto de
publicación tiene una referencia al delegado que encapsula el controlador de eventos del suscriptor. Mientras el objeto de
publicación mantenga esa referencia, el objeto suscriptor no se recolectará como elemento no utilizado.
Para cancelar la suscripción a un evento
Utilice el operador de resta y asignación (-=) para cancelar la suscripción a un evento:

publisher.RaiseCustomEvent -= HandleCustomEvent;

Cuando se haya cancelado la suscripción a un evento de todos los suscriptores, la instancia del evento en la clase de
editor se establecerá en null.

Vea también
Tareas
Cómo: Publicar eventos que cumplan las directrices de .NET Framework (Guía de programación de C#)
Referencia
event (Referencia de C#)
Operador -= (Referencia de C#)
Operador += (Referencia de C#)
Conceptos
Eventos (Guía de programación de C#)
Guía de programación de C#

Cómo: Publicar eventos que cumplan las directrices de .NET


Framework (Guía de programación de C#)
El procedimiento siguiente muestra cómo agregar eventos que cumplan el modelo estándar .NET Framework a sus propias
clases y estructuras. Todos los eventos de la biblioteca de clases .NET Framework se basan en el delegado EventHandler, que se
define del modo siguiente:

public delegate void EventHandler(object sender, EventArgs e);

Nota
.NET Framework 2.0 incluye una versión genérica de este delegado, EventHandler<T>. Los ejemplos siguientes muestran có
mo utilizar ambas versiones.

Aunque los eventos de las clases que defina se pueden basar en cualquier tipo de delegado válido, incluidos los delegados que
devuelven un valor, normalmente es aconsejable que los eventos se basen en el modo .NET Framework utilizando para ello
EventHandler, como se muestra en el ejemplo siguiente:
Para publicar eventos basados en el modelo EventHandler
1. (Omita este paso y vaya directamente al paso 3a si no tiene necesidad de enviar datos personalizados con el evento).
Declare la clase en un ámbito visible a las clases de editor y suscriptor, y agregue los miembros necesarios para
almacenar los datos de eventos personalizados. En este ejemplo, se devuelve una cadena simple.

public class CustomEventArgs : EventArgs


{
public CustomEventArgs(string s)
{
msg = s;
}
private string msg;
public string Message
{
get { return msg; }
}
}

2. (Omita este paso si utiliza la versión genérica de EventHandler). Declare un delegado en la clase de publicación.
Asígnele un nombre que acabe en EventHandler. El segundo parámetro especifica el tipo EventArgs personalizado.

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

3. Declare el evento en la clase de publicación mediante alguno de los procedimientos siguientes.


a. Si no tiene ninguna clase EventArgs personalizada, el tipo Event será el delegado EventHandler no genérico. No
necesita declararlo porque ya se declara en el espacio de nombres System, incluido de forma predeterminada en el
proyecto de C#:

public event EventHandler RaiseCustomEvent;

b. Si utiliza la versión no genérica de EventHandler y tiene una clase personalizada derivada de EventArgs, declare el
evento dentro de la clase de publicación y use el delegado como tipo:

class Publisher
{
public event CustomEventHandler RaiseCustomEvent;
}

c. Si utiliza la versión genérica, no necesita un delegado personalizado. En lugar de ello, especifique el tipo de evento
como EventHandler<CustomEventArgs>, como sustituto del nombre de su propia clase incluido entre corchetes
angulares.

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

Ejemplo
El ejemplo siguiente muestra los pasos indicados anteriormente con una clase EventArgs personalizada y EventHandler<T>
como el tipo de evento.
C#
namespace DotNetEvents
{
using System;
using System.Collections.Generic;

// Define a class to hold custom event info


public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message;

public string Message


{
get { return message; }
set { message = value; }
}
}

// Class that publishes an event


class Publisher
{

// Declare the event using EventHandler<T>


public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public void DoSomething()
{
// Write some code that does something useful here
// then raise the event. You can also raise an event
// before you execute a block of code.
OnRaiseCustomEvent(new CustomEventArgs("Did something"));

}
// Wrap event invocations inside a protected virtual method
// to allow derived classes to override the event invocation behavior
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

// Event will be null if there are no subscribers


if (handler != null)
{
// Format the string to send inside the CustomEventArgs parameter
e.Message += String.Format(" at {0}", DateTime.Now.ToString());
// Use the () operator to raise the event.
handler(this, e);
}
}
}

//Class that subscribes to an event


class Subscriber
{
private string id;
public Subscriber(string ID, Publisher pub)
{
id = ID;
// Subscribe to the event using C# 2.0 syntax
pub.RaiseCustomEvent += HandleCustomEvent;
}
// Define what actions to take when the event is raised.
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(id + " received this message: {0}", e.Message);
}
}
class Program
{
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1", pub);
Subscriber sub2 = new Subscriber("sub2", pub);

// Call the method that raises the event.


pub.DoSomething();

// Keep the console window open


Console.WriteLine("Press Enter to close this window.");
Console.ReadLine();

}
}
}

Vea también
Referencia
Delegate
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Diseño de eventos
Delegados (Guía de programación de C#)
Guía de programación de C#

Cómo: Producir eventos de una clase base en clases derivadas


(Guía de programación de C#)
El siguiente ejemplo simple muestra la forma estándar de declarar eventos en una clase base para que también se puedan
generar desde clases derivadas. Este modelo se utiliza ampliamente en clases de formularios Windows Forms en la biblioteca
de clases base .NET Framework.
Al crear una clase que se pueda utilizar como una clase base para otras clases, debe tener en cuenta que los eventos son un
tipo especial de delegado que sólo se pueden invocar desde dentro la clase que los declaró. Las clases derivadas no pueden
invocar directamente a eventos declarados dentro de la clase base. Aunque a veces puede ser conveniente que un evento sólo
pueda ser generado por la clase base, normalmente deberá permitir que la clase derivada invoque eventos de clase base. Para
ello, puede crear un método de invocación protegido en la clase base que contiene el evento. Al llamar a este método de
invocación o al reemplazarlo, las clases derivadas podrán invocar directamente el evento.
Ejemplo
C#

namespace BaseClassEvents
{
using System;
using System.Collections.Generic;

// Special EventArgs class to hold info about Shapes.


public class ShapeEventArgs : EventArgs
{
private double newArea;

public ShapeEventArgs(double d)
{
newArea = d;
}
public double NewArea
{
get { return newArea; }
}
}

// Base class event publisher


public abstract class Shape
{
protected double area;
public double Area
{
get { return area; }
set { area = value; }
}
// The event. Note that by using the generic EventHandler<T> event type
// we do not need to declare a separate delegate type.
public event EventHandler<ShapeEventArgs> ShapeChanged;

public abstract void Draw();


//The event-invoking method that derived classes can override.
protected virtual void OnShapeChanged(ShapeEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<ShapeEventArgs> handler = ShapeChanged;
if (handler != null)
{
handler(this, e);
}
}
}

public class Circle : Shape


{
private double radius;
public Circle(double d)
{
radius = d;
area = 3.14 * radius;
}
public void Update(double d)
{
radius = d;
area = 3.14 * radius;
OnShapeChanged(new ShapeEventArgs(area));
}
protected override void OnShapeChanged(ShapeEventArgs e)
{
// Do any circle-specific processing here.
// Call the base class event invocation method.
base.OnShapeChanged(e);
}
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}

public class Rectangle : Shape


{
private double length;
private double width;
public Rectangle(double length, double width)
{
this.length = length;
this.width = width;
area = length * width;
}
public void Update(double length, double width)
{
this.length = length;
this.width = width;
area = length * width;
OnShapeChanged(new ShapeEventArgs(area));
}
protected override void OnShapeChanged(ShapeEventArgs e)
{
// Do any rectangle-specific processing here.
// Call the base class event invocation method.
base.OnShapeChanged(e);
}
public override void Draw()
{
Console.WriteLine("Drawing a rectangle");
}
}

// Represents the surface on which the shapes are drawn


// Subscribes to shape events so that it knows
// when to redraw a shape.
public class ShapeContainer
{
List<Shape> _list;
public ShapeContainer()
{
_list = new List<Shape>();
}

public void AddShape(Shape s)


{
_list.Add(s);
// Subscribe to the base class event.
s.ShapeChanged += HandleShapeChanged;
}

// ...Other methods to draw, resize, etc.

private void HandleShapeChanged(object sender, ShapeEventArgs e)


{
Shape s = (Shape)sender;

// Diagnostic message for demonstration purposes.


Console.WriteLine("Received event. Shape area is now {0}", e.NewArea);

// Redraw the shape here.


s.Draw();
}
}

class Test
{

static void Main(string[] args)


{
//Create the event publishers and subscriber
Circle c1 = new Circle(54);
Rectangle r1 = new Rectangle(12, 9);
ShapeContainer sc = new ShapeContainer();

// Add the shapes to the container.


sc.AddShape(c1);
sc.AddShape(r1);

// Cause some events to be raised.


c1.Update(57);
r1.Update(7, 7);

// Keep the console window open.


Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
}

Resultados
Received event. Shape area is now 178.98
Drawing a circle
Received event. Shape area is now 49
Drawing a rectangle

Vea también
Referencia
Modificadores de acceso (Guía de programación de C#)
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Delegados (Guía de programación de C#)
Otros recursos
Crear controladores de eventos en formularios Windows Forms
Guía de programación de C#

Cómo: Implementar eventos de interfaz (Guía de programación


de C#)
Una interfaz puede declarar un evento. El ejemplo siguiente muestra cómo implementar eventos de interfaz en una clase.
Básicamente, las reglas son las mismas que cuando se implementa cualquier método de interfaz o propiedad.
Para implementar eventos de interfaz en una clase
Declare el evento en la clase y, a continuación, invóquelo en los lugares adecuados.

public interface IDrawingObject


{
event EventHandler ShapeChanged;
}
public class MyEventArgs : EventArgs {…}
public class Shape : IDrawingObject
{
event EventHandler ShapeChanged;
void ChangeShape()
{
// Do something before the event…
OnShapeChanged(new MyEventsArgs(…));
// or do something after the event.
}
protected virtual void OnShapeChanged(MyEventArgs e)
{
if(ShapeChanged != null)
{
ShapeChanged(this, e);
}
}
}

Ejemplo
El ejemplo siguiente muestra cómo controlar la situación menos común en la que la clase se hereda de dos o más interfaces y
cada interfaz tiene un evento con el mismo nombre. En esta situación, debe proporcionar una implementación de interfaz
explícita para al menos uno de los eventos. Cuando escriba una implementación de interfaz explícita para un evento, también
debe incluir los descriptores de acceso a eventos add y remove. Normalmente, estos descriptores los proporciona el
compilador, pero en este caso no es así.
Al proporcionar sus propios descriptores de acceso, puede especificar si los dos eventos se representan mediante el mismo
evento en la clase o mediante eventos diferentes. Por ejemplo, si los eventos deben producirse en momentos diferentes según
las especificaciones de la interfaz, puede asociar cada evento a una implementación distinta en la clase. En el ejemplo siguiente,
los suscriptores determinan qué evento OnDraw se recibirá convirtiendo la referencia de la forma en IShape o IDrawingObject.
C#
namespace WrapTwoInterfaceEvents
{
using System;
public interface IDrawingObject
{
// Raise this event before drawing
// the object.
event EventHandler OnDraw;
}
public interface IShape
{
// Raise this event after drawing
// the shape.
event EventHandler OnDraw;
}

// Base class event publisher inherits two


// interfaces, each with an OnDraw event
public class Shape : IDrawingObject, IShape
{
// Create an event for each interface event
event EventHandler PreDrawEvent;
event EventHandler PostDrawEvent;
// Explicit interface implementation required.
// Associate IDrawingObject's event with
// PreDrawEvent
event EventHandler IDrawingObject.OnDraw
{
add { PreDrawEvent += value; }
remove { PreDrawEvent -= value; }
}
// Explicit interface implementation required.
// Associate IShape's event with
// PostDrawEvent
event EventHandler IShape.OnDraw
{
add { PostDrawEvent += value; }
remove { PostDrawEvent -= value; }
}

// For the sake of simplicity this one method


// implements both interfaces.
public void Draw()
{
// Raise IDrawingObject's event before the object is drawn.
EventHandler handler = PreDrawEvent;
if (handler != null)
{
handler(this, new EventArgs());
}
Console.WriteLine("Drawing a shape.");

// RaiseIShape's event after the object is drawn.


handler = PostDrawEvent;
if (handler != null)
{
handler(this, new EventArgs());
}
}
}
public class Subscriber1
{
// References the shape object as an IDrawingObject
public Subscriber1(Shape shape)
{
IDrawingObject d = (IDrawingObject)shape;
d.OnDraw += new EventHandler(d_OnDraw);
}
void d_OnDraw(object sender, EventArgs e)
{
Console.WriteLine("Sub1 receives the IDrawingObject event.");
}
}
// References the shape object as an IShape
public class Subscriber2
{
public Subscriber2(Shape shape)
{
IShape d = (IShape)shape;
d.OnDraw += new EventHandler(d_OnDraw);
}

void d_OnDraw(object sender, EventArgs e)


{
Console.WriteLine("Sub2 receives the IShape event.");
}
}

public class Program


{
static void Main(string[] args)
{
Shape shape = new Shape();
Subscriber1 sub = new Subscriber1(shape);
Subscriber2 sub2 = new Subscriber2(shape);
shape.Draw();

Console.WriteLine("Press Enter to close this window.");


Console.ReadLine();
}
}

Resultados
Sub1 receives the IDrawingObject event.
Drawing a shape.
Sub2 receives the IShape event.

Vea también
Tareas
Cómo: Producir eventos de una clase base en clases derivadas (Guía de programación de C#)
Referencia
Implementación explícita de interfaz (Guía de programación de C#)
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Delegados (Guía de programación de C#)
Guía de programación de C#

Cómo: Utilizar un diccionario para almacenar instancias de


eventos (Guía de programación de C#)
Uno de los usos de accessor-declarations es exponer un gran número de eventos sin tener que asignar un campo para cada
evento, sino utilizando en su lugar un diccionario que almacene las instancias de los eventos. Esto sólo resulta útil si se dispone
de un gran número de eventos, pero se prevé que la mayoría de los eventos no se implementarán.
Ejemplo
C#
public delegate void EventHandler1(int i);
public delegate void EventHandler2(string s);

public class PropertyEventsSample


{
private System.Collections.Generic.Dictionary<string, System.Delegate> eventTable;

public PropertyEventsSample()
{
eventTable = new System.Collections.Generic.Dictionary<string, System.Delegate>();
eventTable.Add("Event1", null);
eventTable.Add("Event2", null);
}

public event EventHandler1 Event1


{
add
{
eventTable["Event1"] = (EventHandler1)eventTable["Event1"] + value;
}
remove
{
eventTable["Event1"] = (EventHandler1)eventTable["Event1"] - value;
}
}

public event EventHandler2 Event2


{
add
{
eventTable["Event2"] = (EventHandler2)eventTable["Event2"] + value;
}
remove
{
eventTable["Event2"] = (EventHandler2)eventTable["Event2"] - value;
}
}
internal void RaiseEvent1(int i)
{
EventHandler1 handler1;
if (null != (handler1 = (EventHandler1)eventTable["Event1"]))
{
handler1(i);
}
}
internal void RaiseEvent2(string s)
{
EventHandler2 handler2;
if (null != (handler2 = (EventHandler2)eventTable["Event2"]))
{
handler2(s);
}
}
}

public class TestClass


{
public static void Delegate1Method(int i)
{
System.Console.WriteLine(i);
}
public static void Delegate2Method(string s)
{
System.Console.WriteLine(s);
}

static void Main()


{
PropertyEventsSample p = new PropertyEventsSample();
p.Event1 += new EventHandler1(TestClass.Delegate1Method);
p.Event1 += new EventHandler1(TestClass.Delegate1Method);
p.Event1 -= new EventHandler1(TestClass.Delegate1Method);
p.RaiseEvent1(2);

p.Event2 += new EventHandler2(TestClass.Delegate2Method);


p.Event2 += new EventHandler2(TestClass.Delegate2Method);
p.Event2 -= new EventHandler2(TestClass.Delegate2Method);
p.RaiseEvent2("TestString");
}
}

Resultados
2
TestString

Vea también
Conceptos
Guía de programación de C#
Eventos (Guía de programación de C#)
Delegados (Guía de programación de C#)
Manual del programador de .NET Framework

Programación multiproceso con el modelo asincrónico basado


en eventos
Hay varias maneras de exponer las características asincrónicas al código de cliente. El Modelo asincrónico basado en evento
prescribe la manera recomendada para que las clases presenten comportamiento asincrónico.
En esta sección
Información general sobre el modelo asincrónico basado en eventos
Describe cómo el Modelo asincrónico basado en evento pone a su disposición las ventajas de las aplicaciones multiproceso
ocultando muchos de los problemas complejos inherentes al diseño multiproceso.
Implementar el modelo asincrónico basado en eventos
Describe la manera estándar de empaquetar una clase que tiene características asincrónicas.
Procedimientos recomendados para implementar el modelo asincrónico basado en eventos
Describe los requisitos para exponer las características asincrónicas según el Modelo asincrónico basado en evento.
Decidir cuándo implementar el modelo asincrónico basado en eventos
Describe cómo determinar cuándo se debería decidir implementar el Modelo asincrónico basado en evento en lugar del
modelo IAsyncResult.
Tutorial: Implementar un componente que admita el modelo asincrónico basado en eventos
Explica cómo crear un componente que implementa el Modelo asincrónico basado en evento. Se implementa utilizando las
clases auxiliares del espacio de nombres System.ComponentModel, que garantiza que el componente funciona
correctamente bajo cualquier modelo de aplicación.
Cómo: Utilizar componentes que admitan el modelo asincrónico basado en eventos
Describe cómo utilizar un componente que admite el Modelo asincrónico basado en evento.
Referencia
AsyncOperation
Describe la clase AsyncOperation y contiene vínculos a todos sus miembros.
AsyncOperationManager
Describe la clase AsyncOperationManager y contiene vínculos a todos sus miembros.
BackgroundWorker
Describe el componente BackgroundWorker y contiene vínculos a todos sus miembros.
Secciones relacionadas
Ejemplo Event-based Asynchronous Pattern Technology
Muestra cómo utilizar el Modelo asincrónico basado en evento para realizar operaciones asincrónicas comunes.
Subprocesamiento múltiple en Visual Basic
Describe las características de subprocesamiento múltiple en .NET Framework.
Vea también
Conceptos
Procedimientos recomendados para el subprocesamiento administrado
Eventos y delegados
Otros recursos
Subprocesamiento múltiple en componentes
Modelos de diseño para la programación asincrónica
Guía de programación de C#

Genéricos (Guía de programación de C#)


Los tipos genéricos son una nueva característica en la versión 2.0 del lenguaje C# y Common Language Runtime (CLR). Estos
tipos agregan el concepto de parámetros de tipo a .NET Framework, lo cual permite diseñar clases y métodos que aplazan la
especificación de uno o más tipos hasta que el código de cliente declara y crea una instancia de la clase o del método. Por
ejemplo, mediante la utilización de un parámetro de tipo genérico T, se puede escribir una clase única que otro código de
cliente puede utilizar sin generar el costo o el riesgo de conversiones en tiempo de ejecución u operaciones de conversión
boxing, como se muestra a continuación:
C#
// Declare the generic class
public class GenericList<T>
{
void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// Declare a list of type int
GenericList<int> list1 = new GenericList<int>();

// Declare a list of type string


GenericList<string> list2 = new GenericList<string>();

// Declare a list of type ExampleClass


GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
}
}

Información general acerca de los tipos genéricos


Utilice los tipos genéricos para maximizar la reutilización, seguridad de tipos y rendimiento del código.
El uso más común de genéricos es crear clases de colección.
La biblioteca de clases de .NET Framework contiene varias nuevas clases de colección genéricas en el espacio de
nombres System.Collections.Generic. Éstas se deberían utilizar siempre que sea posible en lugar de clases como ArrayList
en el espacio de nombres System.Collections.
Puede crear sus propias interfaces, clases, métodos, eventos y delegados genéricos.
Las clases genéricas se pueden restringir para permitir el acceso a métodos en tipos de datos determinados.
Se puede obtener información sobre los tipos utilizados en un tipo de datos genéricos en tiempo de ejecución y
mediante reflexión.
Secciones relacionadas
Para obtener más información:
Introducción a los genéricos (Guía de programación de C#)
Ventajas de los genéricos (Guía de programación de C#)
Parámetros de tipos genéricos (Guía de programación de C#)
Restricciones de tipos de parámetros (Guía de programación de C#)
Clases genéricas (Guía de programación de C#)
Interfaces genéricas (Guía de programación de C#)
Métodos genéricos (Guía de programación de C#)
Delegados genéricos (Guía de programación de C#)
Palabra clave predeterminada en código genérico (Guía de programación de C#)
Diferencias entre plantillas de C++ y tipos genéricos de C# (Guía de programación de C#)
Genéricos y reflexión (Guía de programación de C#)
Genéricos en el motor en tiempo de ejecución (Guía de programación de C#)
Tipos genéricos en la biblioteca de clases de .NET Framework (Guía de programación de C#)
Ejemplo de clases genéricas (C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
20 Genéricos
Vea también
Referencia
Tipos de datos (Guía de programación de C#)
<typeparam> (Guía de programación de C#)
<typeparamref> (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Guía de programación de C#

Introducción a los genéricos (Guía de programación de C#)


Las clases y los métodos genéricos combinan reusabilidad, seguridad de tipos y eficacia de una manera que sus homólogos no
genéricos no pueden. Los tipos genéricos se utilizan comúnmente con las colecciones y los métodos que funcionan en ellas. La
versión 2.0 de la biblioteca de clases de .NET Framework proporciona un nuevo espacio de nombres,
System.Collections.Generic, que contiene varias clases nuevas de colección basadas en tipos genéricos. Se recomienda que
todas las aplicaciones cuyo destino es la versión 2.0 utilicen las nuevas clases de colección genéricas en lugar de sus
homólogas no genéricas anteriores como ArrayList. Para obtener más información, vea
Tipos genéricos en la biblioteca de clases de .NET Framework (Guía de programación de C#).
Claro está que también se pueden crear tipos y métodos genéricos personalizados para proporcionar soluciones generalizadas
propias y diseñar modelos eficaces que tengan seguridad de tipos. El ejemplo de código siguiente muestra una clase de lista
vinculada genérica para propósitos de demostración. (En la mayoría de los casos, se recomienda utilizar la clase List<T>
proporcionada por la biblioteca de clases de .NET Framework, en lugar de crear una propia.) El parámetro de tipo T se emplea
en diversos lugares donde generalmente se utilizaría un tipo concreto para indicar el tipo del elemento almacenado en la lista.
Este parámetro se utiliza de las formas siguientes:
Como tipo de un parámetro de método en el método AddHead.
Como tipo de valor devuelto del método público GetNext y la propiedad Data en la clase anidada Node.
Como tipo de datos de los miembros privados en la clase anidada.
Observe que T está disponible para la clase anidada Node. Cuando se crean instancias de GenericList<T> con un tipo
concreto, por ejemplo GenericList<int>, cada aparición de T se reemplazará con int.
C#
// type parameter T in angle brackets
public class GenericList<T>
{
// The nested class is also generic on T
private class Node
{
// T used in non-generic constructor
public Node(T t)
{
next = null;
data = t;
}
private Node next;
public Node Next
{
get { return next; }
set { next = value; }
}

// T as private member data type


private T data;

// T as return type of property


public T Data
{
get { return data; }
set { data = value; }
}
}

private Node head;


// constructor
public GenericList()
{
head = null;
}
// T as method parameter type:
public void AddHead(T t)
{
Node n = new Node(t);
n.Next = head;
head = n;
}
public IEnumerator<T> GetEnumerator()
{
Node current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}

En el ejemplo de código siguiente se muestra cómo el código de cliente utiliza la clase genérica GenericList<T> para crear una
lista de enteros. Con sólo cambiar el argumento de tipo, el código que aparece a continuación se puede modificar fácilmente
para crear listas de cadenas o cualquier otro tipo personalizado:
C#
class TestGenericList
{
static void Main()
{
// int is the type argument
GenericList<int> list = new GenericList<int>();

for (int x = 0; x < 10; x++)


{
list.AddHead(x);
}

foreach (int i in list)


{
System.Console.Write(i + " ");
}
System.Console.WriteLine("\nDone");
}
}

Vea también
Referencia
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Guía de programación de C#

Ventajas de los genéricos (Guía de programación de C#)


Los tipos genéricos proporcionan la solución a una limitación de las versiones anteriores de Common Language Runtime y del
lenguaje C#, en los que se realiza una generalización mediante la conversión de tipos a y desde el tipo base universal Object.
Con la creación de una clase genérica, se puede crear una colección que garantiza la seguridad de tipos en tiempo de
compilación.
Las limitaciones del uso de clases de colección no genéricas se pueden demostrar escribiendo un breve programa que utiliza la
clase de colección ArrayList de la biblioteca de clases base de .NET Framework. ArrayList es una clase de colección muy
conveniente, que se puede utilizar sin modificar para almacenar referencias o tipos de valor.
C#
// The .NET Framework 1.1 way to create a list:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);

System.Collections.ArrayList list2 = new System.Collections.ArrayList();


list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

Pero esta conveniencia tiene su costo. Cualquier referencia o tipo de valor agregado a un objeto ArrayList se convierte
implícitamente a Object. Si los elementos son tipos de valor, se les debe aplicar la conversión boxing cuando se agregan a la
lista y la conversión unboxing cuando se recuperan. Tanto las operaciones de conversión de tipos como las de conversiones
boxing y unboxing degradan el rendimiento; el efecto de las conversiones boxing y unboxing puede ser muy importante en
escenarios donde se deben recorrer en iteración colecciones extensas.
La otra limitación es la ausencia de comprobación de tipos en tiempo de compilación; puesto que un objeto ArrayList
convierte todo a Object, en tiempo de compilación no hay forma de evitar que el código de cliente haga lo siguiente:
C#
System.Collections.ArrayList list = new System.Collections.ArrayList();
// Add an integer to the list.
list.Add(3);
// Add a string to the list. This will compile, but may cause an error later.
list.Add("It is raining in Redmond.");

int t = 0;
// This causes an InvalidCastException to be returned.
foreach (int x in list)
{
t += x;
}

Aunque es perfectamente válido y a veces intencionado si se crea una colección heterogénea, es probable que la combinación
de cadenas y valores ints en un objeto ArrayList único sea un error de programación, el cual no se detectará hasta el tiempo
de ejecución.
En las versiones 1.0 y 1.1 del lenguaje C#, se podían evitar los riesgos de utilizar código generalizado en las clases de colección
de la biblioteca de clases base de .NET Framework escribiendo colecciones propias específicas del tipo. Claro está que, como
dicha clase no se puede reutilizar para más de un tipo de datos, se pierden las ventajas de la generalización y se debe volver a
escribir la clase para cada uno de los tipos que se almacenarán.
Lo que ArrayList y otras clases similares realmente necesitan es un modo de que el código de cliente especifique, por
instancias, el tipo de datos particular que se va a utilizar. Eso eliminaría la necesidad de convertir a T:System.Object y también
haría posible que el compilador realizara la comprobación de tipos. Es decir, ArrayList necesita un type parameter. Eso es
precisamente lo que los tipos genéricos proporcionan. En la colección genérica List<T>, en el espacio de nombres
N:System.Collections.Generic, la misma operación de agregar elementos a la colección tiene la apariencia siguiente:
C#
// The .NET Framework 2.0 way to create a list
List<int> list1 = new List<int>();
// No boxing, no casting:
list1.Add(3);
// Compile-time error:
// list1.Add("It is raining in Redmond.");

En el código de cliente, la única sintaxis que se agrega con List<T> en comparación con ArrayList es el argumento de tipo en
la declaración y creación de instancias. A cambio de esta complejidad de codificación ligeramente mayor, se puede crear una
lista que no sólo es más segura que ArrayList, sino que también es bastante más rápida, en especial cuando los elementos de
lista son tipos de valor.
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Guía de programación de C#

Parámetros de tipos genéricos (Guía de programación de C#)


En una definición de tipo o método genérico, un parámetro de tipo es un marcador para un tipo especificado por un cliente al
crear una instancia de una variable del tipo genérico. Una clase genérica, como GenericList<T>, que se muestra en
Introducción a los genéricos (Guía de programación de C#), no se puede utilizar tal cual, porque no es realmente un tipo, sino
el plano de un tipo. Para utilizar GenericList<T>, el código de cliente debe declarar y crear una instancia de un tipo construido
especificando un argumento de tipo dentro de los corchetes angulares. El argumento de tipo para esta clase determinada
puede ser cualquier tipo reconocido por el compilador. Se puede crear cualquier número de instancias del tipo construido,
cada una de ellas con un argumento de tipo diferente, de la forma siguiente:
C#
GenericList<float> list1 = new GenericList<float>();
GenericList<ExampleClass> list2 = new GenericList<ExampleClass>();
GenericList<ExampleStruct> list3 = new GenericList<ExampleStruct>();

En cada una de estas instancias de GenericList<T>, cada aparición de T en la clase se sustituirá en tiempo de ejecución con el
argumento de tipo. Mediante esta sustitución, hemos creado tres objetos independientes y eficaces con seguridad de tipos
utilizando una sola definición de clase. Para obtener más información sobre cómo el CLR realiza esta sustitución, vea
Genéricos en el motor en tiempo de ejecución (Guía de programación de C#).
Instrucciones de nomenclatura de parámetros de tipo
Denomine los parámetros de tipo genérico con nombres descriptivos, a menos que un nombre de una sola letra sea
muy fácil de entender y un nombre descriptivo no agregue ningún valor.
C#
public interface ISessionChannel<TSession> { /*...*/ }
public delegate TOutput Converter<TInput, TOutput>(TInput from);
public class List<T> { /*...*/ }

Considere el uso de T como nombre del parámetro de tipo para los tipos con un parámetro de tipo de una sola letra.
C#
public int IComparer<T>() { return 0; }
public delegate bool Predicate<T>(T item);
public struct Nullable<T> where T : struct { /*...*/ }

Añada el prefijo "T" a los nombres de parámetros de tipo descriptivos.


C#
public interface ISessionChannel<TSession>
{
TSession Session { get; }
}

Considere indicar las restricciones de un parámetro de tipo en el nombre del parámetro. Por ejemplo, un parámetro
restringido a ISession se puede denominar TSession.
Vea también
Referencia
Diferencias entre plantillas de C++ y tipos genéricos de C# (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Guía de programación de C#

Restricciones de tipos de parámetros (Guía de programación de


C#)
Cuando se define una clase genérica, se pueden aplicar restricciones a las clases de tipos que el código de cliente puede usar
para argumentos de tipo cuando crea una instancia de la clase. Si el código de cliente intenta crear una instancia de la clase con
un tipo que no está permitido por una restricción, el resultado es un error de compilación. Estas limitaciones se llaman
restricciones. Las restricciones se especifican mediante el uso de la palabra clave contextual where. En la siguiente tabla se
muestran los seis tipos de restricción:
Restricción Descripción
where T: struct El argumento de tipo debe ser un tipo de valor. Se puede especificar cualquier tipo de valor excepto Nullable.
Vea Utilizar tipos que aceptan valores NULL (Guía de programación de C#) para obtener más información.

where T : class El argumento de tipo debe ser un tipo de referencia, entre los que se incluye cualquier clase, interfaz, delegad
o o tipo de matriz.

where T : new() El argumento de tipo debe tener un constructor público sin parámetros. Cuando se utiliza junto con otras res
tricciones, se debe especificar la restricción new() en último lugar.

where T : <nomb El argumento de tipo debe ser la clase base especificada, o bien debe derivarse de la misma.
re de clase base
>

where T: <nomb El argumento de tipo debe ser o implementar la interfaz especificada. Se pueden especificar varias restriccio
re de interfaz> nes de interfaz. La interfaz con restricciones también puede ser genérica.

where T : U El argumento de tipo proporcionado para T debe ser o derivarse del argumento proporcionado para U. Esto
se denomina una restricción de tipo naked.
Por qué utilizar restricciones
Si se desea examinar un elemento en una lista genérica para determinar si es válido o compararlo con otro elemento, el
compilador debe tener alguna garantía de que el operador o método que necesita llamar será compatible con cualquier
argumento de tipo que el código de cliente pudiera especificar. Esta garantía se obtiene al aplicar una o más restricciones a la
definición de clase genérica. Por ejemplo, la restricción de clase base le indica al compilador que sólo los objetos de este tipo o
derivados de éste se usarán como argumentos de tipo. Una vez que el compilador tiene esta garantía, puede permitir que se
llame a los métodos de ese tipo dentro de la clase genérica. Las restricciones se aplican mediante el uso de la palabra clave
contextual where. En el siguiente ejemplo de código se muestra la funcionalidad que se puede agregar a la clase
GenericList<T> (en Introducción a los genéricos (Guía de programación de C#)) mediante la aplicación de una restricción de
clase base.
C#
public class Employee
{
private string name;
private int id;

public Employee(string s, int i)


{
name = s;
id = i;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int ID
{
get { return id; }
set { id = value; }
}
}

public class GenericList<T> where T : Employee


{
private class Node
{
private Node next;
private T data;
public Node(T t)
{
next = null;
data = t;
}

public Node Next


{
get { return next; }
set { next = value; }
}

public T Data
{
get { return data; }
set { data = value; }
}
}

private Node head;

public GenericList() //constructor


{
head = null;
}

public void AddHead(T t)


{
Node n = new Node(t);
n.Next = head;
head = n;
}

public IEnumerator<T> GetEnumerator()


{
Node current = head;

while (current != null)


{
yield return current.Data;
current = current.Next;
}
}

public T FindFirstOccurrence(string s)
{
Node current = head;
T t = null;

while (current != null)


{
//The constraint enables access to the Name property.
if (current.Data.Name == s)
{
t = current.Data;
break;
}
else
{
current = current.Next;
}
}
return t;
}
}

La restricción habilita la clase genérica para utilizar la propiedad Employee.Name, ya que está garantizado que todos los
elementos de tipo T son un objeto Employee o un objeto que se hereda de Employee.
Se pueden aplicar varias restricciones al mismo parámetro de tipo y las propias restricciones pueden ser tipos genéricos, como
se ve a continuación:
C#
class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
// ...
}

Al restringir el parámetro de tipo, se aumenta el número de operaciones permitidas y el método llama a aquellas admitidas
por el tipo de restricción y todos los tipos de su jerarquía de herencia. Por lo tanto, al diseñar clases o métodos genéricos, si se
va a realizar cualquier operación en los miembros genéricos más allá de una simple asignación o se va a llamar a cualquier
método que no está admitido por System.Object, será necesario aplicar restricciones al parámetro de tipo.
Al aplicar la restricción where T : class, se recomienda no utilizar los operadores == y != en el parámetro de tipo, ya que
éstos comprobarán sólo la identidad de referencias, no la igualdad de valores. Esto es aplicable aunque estos operadores se
sobrecarguen en un tipo utilizado como argumento. El código siguiente ilustra este punto; el resultado es false aunque la clase
String sobrecargue el operador ==.
C#
public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "foo";
System.Text.StringBuilder sb = new System.Text.StringBuilder("foo");
string s2 = sb.ToString();
OpTest<string>(s1, s2);
}

La razón de este comportamiento es que, en tiempo de compilación, el compilador sabe que T es un tipo de referencia y que,
por lo tanto, debe usar los operadores predeterminados que son válidos para todos los tipos de referencia. Si necesita probar
la igualdad de valores, la forma recomendada es aplicar también la restricción where T : IComparable<T> e implementar esa
interfaz en cualquier clase que se vaya a utilizar para construir la clase genérica.
Parámetros de tipo sin delimitar
Los parámetros de tipo que no tienen restricciones, como T en la clase pública SampleClass<T>{}, se denominan parámetros
de tipo sin delimitar. Los parámetros de tipo sin delimitar tienen las siguientes reglas:
No se pueden utilizar los operadores != ni ==, porque no existe ninguna garantía de que el argumento de tipo concreto
admitirá estos operadores.
Pueden convertirse a o desde System.Object, o bien convertirse explícitamente en cualquier tipo de interfaz.
Se pueden comparar con null. Si un parámetro sin delimitar se compara con null, la comparación siempre devolverá
false si el argumento de tipo es un tipo de valor.
Restricciones de tipo naked
Cuando un parámetro de tipo genérico se utiliza como restricción, se denomina restricción de tipo naked. Las restricciones de
tipo naked son útiles cuando una función de miembro con su propio parámetro de tipo necesita restringir ese parámetro al
parámetro del tipo que lo contiene, como se muestra en el siguiente ejemplo:
C#
class List<T>
{
void Add<U>(List<U> items) where U : T {/*...*/}
}

En el ejemplo anterior, T es una restricción de tipo naked en el contexto del método Add y un parámetro de tipo sin delimitar
en el contexto de la clase List.
Las restricciones de tipo naked también se pueden utilizar en definiciones de clase genéricas. Observe que la restricción de tipo
naked también se debe declarar dentro de los corchetes angulares junto con cualquier otro parámetro de tipo:
C#
//naked type constraint
public class SampleClass<T, U, V> where T : V { }

La utilidad de las restricciones de tipo naked con clases genéricas es muy limitada, porque el compilador no puede suponer
nada acerca de la restricción de tipo naked excepto que se deriva de System.Object. Utilice las restricciones de tipo naked en
clases genéricas en escenarios en los que desea reforzar una relación de herencia entre dos parámetros de tipo.
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Restricción new (Referencia de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Guía de programación de C#

Clases genéricas (Guía de programación de C#)


Las clases genéricas encapsulan operaciones que no son específicas de un tipo de datos concreto. El uso más común de las
clases genéricas se da con las colecciones, como listas vinculadas, tablas hash, pilas, colas, árboles, etc., en las que las
operaciones tales como agregar y quitar elementos de la colección se realizan de forma similar independientemente del tipo
de datos que se almacena.
En la mayoría de los escenarios que necesitan clases de colección, el enfoque recomendado es utilizar las que proporciona la
biblioteca de clases de .NET Framework 2.0. Para obtener más información acerca del uso de estas clases, vea
Tipos genéricos en la biblioteca de clases de .NET Framework (Guía de programación de C#).
Normalmente, para crear clases genéricas se empieza a partir de una clase concreta existente y se cambian los tipos, uno a
uno, por parámetros de tipo hasta que se obtiene un equilibrio óptimo entre generalización y utilidad. Al crear sus propias
clases genéricas, se deben tener en cuenta las siguientes consideraciones importantes:
Tipos que se generalizan como parámetros de tipo.
Como regla general, cuantos más tipos se puedan parametrizar, más flexible y reutilizable será el código. Sin embargo,
un exceso de generalización puede producir código difícil de leer y comprender para otros programadores.
Restricciones, en su caso, que se aplicarán a los parámetros de tipo (Vea
Restricciones de tipos de parámetros (Guía de programación de C#)).
Una buena regla consiste en aplicar las restricciones máximas posibles que sigan permitiendo controlar los tipos que es
necesario controlar. Por ejemplo, si sabe que la clase genérica está exclusivamente destinada al uso con tipos de
referencia, aplique una restricción de clase. Esto evitará el uso imprevisto de la clase con tipos de valor y permitirá utilizar
el operador as en T y comprobar si hay valores nulos.
Factorizar o no el comportamiento genérico en las clases base y las subclases.
Dado que las clases genéricas pueden actuar como clases base, se aplican las mismas consideraciones de diseño que con
las clases no genéricas. Vea más adelante las reglas para la herencia de clases base genéricas.
Implementar o no una o varias interfaces genéricas.
Por ejemplo, si está diseñando una clase que se utilizará para crear elementos en una colección basada en genéricos,
puede que necesite implementar una interfaz como IComparable<T>, donde T es el tipo de la clase.
Para obtener un ejemplo de una clase genérica simple, vea Introducción a los genéricos (Guía de programación de C#)
Las reglas para los parámetros de tipo y las restricciones tienen varias implicaciones en el comportamiento de la clase
genérica, especialmente en lo relativo a la herencia y accesibilidad de los miembros. Antes de continuar, es importante
entender algunos términos. Para una clase genérica Node<T>, el código de cliente puede hacer referencia a la clase
especificando un argumento de tipo, para crear un tipo construido cerrado (Node<int>), o puede omitir la especificación del
parámetro de tipo, por ejemplo al especificar una clase base genérica, para crear un tipo construido abierto (Node<T>). Las
clases genéricas pueden heredar de clases base construidas cerradas o construidas abiertas:
C#
class BaseNode { }
class BaseNodeGeneric<T> { }
// concrete type
class NodeConcrete<T> : BaseNode { }
//closed constructed type
class NodeClosed<T> : BaseNodeGeneric<int> { }

//open constructed type


class NodeOpen<T> : BaseNodeGeneric<T> { }

Las clases no genéricas (concretas) pueden heredar de las clases base construidas cerradas, pero no de las clases construidas
abiertas ni de los parámetros de tipo 'naked', porque no hay ninguna forma de que el código de cliente pueda proporcionar el
tipo de argumento necesario para crear una instancia de la clase base en tiempo de ejecución.
C#
//No error
class Node1 : BaseNodeGeneric<int> { }

//Generates an error
//class Node2 : BaseNodeGeneric<T> {}

//Generates an error
//class Node3 : T {}

Las clases genéricas que heredan de tipos construidos abiertos deben proporcionar argumentos de tipo para cada parámetro
de tipo de clase base no compartidos con la clase que hereda, tal como se muestra en el código siguiente:
C#
class BaseNodeMultiple<T, U> { }

//No error
class Node4<T> : BaseNodeMultiple<T, int> { }

//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }

//Generates an error
//class Node6<T> : BaseNodeMultiple<T, U> {}

Las clases genéricas que heredan de tipos construidos abiertos deben especificar restricciones que impliquen o sean un
superconjunto de las restricciones sobre el tipo base:
C#
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

Los tipos genéricos pueden utilizar varios parámetros y restricciones de tipo, de la forma siguiente:
C#
class SuperKeyType<K, V, U>
where U : System.IComparable<U>
where V : new()
{ }

Los tipos construidos abiertos y construidos cerrados se pueden utilizar como parámetros de método:
C#
void Swap<T>(List<T> list1, List<T> list2)
{
//code to swap items
}

void Swap(List<int> list1, List<int> list2)


{
//code to swap items
}

Las clases genéricas son invariables. En otras palabras, si un parámetro de entrada especifica una List<BaseClass>, obtendrá
un error de compilación si intenta proporcionar una List<DerivedClass>.
Vea también
Referencia
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Guía de programación de C#

Interfaces genéricas (Guía de programación de C#)


A menudo es útil definir interfaces para las clases de colección genéricas o para las clases genéricas que representan los
elementos de la colección. Con las clases genéricas, es preferible utilizar interfaces genéricas, como IComparable<T> en lugar
de IComparable, para evitar las operaciones de conversión boxing y unboxing en los tipos de valor. La biblioteca de clases de
.NET Framework 2.0 define varias interfaces genéricas nuevas para utilizarlas con las nuevas clases de colección del espacio de
nombres System.Collections.Generic.
Cuando una interfaz se especifica como restricción en un parámetro de tipo, sólo se pueden utilizar los tipos que implementan
la interfaz. El ejemplo de código siguiente muestra una clase SortedList<T> derivada de la clase GenericList<T>. Para obtener
más información, vea Introducción a los genéricos (Guía de programación de C#). SortedList<T> agrega la restricción where T
: IComparable<T>. Esto permite al método BubbleSort de SortedList<T> utilizar el método CompareTo genérico con los
elementos de lista. En este ejemplo, los elementos de lista son una clase simple, Person, que implementa
IComparable<Person>.

C#
//Type parameter T in angle brackets.
public class GenericList<T> : System.Collections.Generic.IEnumerable<T>
{
protected Node head;
protected Node current = null;

// Nested class is also generic on T


protected class Node
{
public Node next;
private T data; //T as private member datatype

public Node(T t) //T used in non-generic constructor


{
next = null;
data = t;
}

public Node Next


{
get { return next; }
set { next = value; }
}

public T Data //T as return type of property


{
get { return data; }
set { data = value; }
}
}
public GenericList() //constructor
{
head = null;
}

public void AddHead(T t) //T as method parameter type


{
Node n = new Node(t);
n.Next = head;
head = n;
}
// Implementation of the iterator
public System.Collections.Generic.IEnumerator<T> GetEnumerator()
{
Node current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
// IEnumerable<T> inherits from IEnumerable, therefore this class
// must implement both the generic and non-generic versions of
// GetEnumerator. In most cases, the non-generic method can
// simply call the generic method.
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

public class SortedList<T> : GenericList<T> where T : System.IComparable<T>


{
// A simple, unoptimized sort algorithm that
// orders list elements from lowest to highest:

public void BubbleSort()


{
if (null == head || null == head.Next)
{
return;
}
bool swapped;
do
{
Node previous = null;
Node current = head;
swapped = false;

while (current.next != null)


{
// Because we need to call this method, the SortedList
// class is constrained on IEnumerable<T>
if (current.Data.CompareTo(current.next.Data) > 0)
{
Node tmp = current.next;
current.next = current.next.next;
tmp.next = current;
if (previous == null)
{
head = tmp;
}
else
{
previous.next = tmp;
}
previous = tmp;
swapped = true;
}
else
{
previous = current;
current = current.next;
}
}
} while (swapped);
}
}

// A simple class that implements IComparable<T> using itself as the


// type argument. This is a common design pattern in objects that
// are stored in generic lists.
public class Person : System.IComparable<Person>
{
string name;
int age;

public Person(string s, int i)


{
name = s;
age = i;
}

// This will cause list elements to be sorted on age values.


public int CompareTo(Person p)
{
return age - p.age;
}
public override string ToString()
{
return name + ":" + age;
}

// Must implement Equals.


public bool Equals(Person p)
{
return (this.age == p.age);
}
}

class Program
{
static void Main()
{
//Declare and instantiate a new generic SortedList class.
//Person is the type argument.
SortedList<Person> list = new SortedList<Person>();

//Create name and age values to initialize Person objects.


string[] names = new string[]
{
"Franscoise",
"Bill",
"Li",
"Sandra",
"Gunnar",
"Alok",
"Hiroyuki",
"Maria",
"Alessandro",
"Raul"
};

int[] ages = new int[] { 45, 19, 28, 23, 18, 9, 108, 72, 30, 35 };
//Populate the list.
for (int x = 0; x < 10; x++)
{
list.AddHead(new Person(names[x], ages[x]));
}

//Print out unsorted list.


foreach (Person p in list)
{
System.Console.WriteLine(p.ToString());
}
System.Console.WriteLine("Done with unsorted list");

//Sort the list.


list.BubbleSort();

//Print out sorted list.


foreach (Person p in list)
{
System.Console.WriteLine(p.ToString());
}
System.Console.WriteLine("Done with sorted list");
}
}

Se pueden especificar varias interfaces como restricciones en un solo tipo, de la siguiente manera:
C#
class Stack<T> where T : System.IComparable<T>, IEnumerable<T>
{
}

Una interfaz puede definir más de un parámetro de tipo, de la siguiente manera:


C#
interface IDictionary<K, V>
{
}

Se aplican las mismas reglas de herencia a las interfaces que a las clases:
C#
interface IMonth<T> { }

interface IJanuary : IMonth<int> { } //No error


interface IFebruary<T> : IMonth<int> { } //No error
interface IMarch<T> : IMonth<T> { } //No error
//interface IApril<T> : IMonth<T, U> {} //Error

Las interfaces genéricas pueden heredar de interfaces no genéricas si son contra-variantes, lo que significa que sólo utilizan su
parámetro de tipo como valor devuelto. En la biblioteca de clases de .NET Framework, IEnumerable<T> hereda de IEnumerable
porque IEnumerable<T> sólo utiliza T en el valor devuelto de GetEnumerator y en el receptor de la propiedad Current.
Las clases concretas pueden implementar interfaces construidas cerradas, de la siguiente manera:
C#
interface IBaseInterface<T> { }

class SampleClass : IBaseInterface<string> { }

Las clases genéricas pueden implementar interfaces genéricas o interfaces construidas cerradas siempre que la lista de
parámetros de la clase suministre todos los argumentos que necesita la interfaz, de la siguiente manera:
C#
interface IBaseInterface1<T> { }
interface IBaseInterface2<T, U> { }

class SampleClass1<T> : IBaseInterface1<T> { } //No error


class SampleClass2<T> : IBaseInterface2<T, string> { } //No error
Las reglas que controlan la sobrecarga de métodos son las mismas para los métodos de las clases genéricas, las estructuras
genéricas y las interfaces genéricas. Para obtener más información, vea Métodos genéricos (Guía de programación de C#).
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
interfaz
Conceptos
Guía de programación de C#
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Métodos genéricos (Guía de programación de C#)


Un método genérico es un método que se declara con parámetros de tipo, como se muestra a continuación:
C#
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}

El siguiente ejemplo de código muestra una manera de llamar al método, utilizando int para el argumento de tipo:
C#
public static void TestSwap()
{
int a = 1;
int b = 2;

Swap<int>(ref a, ref b);


System.Console.WriteLine(a + " " + b);
}

También puede omitir el argumento de tipo y el compilador lo inferirá. La siguiente llamada a Swap es equivalente a la
llamada anterior:
C#
Swap(ref a, ref b);

Las mismas reglas para la inferencia de tipo se aplican a los métodos estáticos, como también a los métodos de instancia. El
compilador es capaz de inferir los parámetros de tipo basados en los argumentos de método que se traspasan; no es posible
inferir los parámetros de tipo únicamente a partir de una restricción o un valor devuelto. Por consiguiente, la inferencia de tipo
no funciona con métodos que no tienen parámetros. La inferencia de tipo tiene lugar en el tiempo de compilación antes de que
el compilador intente resolver cualquier firma de método sobrecargado. El compilador aplica la lógica de inferencia de tipo a
todos los métodos genéricos que comparten el mismo nombre. En el paso de resolución de sobrecarga, el compilador incluye
sólo aquellos métodos genéricos en los cuales la inferencia se realizó correctamente.
Dentro de una clase genérica, los métodos no genéricos pueden tener acceso a los parámetros de tipo de nivel de clase, como
sigue a continuación:
C#
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}

Si define un método genérico que acepta los mismos parámetros de tipo que la clase contenedora, el compilador generará la
advertencia CS0693 porque dentro del ámbito del método, el argumento suministrado para la T interior ocultará el argumento
suministrado para la T exterior. Si se requiere la flexibilidad de llamar a un método de clase genérica con argumentos de tipo
diferentes a los proporcionados cuando la clase fue creada con instancias, considere proporcionar otro identificador para los
parámetros de tipo de método, como se muestra en GenericList2<T> en el siguiente ejemplo.
C#
class GenericList<T>
{
// CS0693
void SampleMethod<T>() { }
}
class GenericList2<T>
{
//No warning
void SampleMethod<U>() { }
}

Utilice las restricciones para habilitar las operaciones más especializadas en parámetros de tipo en métodos. Esta versión de
Swap<T>, ahora denominada SwapIfGreater<T>, sólo se puede utilizar con argumentos de tipo que implementan
IComparable<T>.

C#
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}

Los métodos genéricos se pueden sobrecargar en varios parámetros de tipo. Por ejemplo, los siguientes métodos pueden
existir en la misma clase:
C#
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
20.6.4 Inferencia de argumentos de tipo
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Métodos (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Guía de programación de C#

Genéricos y matrices (Guía de programación de C#)


En C# 2.0, las matrices unidimensionales que tienen un límite inferior de cero implementan automáticamente IList<T>. Esto
permite crear métodos genéricos que pueden utilizar el mismo código para recorrer en iteración matrices y otros tipos de
colecciones. Esta técnica resulta útil principalmente para leer datos de colecciones. La interfaz IList<T> no se puede utilizar
para agregar o quitar elementos de una matriz; se producirá una excepción si intenta llamar a un método IList<T> como
RemoveAt en una matriz en este contexto.
El siguiente ejemplo de código muestra la forma en que un solo método genérico que toma un parámetro de entrada IList<T>
puede recorrer en iteración tanto una lista como una matriz; en este caso, una matriz de enteros.
C#
class Program
{
static void Main()
{
int[] arr = { 0, 1, 2, 3, 4 };
List<int> list = new List<int>();

for (int x = 5; x < 10; x++)


{
list.Add(x);
}

ProcessItems<int>(arr);
ProcessItems<int>(list);
}

static void ProcessItems<T>(IList<T> coll)


{
foreach (T item in coll)
{
System.Console.Write(item.ToString() + " ");
}
System.Console.WriteLine();
}
}

Nota
Aunque el método ProcessItems no puede agregar ni quitar elementos, la propiedad IsReadOnly devuelve el valor falso par
a un T[] dentro de ProcessItems porque la propia matriz no se declaró con el atributo ReadOnly.

Vea también
Referencia
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Matrices (Guía de programación de C#)
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Delegados genéricos (Guía de programación de C#)


Un delegado puede definir sus propios parámetros de tipo. El código que hace referencia al delegado genérico puede
especificar el tipo de argumento para crear un tipo construido abierto, igual que al crear una instancia de una clase genérica o
al llamar a un método genérico, como se muestra en el siguiente ejemplo:
C#
public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);

C# 2.0 tiene una nueva función denominada conversión de grupo de métodos, que se aplica a los tipos delegados concretos y
genéricos, y permite escribir la línea anterior con esta sintaxis simplificada:
C#
Del<int> m2 = Notify;

Los delegados definidos dentro de una clase genérica pueden utilizar los parámetros de tipo de la clase genérica de la misma
manera que lo hacen los métodos de clase.
C#
class Stack<T>
{
T[] items;
int index;

public delegate void StackDelegate(T[] items);


}

El código que hace referencia al delegado debe especificar el argumento de tipo de la clase contenedora, de la siguiente
manera:
C#
private static void DoWork(float[] items) { }

public static void TestStack()


{
Stack<float> s = new Stack<float>();
Stack<float>.StackDelegate d = DoWork;
}

Los delegados genéricos son especialmente útiles para definir eventos basados en el patrón de diseño habitual porque el
argumento del remitente puede tener establecimiento inflexible de tipos y ya no tiene que convertirse a y de Object.
C#
delegate void StackEventHandler<T, U>(T sender, U eventArgs);

class Stack<T>
{
public class StackEventArgs : System.EventArgs { }
public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent;
protected virtual void OnStackChanged(StackEventArgs a)
{
stackEvent(this, a);
}
}

class SampleClass
{
public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { }
}

public static void Test()


{
Stack<double> s = new Stack<double>();
SampleClass o = new SampleClass();
s.stackEvent += o.HandleStackChange;
}

Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Métodos genéricos (Guía de programación de C#)
Clases genéricas (Guía de programación de C#)
Interfaces genéricas (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Palabra clave predeterminada en código genérico (Guía de


programación de C#)
Un problema asociado a las clases y métodos genéricos es la forma de asignar un valor predeterminado a un tipo
parametrizado T cuando no se tiene por anticipado la siguiente información:
Si T será un tipo de referencia o un tipo de valor.
Si T es un tipo de valor, si será un valor numérico o una estructura.
Dada una variable t de un tipo parametrizado T, la instrucción t = null sólo es válida si T es un tipo de referencia y t = 0 sólo
funcionará con los tipos de valor numérico, pero no con las estructuras. La solución es utilizar la palabra clave default, que
devolverá null para los tipos de referencia y cero para los tipos de valor numérico. En el caso de las estructuras, devolverá cada
miembro de la estructura inicializado con el valor cero o null, dependiendo de si son tipos de valor o de referencia. El ejemplo
siguiente de las clases GenericList<T> muestra cómo utilizar la palabra clave default. Para obtener más información, vea
Información general sobre los genéricos (Guía de programación de C#).
C#
public class GenericList<T>
{
private class Node
{
//...

public Node Next;


public T Data;
}

private Node head;

//...

public T GetNext()
{
T temp = default(T);

Node current = head;


if (current != null)
{
temp = current.Data;
current = current.Next;
}
return temp;
}
}

Vea también
Referencia
Métodos genéricos (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Diferencias entre plantillas de C++ y tipos genéricos de C#


(Guía de programación de C#)
Los tipos genéricos de C# y las plantillas de C++ son ambas características de lenguaje que proporcionan compatibilidad con
los tipos parametrizados. Sin embargo, hay muchas diferencias entre ellas. En el aspecto sintáctico, los tipos genéricos de C#
son un enfoque más simple de los tipos parametrizados sin la complejidad de las plantillas de C++. Además, C# no intenta
proporcionar toda la funcionalidad que brindan las plantillas de C++. En lo que a la implementación se refiere, la diferencia
principal es que las sustituciones de tipo genérico de C# se realizan en tiempo de ejecución y la información de tipo genérico
se conserva en los objetos de los que se han creado instancias. Para obtener más información, vea
Genéricos en el motor en tiempo de ejecución (Guía de programación de C#).
A continuación se exponen las diferencias clave entre los tipos genéricos de C# y las plantillas de C++:
Los tipos genéricos de C# no proporcionan la misma cantidad de flexibilidad que las plantillas de C++. Por ejemplo, no
es posible llamar a los operadores aritméticos de una clase genérica de C#, aunque es posible llamar a los operadores
definidos por el usuario.
C# no permite parámetros de plantilla sin tipo, como template C<int i> {}.

C# no admite la especialización explícita; es decir, una implementación personalizada de una plantilla para un tipo
específico.
C# no admite la especialización parcial: una implementación personalizada para un subconjunto de argumentos de tipo.
C# no permite el uso del parámetro de tipo como clase base para el tipo genérico.
C# no permite que los parámetros de tipo tengan tipos predeterminados.
En C#, un parámetro de tipo genérico no puede ser genérico en sí mismo, aunque los tipos construidos se pueden utilizar
como genéricos. C++ permite los parámetros de plantilla.
C++ permite código que podría no ser válido para todos los parámetros de tipo de la plantilla, en la cual se busca el tipo
específico utilizado como parámetro de tipo. C# requiere que el código de una clase se escriba de tal forma que funcione
con cualquier tipo que cumpla con las restricciones. Por ejemplo, en C++ es posible escribir una función que usa los
operadores aritméticos + y - en objetos del parámetro de tipo, lo cual producirá un error en el momento de crear una
instancia de la plantilla con un tipo que no admita esos operadores. C# no permite esto; las únicas construcciones de
lenguaje permitidas son aquéllas que se pueden deducir de las restricciones.
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Templates
Guía de programación de C#

Genéricos en el motor en tiempo de ejecución (Guía de


programación de C#)
Cuando se compila un tipo o método genérico en el lenguaje intermedio de Microsoft (MSIL), contiene metadatos que lo
identifican como poseedor de parámetros de tipo. La forma en que se utiliza MSIL para un tipo genérico depende de si el
parámetro de tipo proporcionado es un tipo de valor o de referencia.
Cuando se construye por primera vez un tipo genérico con un tipo de valor como parámetro, el motor en tiempo de ejecución
crea un tipo genérico especializado sustituyendo el o los parámetros proporcionados en los lugares adecuados del MSIL. Los
tipos genéricos especializados se crean una vez para cada tipo de valor único utilizado como parámetro.
Por ejemplo, suponga que el código de su programa declaró una pila compuesta por enteros, como en el siguiente ejemplo:
C#
Stack<int> stack;

En este momento, el motor de ejecución genera una versión especializada de la clase Stack<T> sustituyendo el entero
adecuadamente para su parámetro. Ahora, cada vez que el código de su programa utilice una pila de enteros, el motor en
tiempo de ejecución reutilizará la clase especializada generada Stack<T>. En el ejemplo siguiente, se crean dos instancias de
una pila de enteros y comparten una instancia única del código Stack<int>:
C#
Stack<int> stackOne = new Stack<int>();
Stack<int> stackTwo = new Stack<int>();

No obstante, si en otro punto del código del programa se crea otra clase Stack<T>, esta vez con un tipo de valor distinto
como long o una estructura definida por el usuario como su parámetro, el motor en tiempo de ejecución genera otra versión
del tipo genérico, sustituyendo esta vez un long en las posiciones adecuadas en MSIL. Las conversiones ya no son necesarias
porque cada clase genérica especializada contiene de forma nativa el tipo de valor.
Los genéricos funcionan de forma ligeramente distinta para los tipos de referencia. Cuando se construye un tipo genérico por
primera vez con un tipo de referencia, el motor en tiempo de ejecución crea un tipo genérico especializado sustituyendo las
referencias a objetos para los parámetros del MSIL. A continuación, cada vez que se crea una instancia de un tipo construido
con un tipo de referencia como parámetro, independientemente del tipo que sea, el motor en tiempo de ejecución reutiliza la
versión especializada del tipo genérico previamente creada. Esto es posible porque todas las referencias son del mismo
tamaño.
Por ejemplo, suponga que tiene dos tipos de referencia, una clase Customer y una clase Order, y que creó una pila de tipos
Customer:

C#
class Customer { }
class Order { }

C#
Stack<Customer> customers;

En este punto, el motor en tiempo de ejecución genera una versión especializada de la clase Stack<T> que, en lugar de
almacenar los datos, almacena referencias a objetos que se rellenarán más tarde. Suponga que la línea siguiente de código
crea una pila de otro tipo de referencia, llamado Order:
C#
Stack<Order> orders = new Stack<Order>();
A diferencia de lo que sucede con los tipos de valor, no se crea otra versión especializada de la clase Stack<T> para el tipo
Order. Más bien, se crea una instancia de la versión especializada de la clase Stack<T> y se establece la variable orders para
hacer referencia a ella. Suponga que encuentra una línea de código para crear una pila de tipo Customer:
C#
customers = new Stack<Customer>();

Al igual que en el uso anterior de la clase Stack<T> creada con el tipo Order, se crea otra instancia de la clase especializada
Stack<T>, y los punteros que ésta contiene se establecen para hacer referencia a un área de memoria del tamaño de un tipo
Customer. Dado que el número de tipos de referencia puede variar significativamente de un programa a otro, la
implementación de genéricos de C@ reduce significativamente el tamaño del código limitando a uno el número de clases
especializadas creadas por el compilador para las clases genéricas de tipos de referencia.
Además, cuando se crea una instancia de una clase de C# genérica con un parámetro de tipo, ya sea un tipo de valor o de
referencia, se puede consultar en tiempo de ejecución mediante reflexión, y se puede comprobar su tipo real como el tipo de
su parámetro.
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Tipos genéricos en la biblioteca de clases de .NET Framework


(Guía de programación de C#)
La versión 2.0 de la biblioteca de clases de .NET Framework proporciona un nuevo espacio de nombres,
System.Collections.Generic, que incluye varias clases de colección genéricas listas para utilizarse y las interfaces asociadas.
Otros espacios de nombres como System también proporcionan nuevas interfaces genéricas como IComparable<T>. Estas
clases e interfaces son más eficaces y con mayor seguridad de tipos que las clases de colección no genéricas incluidas en
versiones anteriores de .NET Framework. Antes de diseñar e implementar sus propias clases de colección personalizadas,
recuerde que puede utilizar o derivar una clase de una de las clases incluidas en la biblioteca de clases base.
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Cuándo utilizar colecciones genéricas
Otros recursos
Colecciones y estructuras de datos
Guía de programación de C#

Genéricos y reflexión (Guía de programación de C#)


Debido a que el Common Language Runtime (CLR) tiene acceso a información de tipo genérico en tiempo de ejecución, es
posible usar la reflexión para obtener información sobre tipos genéricos de la misma forma que para tipos no genéricos. Para
obtener más información, vea Genéricos en el motor en tiempo de ejecución (Guía de programación de C#).
En .NET Framework 2.0, se agregan varios miembros nuevos a la clase Type para habilitar la información en tiempo de
ejecución para los tipos genéricos. Consulte la documentación existente sobre estas clases para obtener más información
sobre cómo utilizar estos métodos y propiedades. El espacio de nombres System.Reflection.Emit también contiene algunos
miembros nuevos que admiten genéricos. Vea Cómo: Definir un tipo genérico con Reflection Emit.
Para obtener una lista de las condiciones invariables utilizadas en la reflexión genérica, vea los comentarios de la propiedad
IsGenericType.
Nombre de miembro System. Descripción
Type
IsGenericType Devuelve true si un tipo es genérico.

GetGenericArguments Devuelve una matriz de objetos Type que representan los argumentos de tipo suministrado
s para un tipo construido o los parámetros de tipo de una definición de tipo genérico.

GetGenericTypeDefinition Devuelve la definición de tipo genérico subyacente para el tipo construido actual.

GetGenericParameterConstraints Devuelve una matriz de objetos Type que representan las restricciones en el parámetro de ti
po genérico actual.

ContainsGenericParameters Devuelve true si el tipo o cualquiera de los tipos o métodos que incluye contiene parámetros
de tipo para los que no se han proporcionado tipos específicos.

GenericParameterAttributes Obtiene una combinación de indicadores GenericParameterAttributes que describen las r


estricciones especiales del parámetro de tipo genérico actual.

GenericParameterPosition En un objeto Type que representa un parámetro de tipo, obtiene la posición de éste en la list
a de parámetros de tipo de la definición de tipo genérico o la definición de método genérico
que declaró el parámetro de tipo.

IsGenericParameter Obtiene un valor que indica si el objeto Type actual representa un parámetro de tipo de un ti
po genérico o de una definición de método.

IsGenericTypeDefinition Obtiene un valor que indica si el Type actual representa una definición de tipo genérico, a pa
rtir de la cual se pueden construir otros tipos genéricos. Devuelve true si el tipo representa la
definición de un tipo genérico.

DeclaringMethod Devuelve el método genérico que definió el parámetro de tipo genérico actual o null si un m
étodo genérico no define el parámetro de tipo.

MakeGenericType Sustituye los elementos de una matriz de tipos por los parámetros de tipo de la definición de
tipo genérico actual y devuelve un objeto Type que representa el tipo construido resultante.

Además, se agregan miembros nuevos a la clase MethodInfo para habilitar la información en tiempo de ejecución para los
métodos genéricos. Vea los comentarios de la propiedad IsGenericMethod para obtener una lista de condiciones invariables
que se utilizan para reflejarlas en métodos genéricos.
Nombre de miembro Syst Descripción
em.Reflection.MemberInf
o
IsGenericMethod Devuelve true si un método es genérico.

GetGenericArguments Devuelve una matriz de objetos Type que representan los argumentos de tipo de un método gen
érico construido o los parámetros de tipo de una definición de método genérico.
GetGenericMethodDefinition Devuelve la definición de método genérico subyacente para el método construido actual.

ContainsGenericParameters Devuelve true si el método o cualquiera de los tipos que incluye contiene cualquier parámetro de
tipo para el que no se han proporcionado tipos específicos.

IsGenericMethodDefinition Devuelve true si el objeto MethodInfo actual representa la definición de un método genérico.

MakeGenericMethod Sustituye los elementos de una matriz de tipos por los parámetros de tipo de la definición de mé
todo genérico actual y devuelve un objeto MethodInfo que representa el método construido res
ultante.
Vea también
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Información general sobre la reflexión y los genéricos
Otros recursos
Genéricos en .NET Framework
Guía de programación de C#

Genéricos y atributos (Guía de programación de C#)


Los atributos se pueden aplicar a los tipos genéricos de la misma manera que a los tipos no genéricos. Para obtener más
información sobre la aplicación de atributos, vea Atributos (Guía de programación de C#).
Los atributos personalizados sólo pueden hacer referencia a tipos genéricos abiertos, es decir, tipos genéricos en los que no se
indican argumentos de tipo, y tipos genéricos construidos cerrados, que proporcionan argumentos para todos los parámetros
del tipo.
En los ejemplos siguientes se utiliza este atributo personalizado:
C#
class CustomAttribute : System.Attribute
{
public System.Object info;
}

Un atributo puede hacer referencia a un tipo genérico abierto:


C#
public class GenericClass1<T> { }

[CustomAttribute(info = typeof(GenericClass1<>))]
class ClassA { }

Especifique varios parámetros de tipo mediante el número adecuado de comas. En este ejemplo, GenericClass2 tiene dos
parámetros de tipo:
C#
public class GenericClass2<T, U> { }

[CustomAttribute(info = typeof(GenericClass2<,>))]
class ClassB { }

Un atributo puede hacer referencia a un tipo genérico construido cerrado:


C#
public class GenericClass3<T, U, V> { }
[CustomAttribute(info = typeof(GenericClass3<int, double, string>))]
class ClassC { }

Un atributo que hace referencia a un parámetro de tipo genérico producirá un error de compilación:
C#
//[CustomAttribute(info = typeof(GenericClass3<int, T, string>))] //Error
class ClassD<T> { }

Un tipo genérico no puede heredar de Attribute:


C#
//public class CustomAtt<T> : System.Attribute {} //Error
Para obtener información sobre un tipo genérico o parámetro de tipo en tiempo de ejecución, puede utilizar los métodos de
System.Reflection. Para obtener más información, vea Genéricos y reflexión (Guía de programación de C#)
Vea también
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Información general sobre atributos
Guía de programación de C#

Varianza en los tipos genéricos (Guía de programación de C#)


Una de las principales ventajas de agregar genéricos a C# es la posibilidad de crear fácilmente colecciones con establecimiento
inflexible de tipos utilizando los tipos del espacio de nombres System.Collections.Generic. Por ejemplo, se puede crear una
variable de tipo List<int>; el compilador comprobará todos los accesos a la variable y garantizará que sólo se agreguen
valores ints a la colección. Ésta es una mejora de gran utilidad sobre las colecciones sin tipo disponibles en la versión 1.0 de
C#.
Desgraciadamente, las colecciones con establecimiento inflexible de tipos tienen sus propios inconvenientes. Por ejemplo,
suponga que tiene un objeto List<object> con establecimiento inflexible de tipos y desea anexar todos los elementos de
List<int> a List<object>. Sería conveniente poder escribir el código de la forma siguiente:
C#
List<int> ints = new List<int>();
ints.Add(1);
ints.Add(10);
ints.Add(42);
List<object> objects = new List<object>();

// doesnt compile ints is not a IEnumerable<object>


//objects.AddRange(ints);

En este caso, podría tratar un objeto List<int> qué también es IEnumerable<int>, como IEnumerable<object>. Parece
razonable hacer esto, ya que int se puede convertir en un objeto. Es muy similar a poder tratar una cadena[] como objeto[] tal
como se puede hacer actualmente. Si se encuentra en esta situación, la característica que busca se llama varianza de genéricos.
Esta característica trata una creación de instancias de un tipo genérico, en este caso IEnumerable<int>, como una creación de
instancias diferente del mismo tipo, en este caso IEnumerable<object>.
C# no admite la varianza de tipos genéricos; por tanto, cuando encuentre situaciones como ésta, tendrá que probar una de las
técnicas que se pueden utilizar para evitar el problema. En los casos más simples, como el de un único método denominado
AddRange en el ejemplo anterior, puede declarar un método auxiliar sencillo que realice la conversión automáticamente. Por
ejemplo, podría escribir este método:
C#
// Simple workaround for single method
// Variance in one direction only
public static void Add<S, D>(List<S> source, List<D> destination)
where S : D
{
foreach (S sourceElement in source)
{
destination.Add(sourceElement);
}
}

Que le permite hacer esto:


C#
// does compile
VarianceWorkaround.Add<int, object>(ints, objects);

Este ejemplo muestra algunas características de una solución de varianza sencilla. El método auxiliar toma dos parámetros de
tipo, para el origen y el destino, y el parámetro de tipo de origen S tiene una restricción que es el parámetro de tipo de destino
D. Esto significa que el objeto List<> del que se lee debe contener elementos que sean convertibles al tipo de elementos del
objeto List<> en el que se inserta. Esto permite al compilador forzar la conversión de int en un objeto. La restricción de un
parámetro de tipo para derivar de otro parámetro de tipo se denomina restricción de parámetro de tipo naked.
Definir un método único para evitar los problemas de varianza no está mal del todo. Desafortunadamente, los problemas de
varianza se pueden volver bastante complejos con rapidez. El nivel siguiente de complejidad es cuando se desea tratar una
interfaz de una creación de instancias como una interfaz de otra creación de instancias. Por ejemplo, tiene IEnumerable<int> y
desea pasarlo a un método que sólo toma IEnumerable<object>. Esto también tiene sentido, porque IEnumerable<object> se
puede considerar una secuencia de objetos e IEnumerable<int> es una secuencia de ints. Puesto que los valores ints son
objetos, debería ser posible tratar una secuencia de ints como una secuencia de objetos. Por ejemplo:
C#
static void PrintObjects(IEnumerable<object> objects)
{
foreach (object o in objects)
{
Console.WriteLine(o);
}
}

Que sería conveniente llamar de esta forma:


C#
// would like to do this, but cant ...
// ... ints is not an IEnumerable<object>
//PrintObjects(ints);

La solución para la interfaz case es crear un objeto contenedor que hace las conversiones de cada miembro de la interfaz. Esto
tendría una apariencia similar a lo siguiente:
C#
// Workaround for interface
// Variance in one direction only so type expressinos are natural
public static IEnumerable<D> Convert<S, D>(IEnumerable<S> source)
where S : D
{
return new EnumerableWrapper<S, D>(source);
}

private class EnumerableWrapper<S, D> : IEnumerable<D>


where S : D
{

Que le permite hacer esto:


C#
PrintObjects(VarianceWorkaround.Convert<int, object>(ints));

De nuevo, observe la restricción de parámetro de tipo naked en la clase contenedora y el método auxiliar. Esta metodología
resulta bastante complicada pero el código de la clase contenedora es bastante sencillo; simplemente se delega en los
miembros de la interfaz contenedora, que no hace nada más que conversiones de tipo directas a medida que surgen. ¿Por qué
no hacer que el compilador permita directamente la conversión de IEnumerable<int> a IEnumerable<object>?
Aunque la varianza tiene seguridad de tipos en el caso de que se busquen vistas de sólo lectura de las colecciones, no la tiene
en el caso de que se realicen operaciones de lectura y escritura. Por ejemplo, la interfaz IList<> no se podría tratar de esta
manera automática. Sigue teniendo la opción de escribir un método auxiliar que ajuste todas las operaciones de lectura de
IList<> con seguridad de tipos, pero ajustar las operaciones de escritura no es tan sencillo.
Lo siguiente es una parte de un contenedor para tratar la varianza en la interfaz IList<T> que muestra los problemas que
surgen con la varianza en la lectura y la escritura:
C#
private class ListWrapper<S, D> : CollectionWrapper<S, D>, IList<D>
where S : D
{
public ListWrapper(IList<S> source) : base(source)
{
this.source = source;
}

public int IndexOf(D item)


{
if (item is S)
{
return this.source.IndexOf((S) item);
}
else
{
return -1;
}
}

// variance the wrong way ...


// ... can throw exceptions at runtime
public void Insert(int index, D item)
{
if (item is S)
{
this.source.Insert(index, (S)item);
}
else
{
throw new Exception("Invalid type exception");
}
}

El método Insert del contenedor tiene un problema. Toma como argumento D, pero debe insertarla en IList<S>. Como D es un
tipo base de S, no todo D es S, por lo que se puede producir un error en la operación de inserción. Este ejemplo tiene un
análogo con varianza en matrices. Cuando se inserta un objeto en un objeto[], se realiza una comprobación de tipo dinámico
porque el objeto[], de hecho, puede ser una cadena[] en tiempo de ejecución. Por ejemplo:
C#
object[] objects = new string[10];

// no problem, adding a string to a string[]


objects[0] = "hello";

// runtime exception, adding an object to a string[]


objects[1] = new object();

En el ejemplo IList<>, el contenedor del método Insert puede producir simplemente una excepción cuando el tipo actual no
coincide con el tipo deseado en tiempo de ejecución. También en este caso se podía imaginar que el compilador generaría
automáticamente el contenedor para el programador. Sin embargo, hay situaciones en las que esta directiva no es la solución
correcta. El método IndexOf busca el elemento proporcionado en la colección y devuelve el índice de la colección si se
encuentra el elemento. Sin embargo, si no se encuentra el elemento, el método IndexOf simplemente devuelve -1, no produce
una excepción. Un contenedor generado automáticamente no puede proporcionar este tipo de ajuste.
Hasta ahora, se han descrito la dos formas más sencillas de evitar los problemas de varianza de genéricos. Sin embargo, los
problemas de varianza pueden volverse arbitrariamente complejos. Por ejemplo, cuando List<IEnumerable<int>> se trata
como List<IEnumerable<object>> o List<IEnumerable<IEnumerable<int>>> se trata como
List<IEnumerable<IEnumerable<object>>>.
La generación de estos contenedores para evitar los problemas de varianza en el código puede producir una sobrecarga
significativa en el código. Además, puede producir problemas de identidad de referencia, ya que los contenedores no tienen la
misma identidad que la colección original, lo que puede llevar a errores imperceptibles. Al utilizar los genéricos, se debe elegir
la creación de instancias de tipo para reducir las desigualdades entre componentes que se corresponden estrictamente. Esto
puede requerir algunos compromisos en el diseño del código. Como siempre, el diseño implica contrapartidas entre requisitos
que entran en conflicto y se deben tener en cuenta las restricciones del sistema de tipos del lenguaje en el proceso de diseño.
Hay sistemas de tipos que incluyen la varianza de genéricos como una primera parte de clase del lenguaje. Eiffel es un ejemplo
idóneo de esto. Sin embargo, incluir la varianza de genéricos como primera parte de clase del sistema de tipos aumentaría
significativamente la complejidad del sistema de tipos de C#, incluso en escenarios relativamente sencillos en los que no se
utilice varianza. Como resultado, los diseñadores de C# pensaron que no incluir la varianza era la opción correcta para C#.
A continuación se muestra el código fuente completo de los ejemplos anteriores.
C#
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

static class VarianceWorkaround


{
// Simple workaround for single method
// Variance in one direction only
public static void Add<S, D>(List<S> source, List<D> destination)
where S : D
{
foreach (S sourceElement in source)
{
destination.Add(sourceElement);
}
}

// Workaround for interface


// Variance in one direction only so type expressinos are natural
public static IEnumerable<D> Convert<S, D>(IEnumerable<S> source)
where S : D
{
return new EnumerableWrapper<S, D>(source);
}

private class EnumerableWrapper<S, D> : IEnumerable<D>


where S : D
{
public EnumerableWrapper(IEnumerable<S> source)
{
this.source = source;
}

public IEnumerator<D> GetEnumerator()


{
return new EnumeratorWrapper(this.source.GetEnumerator());
}

IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}

private class EnumeratorWrapper : IEnumerator<D>


{
public EnumeratorWrapper(IEnumerator<S> source)
{
this.source = source;
}

private IEnumerator<S> source;

public D Current
{
get { return this.source.Current; }
}
public void Dispose()
{
this.source.Dispose();
}

object IEnumerator.Current
{
get { return this.source.Current; }
}

public bool MoveNext()


{
return this.source.MoveNext();
}

public void Reset()


{
this.source.Reset();
}
}

private IEnumerable<S> source;


}

// Workaround for interface


// Variance in both directions, causes issues
// similar to existing array variance
public static ICollection<D> Convert<S, D>(ICollection<S> source)
where S : D
{
return new CollectionWrapper<S, D>(source);
}

private class CollectionWrapper<S, D>


: EnumerableWrapper<S, D>, ICollection<D>
where S : D
{
public CollectionWrapper(ICollection<S> source)
: base(source)
{
}

// variance going the wrong way ...


// ... can yield exceptions at runtime
public void Add(D item)
{
if (item is S)
{
this.source.Add((S)item);
}
else
{
throw new Exception(@"Type mismatch exception, due to type hole introduced
by variance.");
}
}

public void Clear()


{
this.source.Clear();
}

// variance going the wrong way ...


// ... but the semantics of the method yields reasonable semantics
public bool Contains(D item)
{
if (item is S)
{
return this.source.Contains((S)item);
}
else
{
return false;
}
}

// variance going the right way ...


public void CopyTo(D[] array, int arrayIndex)
{
foreach (S src in this.source)
{
array[arrayIndex++] = src;
}
}

public int Count


{
get { return this.source.Count; }
}

public bool IsReadOnly


{
get { return this.source.IsReadOnly; }
}

// variance going the wrong way ...


// ... but the semantics of the method yields reasonable semantics
public bool Remove(D item)
{
if (item is S)
{
return this.source.Remove((S)item);
}
else
{
return false;
}
}

private ICollection<S> source;


}

// Workaround for interface


// Variance in both directions, causes issues similar to existing array variance
public static IList<D> Convert<S, D>(IList<S> source)
where S : D
{
return new ListWrapper<S, D>(source);
}

private class ListWrapper<S, D> : CollectionWrapper<S, D>, IList<D>


where S : D
{
public ListWrapper(IList<S> source) : base(source)
{
this.source = source;
}

public int IndexOf(D item)


{
if (item is S)
{
return this.source.IndexOf((S) item);
}
else
{
return -1;
}
}

// variance the wrong way ...


// ... can throw exceptions at runtime
public void Insert(int index, D item)
{
if (item is S)
{
this.source.Insert(index, (S)item);
}
else
{
throw new Exception("Invalid type exception");
}
}

public void RemoveAt(int index)


{
this.source.RemoveAt(index);
}

public D this[int index]


{
get
{
return this.source[index];
}
set
{
if (value is S)
this.source[index] = (S)value;
else
throw new Exception("Invalid type exception.");
}
}

private IList<S> source;


}
}

namespace GenericVariance
{
class Program
{
static void PrintObjects(IEnumerable<object> objects)
{
foreach (object o in objects)
{
Console.WriteLine(o);
}
}

static void AddToObjects(IList<object> objects)


{
// this will fail if the collection provided is a wrapped collection
objects.Add(new object());
}
static void Main(string[] args)
{
List<int> ints = new List<int>();
ints.Add(1);
ints.Add(10);
ints.Add(42);
List<object> objects = new List<object>();
// doesnt compile ints is not a IEnumerable<object>
//objects.AddRange(ints);

// does compile
VarianceWorkaround.Add<int, object>(ints, objects);

// would like to do this, but cant ...


// ... ints is not an IEnumerable<object>
//PrintObjects(ints);
PrintObjects(VarianceWorkaround.Convert<int, object>(ints));

AddToObjects(objects); // this works fine


AddToObjects(VarianceWorkaround.Convert<int, object>(ints));
}
static void ArrayExample()
{
object[] objects = new string[10];

// no problem, adding a string to a string[]


objects[0] = "hello";

// runtime exception, adding an object to a string[]


objects[1] = new object();
}
}
}

Vea también
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Guía de programación de C#

Iteradores (Guía de programación de C#)


Los iteradores son una nueva característica en C# 2.0. Un iterador es un método, descriptor de acceso get u operador que
proporciona compatibilidad con una iteración foreach en una clase o estructura sin tener que implementar toda la interfaz
IEnumerable. En su lugar, se proporciona sólo un iterador, que simplemente recorre las estructuras de datos de la clase.
Cuando el compilador detecte el iterador, generará automáticamente los métodos Current, MoveNext y Dispose de la interfaz
IEnumerable o IEnumerable<T>.
Información general sobre los iteradores
Un iterador es una sección de código que devuelve una secuencia ordenada de valores del mismo tipo.
Un iterador se puede utilizar como el cuerpo de un método, operador o descriptor de acceso get.
El código del iterador utiliza la instrucción yield return para devolver a su vez cada elemento. yield break finaliza la
iteración. Para obtener más información, vea yield (Referencia de C#).
Se pueden implementar varios iteradores en una clase. Cada iterador debe tener un nombre único como cualquier
nombre de clase y se puede invocar mediante código de cliente en una instrucción foreach de la manera siguiente:
foreach(int x in SampleClass.Iterator2){}

El tipo de valor devuelto de un iterador debe ser IEnumerable, IEnumerator, IEnumerable<T> o IEnumerator.
La palabra clave yield se utiliza para especificar el valor o valores devueltos. Cuando se llega a la instrucción yield return, se
almacena la ubicación actual. La ejecución se reinicia desde esta ubicación la próxima vez que se llame al iterador.
Los iteradores son especialmente útiles con las clases de colección, ya que proporcionan una manera fácil de recorrer en
iteración las estructuras de datos no triviales, por ejemplo, los árboles binarios.
Secciones relacionadas
Para obtener más información:
Utilizar iteradores (Guía de programación de C#)
Cómo: Crear un bloque de iteradores para una lista de enteros (Guía de programación de C#)
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Interfaces genéricas (Guía de programación de C#)

Ejemplo
En este ejemplo, la clase DaysOfTheWeek es una clase de colección simple que almacena los días de la semana como cadenas.
Después de cada iteración de un bucle foreach, se devuelve la cadena siguiente en la colección.
C#
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

public System.Collections.IEnumerator GetEnumerator()


{
for (int i = 0; i < m_Days.Length; i++)
{
yield return m_Days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}

Resultado
Sun Mon Tue Wed Thr Fri Sat

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
22 Iteradores
Vea también
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Guía de programación de C#

Utilizar iteradores (Guía de programación de C#)


La manera más común de crear un iterador es implementar el método GetEnumerator en la interfaz IEnumerable, por ejemplo:
C#
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < max; i++)
{
yield return i;
}
}

La presencia del método GetEnumerator transforma el tipo en un tipo enumerable y permite utilizar la instrucción foreach. Si el
método anterior formaba parte de una definición de clase para ListClass, sería posible utilizar foreach en la clase de la forma
siguiente:
C#
static void Main()
{
ListClass listClass1 = new ListClass();

foreach (int i in listClass1)


{
System.Console.WriteLine(i);
}
}

La instrucción foreach invoca al método ListClass.GetEnumerator() y utiliza el enumerador que devuelve para recorrer en
iteración los valores. Para obtener un ejemplo de cómo crear un iterador genérico que devuelve una interfaz IEnumerator, vea
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#).
También es posible utilizar iteradores con nombre para admitir maneras diferentes de recorrer en iteración la misma colección
de datos. Por ejemplo, podría proporcionar un iterador que devuelve los elementos en orden ascendente y otro que los
devuelve en orden descendente. Un iterador también puede tener parámetros que permitan a los clientes controlar todo o
parte del comportamiento de iteración. El iterador siguiente implementa la interfaz IEnumerable utilizando el iterador con
nombre SampleIterator:
C#
// Implementing the enumerable pattern
public System.Collections.IEnumerable SampleIterator(int start, int end)
{
for (int i = start; i <= end; i++)
{
yield return i;
}
}

El iterador con nombre se invoca de este modo:


C#
ListClass test = new ListClass();
foreach (int n in test.SampleIterator(1, 10))
{
System.Console.WriteLine(n);
}
Se puede utilizar más de una instrucción yield en el iterador como se muestra en el ejemplo siguiente:
C#
public System.Collections.IEnumerator GetEnumerator()
{
yield return "With an iterator, ";
yield return "more than one ";
yield return "value can be returned";
yield return ".";
}

Se pueden imprimir los resultados con la siguiente instrucción foreach:


C#
foreach (string element in new TestClass())
{
System.Console.Write(element);
}

Este ejemplo muestra el texto siguiente:


With an iterator, more than one value can be returned.

En cada iteración sucesiva del bucle foreach (o llamada directa a IEnumerator.MoveNext), el cuerpo del código del iterador
siguiente se reanuda después de la instrucción yield anterior y continúa a la siguiente hasta que se llega al final del cuerpo del
iterador o se encuentra una instrucción yield break.
Vea también
Tareas
Cómo: Crear un bloque de iteradores para una lista de enteros (Guía de programación de C#)
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Referencia
yield (Referencia de C#)
Utilizar foreach son matrices (Guía de programación de C#)
foreach, in (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Crear un bloque de iteradores para una lista de enteros


(Guía de programación de C#)
En este ejemplo, se utiliza una matriz de enteros para generar la lista SampleCollection. Un bucle for recorre en iteración la
colección y obtiene el valor de cada elemento. A continuación, se utiliza un bucle foreach para mostrar los elementos de la
colección.
Ejemplo
C#
// Declare the collection:
public class SampleCollection
{
public int[] items;

public SampleCollection()
{
items = new int[5] { 5, 4, 7, 9, 3 };
}

public System.Collections.IEnumerable BuildCollection()


{
for (int i = 0; i < items.Length; i++)
{
yield return items[i];
}
}
}

class MainClass
{
static void Main()
{
SampleCollection col = new SampleCollection();

// Display the collection items:


System.Console.WriteLine("Values in the collection are:");
foreach (int i in col.BuildCollection())
{
System.Console.Write(i + " ");
}
}
}

Resultados
Values in the collection are:
5 4 7 9 3

Vea también
Tareas
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#)
Referencia
Utilizar iteradores (Guía de programación de C#)
yield (Referencia de C#)
Array
Conceptos
Guía de programación de C#
Iteradores (Guía de programación de C#)
Guía de programación de C#

Cómo: Crear un bloque de iteradores para una lista genérica


(Guía de programación de C#)
En este ejemplo, la clase genérica Stack<T> implementa la interfaz genérica IEnumerator<T>. Se declara una matriz del tipo T y
se asignan valores con el método Push. En el método GetEnumerator, los valores de la matriz se devuelven utilizando la
instrucción yield return.
También se implementa el método no genérico GetEnumerator, porque IEnumerable<T> hereda de IEnumerable. En este
ejemplo se muestra la implementación típica, que sirve para que el método no genérico simplemente reenvíe la llamada al
método genérico.
Ejemplo
C#
using System.Collections;
using System.Collections.Generic;
namespace GenericIteratorExample
{
public class Stack<T> : IEnumerable<T>
{
private T[] values = new T[100];
private int top = 0;

public void Push(T t) { values[top++] = t; }


public T Pop() { return values[--top]; }

// These make Stack<T> implement IEnumerable<T> allowing


// a stack to be used in a foreach statement.
public IEnumerator<T> GetEnumerator()
{
for (int i = top; --i >= 0; )
{
yield return values[i];
}
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
// Iterate from top to bottom.
public IEnumerable<T> TopToBottom
{
get
{
// Since we implement IEnumerable<T>
// and the default iteration is top to bottom,
// just return the object.
return this;
}
}
// Iterate from bottom to top.
public IEnumerable<T> BottomToTop
{
get
{
for (int i = 0; i < top; i++)
{
yield return values[i];
}
}
}
//A parameterized iterator that return n items from the top
public IEnumerable<T> TopN(int n)
{
// in this example we return less than N if necessary
int j = n >= top ? 0 : top - n;

for (int i = top; --i >= j; )


{
yield return values[i];
}
}
}

//This code uses a stack and the TopToBottom and BottomToTop properties
//to enumerate the elements of the stack.
class Test
{
static void Main()
{
Stack<int> s = new Stack<int>();
for (int i = 0; i < 10; i++)
{
s.Push(i);
}

// Prints: 9 8 7 6 5 4 3 2 1 0
// Foreach legal since s implements IEnumerable<int>
foreach (int n in s)
{
System.Console.Write("{0} ", n);
}
System.Console.WriteLine();

// Prints: 9 8 7 6 5 4 3 2 1 0
// Foreach legal since s.TopToBottom returns IEnumerable<int>
foreach (int n in s.TopToBottom)
{
System.Console.Write("{0} ", n);
}
System.Console.WriteLine();

// Prints: 0 1 2 3 4 5 6 7 8 9
// Foreach legal since s.BottomToTop returns IEnumerable<int>
foreach (int n in s.BottomToTop)
{
System.Console.Write("{0} ", n);
}
System.Console.WriteLine();

// Prints: 9 8 7 6 5 4 3
// Foreach legal since s.TopN returns IEnumerable<int>
foreach (int n in s.TopN(7))
{
System.Console.Write("{0} ", n);
}
System.Console.WriteLine();
}
}
}

Resultados
9 8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3

Vea también
Tareas
Cómo: Crear un bloque de iteradores para una lista de enteros (Guía de programación de C#)
Referencia
Utilizar iteradores (Guía de programación de C#)
System.Collections.Generic
IEnumerable
Conceptos
Guía de programación de C#
Iteradores (Guía de programación de C#)
Guía de programación de C#

Espacios de nombres (Guía de programación de C#)


Los espacios de nombres se utilizan en gran medida en la programación de C# de dos maneras. En primer lugar, .NET
Framework utiliza los espacios de nombres para organizar sus múltiples clases, de la forma siguiente:
C#
System.Console.WriteLine("Hello World!");

System es un espacio de nombres y Console es una clase incluida en ese espacio de nombres. Se puede utilizar la palabra
clave using a fin de que no se requiera el nombre completo, de la manera siguiente:
C#
using System;

C#
Console.WriteLine("Hello");
Console.WriteLine("World!");

Para obtener más información, vea el tema using (Directiva, Referencia de C#).
En segundo lugar, declarar espacios de nombres propios puede ayudar a controlar el ámbito de clase y nombres de método en
proyectos de programación grandes. Utilice la palabra clave namespace para declarar un espacio de nombres, como en el
ejemplo siguiente:
C#
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
}

Información general sobre los espacios de nombres


Los espacios de nombres tienen las propiedades siguientes:
Organizan proyectos de código de gran tamaño.
El operador . delimita los espacios de nombres.
La palabra clave using directive significa que no se necesita especificar el nombre del espacio de nombres para cada
clase.
El espacio de nombres global es el espacio de nombres "raíz": global::system siempre hará referencia al espacio de
nombres System de .NET Framework.
Secciones relacionadas
Vea los temas siguientes para obtener más información sobre los espacios de nombres:
Utilizar espacios de nombres (Guía de programación de C#)
Cómo: Utilizar el calificador de alias del espacio de nombres (Guía de programación de C#)
Cómo: Utilizar el espacio de nombres My (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
9 Espacios de nombres
Vea también
Referencia
Palabras clave del espacio de nombres (Referencia de C#)
using (Directiva, Referencia de C#)
Operador :: (Referencia de C#)
Operador . (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Utilizar espacios de nombres (Guía de programación de C#)


Los espacios de nombres se utilizan en gran medida en los programas de C# de dos maneras. Primero, las clases de .NET
Framework utilizan los espacios de nombres para organizar sus diversas clases. Segundo, declarar sus propios espacios de
nombres permite ayudar a controlar el ámbito de la clase y los nombres de método en proyectos de programación de mayor
tamaño.
Acceso a los espacios de nombres
La mayoría de las aplicaciones de C# comienzan con una sección de directivas using. Esta sección muestra los espacios de
nombres que la aplicación utilizará con frecuencia y evita que el programador tenga que especificar un nombre completo cada
vez que se utiliza un método contenido dentro.
Por ejemplo, incluyendo la línea:
C#
using System;

Al inicio de un programa, el programador puede utilizar el código:


C#
Console.WriteLine("Hello, World!");

En lugar de:
C#
System.Console.WriteLine("Hello, World!");

Alias de espacio de nombres


using (Directiva, Referencia de C#) también se puede utilizar para crear un alias para un espacio de nombres. Por ejemplo, si
utiliza un espacio de nombres escrito con anterioridad que contiene espacios de nombres anidados, puede declarar un alias
para proporcionar una forma rápida de hacer referencia a uno en particular, de la siguiente manera:
C#
using Co = Company.Proj.Nested; // define an alias to represent a namespace

Uso de espacios de nombres para controlar el ámbito


La palabra clave namespace se utiliza para declarar un ámbito. La capacidad de crear ámbitos dentro del proyecto permite
organizar el código y proporciona una manera de crear tipos únicos globales. En el ejemplo siguiente, una clase titulada
SampleClass se define en dos espacios de nombres, uno anidado dentro de otro. Operador . (Referencia de C#) se utiliza para
diferenciar a qué método se llama.
C#
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
// Create a nested namespace, and define another class.
namespace NestedNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside NestedNamespace");
}
}
}
class Program
{
static void Main(string[] args)
{
// Displays "SampleMethod inside SampleNamespace."
SampleClass outer = new SampleClass();
outer.SampleMethod();
// Displays "SampleMethod inside SampleNamespace."
SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
outer2.SampleMethod();

// Displays "SampleMethod inside NestedNamespace."


NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
inner.SampleMethod();
}
}
}

Nombres completos
Los espacios de nombres y tipos tienen nombres únicos que se describen mediante nombres completos que indican una
jerarquía lógica. Por ejemplo, la instrucción A.B implica que A es el nombre del espacio de nombres o tipo y que B está anidado
dentro de él.
En el siguiente ejemplo, se muestran clases y espacios de nombres anidados. El nombre completo se indica como un
comentario que sigue a cada entidad.
C#
namespace N1 // N1
{
class C1 // N1.C1
{
class C2 // N1.C1.C2
{
}
}
namespace N2 // N1.N2
{
class C2 // N1.N2.C2
{
}
}
}

En el segmento de código anterior:


El espacio de nombres N1 es un miembro del espacio de nombres global. Su nombre completo es N1.
El espacio de nombres N2 es un miembro del espacio de nombres N1. Su nombre completo es N1.N2.
La clase C1 es un miembro de N1. Su nombre completo es N1.C1.
El nombre de clase C2 se utiliza dos veces en el código. Sin embargo, los nombres completos son únicos. El primero se
declara dentro de C1; por tanto, su nombre completo es: N1.C1.C2. El segundo se declara dentro de un espacio de
nombres N2; por lo que su nombre completo es N1.N2.C2.
Mediante el segmento de código anterior, se puede agregar un nuevo miembro de clase, C3, al espacio de nombres N1.N2 de la
siguiente forma:
C#
namespace N1.N2
{
class C3 // N1.N2.C3
{
}
}

En general, utilice :: para hacer referencia a un alias de espacio de nombres o global:: para hacer referencia al espacio de
nombres global y . para calificar tipos o miembros.
No es correcto utilizar :: con un alias que hace referencia a un tipo en lugar de a un espacio de nombres. Por ejemplo:
C#
using Alias = System.Console;

C#
class TestClass
{
static void Main()
{
// Error
//Alias::WriteLine("Hi");
// OK
Alias.WriteLine("Hi");
}
}

Tenga presente que la palabra global no es un alias predefinido; por consiguiente, global.X no tiene ningún significado
especial. Sólo adquiere un significado especial cuando se utiliza con ::.
Se genera una advertencia (vea Advertencia del compilador (nivel 2) CS0440) si se define un alias denominado global porque
global:: siempre hace referencia al espacio de nombres global y no a un alias. Por ejemplo, la línea siguiente genera la
advertencia:
C#
using global = System.Collections; // Warning

El uso de :: con alias es una buena idea y proporciona protección contra la introducción inesperada de tipos adicionales. Por
ejemplo, considere este ejemplo:
C#
using Alias = System;

C#
namespace Library
{
public class C : Alias.Exception { }
}

Esto funciona, pero si después se introdujera un tipo denominado Alias, Alias. se enlazaría en su lugar a ese tipo. El uso de
Alias::Exception asegura que Alias se trate como un alias de espacio de nombres y no se confunda con un tipo.

Vea el tema Cómo: Utilizar el calificador de alias del espacio de nombres (Guía de programación de C#) para obtener más
detalles relativos al alias global.
Vea también
Referencia
Palabras clave del espacio de nombres (Referencia de C#)
Operador . (Referencia de C#)
Operador :: (Referencia de C#)
extern (Referencia de C#)
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Guía de programación de C#

Cómo: Utilizar el calificador de alias del espacio de nombres


(Guía de programación de C#)
Es útil poder tener acceso a un miembro en el espacio de nombres global cuando otra entidad con el mismo nombre puede
ocultar el miembro.
Por ejemplo, en el siguiente código, Console tiene como resultado TestApp.Console en lugar del tipo Console del espacio de
nombres System.
C#
using System;

C#
class TestApp
{
// Define a new class called 'System' to cause problems.
public class System { }

// Define a constant called 'Console' to cause more problems.


const int Console = 7;
const int number = 66;

static void Main()


{
// Error Accesses TestApp.Console
//Console.WriteLine(number);
}
}

La utilización de System.Console aún produce un error porque la clase TestApp.System oculta el espacio de nombres
System:
C#
// Error Accesses TestApp.System
System.Console.WriteLine(number);

Sin embargo, este error se puede evitar utilizando global::System.Console, del modo siguiente:
C#
// OK
global::System.Console.WriteLine(number);

Cuando el identificador izquierdo es global, la búsqueda del identificador derecho se inicia en el espacio de nombres global.
Por ejemplo, la siguiente declaración hace referencia a TestApp como miembro del espacio global.
C#
class TestClass : global::TestApp

Obviamente, no se recomienda la creación de espacios de nombres propios denominados System y es improbable que se
encuentre algún código en el que se haya hecho esto. Sin embargo, en proyectos grandes, es muy posible que se pueda
producir la duplicación del espacio de nombres en un formulario u otro. En estas situaciones, el calificador de espacio de
nombres global es la garantía de que se puede especificar el espacio de nombres raíz.
Ejemplo
En este ejemplo, se utiliza el espacio de nombres System para incluir la clase TestClass; por lo tanto, se debe utilizar
global::System.Console para hacer referencia a la clase System.Console, que el espacio de nombres System oculta.
Además, el alias colAlias se utiliza para hacer referencia al espacio de nombres System.Collections; por consiguiente, la
instancia de un objeto System.Collections.Hashtable se crea con este alias en lugar del espacio de nombres.
C#
using colAlias = System.Collections;
namespace System
{
class TestClass
{
static void Main()
{
// Searching the alias:
colAlias::Hashtable test = new colAlias::Hashtable();

// Add items to the table.


test.Add("A", "1");
test.Add("B", "2");
test.Add("C", "3");

foreach (string name in test.Keys)


{
// Seaching the gloabal namespace:
global::System.Console.WriteLine(name + " " + test[name]);
}
}
}
}

Resultados del ejemplo


A 1
B 2
C 3

Vea también
Referencia
Operador . (Referencia de C#)
Operador :: (Referencia de C#)
extern (Referencia de C#)
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Guía de programación de C#

Cómo: Utilizar el espacio de nombres My (Guía de


programación de C#)
El espacio de nombres Microsoft.VisualBasic.MyServices (My en Visual Basic) proporciona acceso fácil e intuitivo a varias
clases de .NET Framework, lo que permite escribir código que interactúe con el equipo, aplicación, configuración, recursos, etc.
Aunque originalmente se diseñó para el uso con Visual Basic, el espacio de nombres MyServices se puede utilizar en
aplicaciones de C#.
Para obtener más información sobre cómo utilizar el espacio de nombres MyServices de Visual Basic, vea
Desarrollo con la función My.
Agregar una referencia
Antes de poder utilizar las clases MyServices en la solución, debe agregar una referencia a la biblioteca de Visual Basic.
Para agregar una referencia a la biblioteca de Visual Basic
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el nodo Referencias y
seleccione Agregar referencia.
2. Cuando aparezca el cuadro de diálogo Referencias, desplácese por la lista y seleccione Microsoft.VisualBasic.dll.
También puede incluir la línea siguiente en la sección using al inicio del programa.
C#
using Microsoft.VisualBasic.Devices;

Ejemplo
Este ejemplo llama a distintos métodos estáticos contenidos en el espacio de nombres MyServices. Para que este código se
compile, es necesario agregar al proyecto una referencia a Microsoft.VisualBasic.DLL.
C#
using System;
using Microsoft.VisualBasic.Devices;

class TestMyServices
{
static void Main()
{
// Play a sound with the Audio class:
Audio myAudio = new Audio();
Console.WriteLine("Playing sound...");
myAudio.Play(@"c:\WINDOWS\Media\chimes.wav");

// Display time information with the Clock class:


Clock myClock = new Clock();
Console.Write("Current day of the week: ");
Console.WriteLine(myClock.LocalTime.DayOfWeek);
Console.Write("Current date and time: ");
Console.WriteLine(myClock.LocalTime);

// Display machine information with the Computer class:


Computer myComputer = new Computer();
Console.WriteLine("Computer name: " + myComputer.Name);

if (myComputer.Network.IsAvailable)
{
Console.WriteLine("Computer is connected to network.");
}
else
{
Console.WriteLine("Computer is not connected to network.");
}
}
}

No todas las clases del espacio de nombres MyServices se pueden llamar desde una aplicación de C#: por ejemplo, la clase
FileSystemProxy no es compatible. En este caso particular, en lugar de esta clase se pueden utilizar los métodos estáticos que
forman parte de FileSystem, que también se encuentran en el archivo VisualBasic.dll. Por ejemplo, aquí se muestra cómo
utilizar un método de este tipo para duplicar un directorio:
C#
// Duplicate a directory
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
@"C:\original_directory",
@"C:\copy_of_original_directory");

Vea también
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Utilizar espacios de nombres (Guía de programación de C#)
Guía de programación de C#

Tipos que aceptan valores NULL (Guía de programación de C#)


Los tipos que aceptan valores NULL son instancias de la estructura System.Nullable. Un tipo que acepta valores NULL puede
representar el rango normal de valores de su tipo de valor subyacente, además de un valor null adicional. Por ejemplo, a un
tipo Nullable<Int32>, se le puede asignar cualquier valor entre -2147483648 y 2147483647, o el valor null. A un tipo
Nullable<bool>, se le puede asignar los valores true o false, o null. La posibilidad de asignar null a tipos numéricos y
booleanos es particularmente útil para trabajar con bases de datos y otros tipos de datos que contienen elementos que pueden
no tener un valor asignado. Por ejemplo, un campo Boolean de una base de datos puede almacenar los valores true o false, o
puede ser indefinido.
C#
class NullableExample
{
static void Main()
{
int? num = null;
if (num.HasValue == true)
{
System.Console.WriteLine("num = " + num.Value);
}
else
{
System.Console.WriteLine("num = Null");
}

//y is set to zero


int y = num.GetValueOrDefault();

// num.Value throws an InvalidOperationException if num.HasValue is false


try
{
y = num.Value;
}
catch (System.InvalidOperationException e)
{
System.Console.WriteLine(e.Message);
}
}
}

Los ejemplos anteriores mostrarán el siguiente resultado:


num = Null
Nullable object must have a value.

Información general acerca de los tipos que aceptan valores NULL


Los tipos que aceptan valores NULL tienen las características siguientes:
Los tipos que aceptan valores NULL representan variables de tipo de valor a las que se puede asignar el valor null. No se
puede crear un tipo que acepta valores NULL basado en un tipo de referencia. (Los tipos de referencia ya admiten el
valor null.)
La sintaxis T? es la forma abreviada de System.Nullable < T >, donde T es un tipo de valor. Las dos formas son
intercambiables.
Asigne un valor a un tipo que acepte valores NULL como si se tratara de un tipo de valor normal, por ejemplo, int? x =
10; o double? d = 4.108;

Utilice la propiedad System.Nullable.GetValueOrDefault para devolver el valor asignado o el valor predeterminado del
tipo subyacente si el valor es null, por ejemplo int j = x.GetValueOrDefault();
Utilice las propiedades de sólo lectura HasValue y Value para comprobar si el valor es NULL y recuperar el valor, por
ejemplo if(x.HasValue) j = x.Value;

La propiedad HasValue devuelve el valor verdadero si la variable contiene un valor, o falso si es NULL.
La propiedad Value devuelve un valor si se ha asignado uno; de lo contrario, devuelve
System.InvalidOperationException.
El valor predeterminado para una variable de tipo que acepta valores NULL establece HasValue a false. El Value
es indefinido.
Utilice el operador ?? para asignar un valor predeterminado que se aplicará cuando un tipo que acepta valores NULL
cuyo valor actual sea NULL se asigne a una tipo que no acepte valore NULL, por ejemplo int? x = null; int y = x ??
-1;

No se permite la anidación de tipos que aceptan valores NULL. La línea siguiente no se compilará:
Nullable<Nullable<int>> n;

Secciones relacionadas
Para obtener más información:
Utilizar tipos que aceptan valores NULL (Guía de programación de C#)
Aplicar la conversión boxing a tipos que aceptan valores NULL (Guía de programación de C#)
Operador ?? (Referencia de C#)

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
24 tipos que aceptan valores NULL
Vea también
Tareas
Ejemplo Nullable
Referencia
Nullable
Conceptos
Guía de programación de C#
Otros recursos
Visual C#
Referencia de C#
Guía de programación de C#

Utilizar tipos que aceptan valores NULL (Guía de programación


de C#)
Los tipos que aceptan valores NULL pueden representar todos los valores de un tipo subyacente y un valor null adicional. Los
tipos que aceptan valores NULL se declaran de dos formas:
System.Nullable<T> variable

O bien
T? variable

T es el tipo subyacente del tipo que acepta valores NULL. T puede ser cualquier tipo de valor, incluso struct; no puede ser un
tipo de referencia.
Para obtener un ejemplo de cuándo se podría utilizar un tipo que acepta valores NULL, piense en una variable booleana
común que puede tener dos valores: true y false. No hay ningún valor que signifique "indefinido". En muchas aplicaciones de
programación, en particular interacciones de bases de datos, pueden existir variables con un estado indefinido. Por ejemplo, un
campo de una base de datos puede contener los valores true o false, pero también puede que no contenga ningún valor.
Igualmente, los tipos de referencia se pueden establecer en null para indicar que no se inicializan.
Esta disparidad puede crear trabajo de programación extra, con variables adicionales que se utilizan para almacenar
información de estado, el uso de valores especiales, etc. El modificador de tipos que aceptan valores NULL permite a C# crear
variables de tipo de valor que pueden indicar un valor indefinido.
Ejemplos de tipos que aceptan valores NULL
Cualquier tipo de valor se puede utilizar como base para un tipo que acepta valores NULL. Por ejemplo:
C#
int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];

Miembros de tipos que aceptan valores NULL


Cada instancia de un tipo que acepta valores NULL tiene dos propiedades públicas de sólo lectura:
HasValue
HasValue es de tipo bool. Se establece como true cuando la variable contiene un valor que no es null.

Value
Value es del mismo tipo que el tipo subyacente. Si HasValue es true, Value contiene un valor significativo. Si HasValue es
false, al tener acceso a Value se producirá una excepción InvalidOperationException.
En este ejemplo, el miembro HasValue se utiliza para comprobar si la variable contiene un valor antes de mostrarlo.
C#
int? x = 10;
if (x.HasValue)
{
System.Console.WriteLine(x.Value);
}
else
{
System.Console.WriteLine("Undefined");
}

La comprobación de un valor también se puede hacer de la forma siguiente:


C#
int? y = 10;
if (y != null)
{
System.Console.WriteLine(y.Value);
}
else
{
System.Console.WriteLine("Undefined");
}

Conversiones explícitas
Un tipo que acepta valores NULL se puede convertir en un tipo normal mediante el uso explícito de la conversión o a través de
la propiedad Value. Por ejemplo:
C#
int? n = null;
//int m1 = n; // Will not compile.
int m2 = (int)n; // Compiles, but will create an exception if x is null.
int m3 = n.Value; // Compiles, but will create an exception if x is null.

Si se define una conversión definida por el usuario entre dos tipos de datos, la misma conversión se puede utilizar con las
versiones que aceptan valores NULL de estos tipos de datos.
Conversiones implícitas
Una variable de tipo que acepta valores NULL se puede establecer como null con la palabra clave null, como se muestra a
continuación:
C#
int? n1 = null;

La conversión de un tipo ordinario a un tipo que acepta valores NULL, es implícita.


C#
int? n2;
n2 = 10; // Implicit conversion.

Operadores
Los operadores predefinidos unarios y binarios así como cualquier operador definido por el usuario que exista para los tipos
de valor también pueden ser utilizados por los tipos que aceptan valores NULL. Estos operadores generan un valor null si los
operandos son null; de lo contrario, el operador utiliza el valor contenido para calcular el resultado. Por ejemplo:
C#
int? a = 10;
int? b = null;

a++; // Increment by 1, now a is 11.


a = a * 10; // Multiply by 10, now a is 110.
a = a + b; // Add b, now a is null.

Al realizar comparaciones con tipos que aceptan valores null, si alguno de estos tipos es null, la comparación siempre se
evalúa como false. Por consiguiente, es importante no dar por supuesto que, porque una comparación sea false, el caso
contrario será true. Por ejemplo:
C#
int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
System.Console.WriteLine("num1 is greater than or equal to num1");
}
else
{
// num1 is NOT less than num2
}

La conclusión en la instrucción else anterior no es válida porque num2 es null y por consiguiente no contiene un valor.
Una comparación de dos tipos que aceptan valores null y ambos son null se evaluará como true.
El operador ??
El operador ?? define un valor predeterminado que se devuelve cuando un tipo que acepta valores NULL se asigna a un tipo
que no acepta valores NULL.
C#
int? c = null;

// d = c, unless c is null, in which case d = -1.


int d = c ?? -1;

Este operador también se puede utilizar con muchos tipos que no aceptan valores NULL. Por ejemplo:
C#
int? e = null;
int? f = null;
// g = e or f, unless e and f are both null, in which case g = -1.
int g = e ?? f ?? -1;

El tipo bool?
El tipo bool?, que acepta valores NULL, puede contener tres valores diferentes: true, false y null. Como tal, no se puede utilizar
en instrucciones condicionales con if, for o while. Por ejemplo, este código no se puede compilar y produce el error
Error del compilador CS0266:

bool? b = null;
if (b) // Error CS0266.
{
}

Esto no se permite porque el significado de null en el contexto de una instrucción condicional es incierto. Los tipos booleanos
que aceptan valores NULL se pueden convertir explícitamente en bool para utilizarlos en una instrucción condicional, pero si el
objeto tiene un valor de null, se producirá una excepción InvalidOperationException. Por consiguiente, es importante
comprobar la propiedad HasValue antes de convertir a bool.
Los tipos booleanos que aceptan valores NULL son similares al tipo de variable booleano que se utiliza en SQL. Para
asegurarse de que los resultados producidos por los operadores & y | sean coherentes con el tipo booleano de tres valores de
SQL, se proporcionan los siguientes operadores predefinidos:
bool? operator &(bool? x, bool? y)
bool? operator |(bool? x, bool? y)

Los resultados de estos operadores se muestran en la tabla que aparece a continuación:


X y x&y x|y
True true True true

True false False true

True null Null true

False true False true

False false False false

False null False null

Null true Null true

Null false False null

Null null Null null


Vea también
Referencia
Aplicar la conversión boxing a tipos que aceptan valores NULL (Guía de programación de C#)
Conceptos
Guía de programación de C#
Tipos que aceptan valores NULL (Guía de programación de C#)
Guía de programación de C#

Aplicar la conversión boxing a tipos que aceptan valores NULL


(Guía de programación de C#)
La conversión boxing sólo se aplica a los objetos basados en tipos que aceptan valores null si el valor del objeto no es null. Si
HasValue es false, en lugar de aplicar la conversión boxing, la referencia de objeto simplemente se asigna a null. Por ejemplo:

bool? b = null;
object o = b;
// Now o is null.

Si el objeto no es NULL (si HasValue es true), tiene lugar la conversión boxing, pero sólo se aplica al tipo subyacente en el que
se basa el objeto que acepta valores NULL. La conversión boxing de un tipo de valor no NULL que acepta valores NULL se
aplica al propio tipo de valor, no al objeto System.Nullable que ajusta el tipo de valor. Por ejemplo:

bool? b = false;
int? i = 44;
object bBoxed = b; // bBoxed contains a boxed bool.
object iBoxed = i; // iBoxed contains a boxed int.

Los dos objetos a los que se aplica la conversión boxing son idénticos a aquellos creados aplicando la conversión boxing a
tipos que no aceptan valores NULL. Además, al igual que los tipos sin conversión boxing que aceptan valores NULL, se les
puede aplicar la conversión unboxing en los tipos que aceptan valores NULL, del modo siguiente:

bool? b2 = (bool?)bBoxed;
int? i2 = (int?)iBoxed;

Comentarios
El comportamiento de los tipos que aceptan valores NULL cuando se aplica la conversión boxing proporciona dos ventajas:
1. Se comprueba si los objetos que aceptan valores NULL y sus homólogos a los que se aplica la conversión boxing tienen
valores NULL:

bool? b = null;
object boxedB = b;
if (b == null)
{
// True.
}
if (boxedB == null)
{
// Also true.
}

2. Los tipos que aceptan valores NULL y a los que se aplica la conversión boxing admiten la funcionalidad del tipo
subyacente:

double? d = 44.4;
object iBoxed = d;
// Access IConvertible interface implemented by double.
IConvertible ic = (IConvertible)iBoxed;
int i = ic.ToInt32(null);
string str = ic.ToString();

Para obtener más ejemplos de tipos que aceptan valores NULL y del comportamiento de la conversión boxing, vea
Ejemplo Nullable.
Vea también
Tareas
Cómo: Identificar tipos que aceptan valores NULL (Guía de programación de C#)
Conceptos
Guía de programación de C#
Tipos que aceptan valores NULL (Guía de programación de C#)
Guía de programación de C#

Cómo: Identificar tipos que aceptan valores NULL (Guía de


programación de C#)
Puede utilizar el operador typeof de C# para crear un objeto Type que represente un tipo que acepta valores NULL:

System.Type type = typeof(int?);

También puede utilizar las clases y métodos del espacio de nombres System.Reflection para generar objetos Type que
representen tipos que aceptan valores NULL. Sin embargo, si intenta obtener información de tipo de las variables que aceptan
valores NULL en tiempo de ejecución mediante el método GetType o el operador is, el resultado es un objeto Type que
representa el tipo subyacente y no el propio tipo que acepta valores NULL.
La llamada a GetType en un tipo que acepta valores NULL origina que se ejecute una operación de conversión boxing cuando
el tipo se convierte implícitamente en Object. Por consiguiente, GetType siempre devuelve un objeto Type que representa el
tipo subyacente y no el tipo que acepta valores NULL.

int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"

El operador is de C# funciona también en el tipo subyacente de un tipo que acepta valores NULL. Por tanto, no puede utilizar is
para determinar si una variable es un tipo que acepta valores NULL. El ejemplo siguiente muestra que el operador is trata una
variable <int> que acepta valores NULL como un valor int.

static void Main(string[] args)


{
int? i = 5;
if (i is int) // true
//…
}

Ejemplo
Utilice el código siguiente para determinar si un objeto Type representa un tipo que acepta valores NULL. Recuerde que este
código siempre devuelve false si el objeto Type se devuelve de una llamada a GetType, como se ha explicado anteriormente.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) {…}

Vea también
Referencia
Aplicar la conversión boxing a tipos que aceptan valores NULL (Guía de programación de C#)
Conceptos
Tipos que aceptan valores NULL (Guía de programación de C#)
Guía de programación de C#

Código no seguro y punteros (Guía de programación de C#)


Para mantener la seguridad de tipos y la seguridad, C# de manera predeterminada no admite la aritmética con punteros. Sin
embargo, utilizando la palabra clave unsafe, es posible definir un contexto no seguro en el que se pueden utilizar punteros.
Para obtener más información sobre los punteros, vea el tema Tipos de puntero (Guía de programación de C#).
Nota
En el Common Language Runtime (CLR), se hace referencia al código no seguro como código no comprobable. El código no
seguro en C# no es necesariamente peligroso; simplemente es código cuya seguridad no puede ser comprobada por el CLR.
Por consiguiente, el CLR sólo ejecutará código no seguro si se encuentra en un ensamblado de plena confianza. Si utiliza el c
ódigo no seguro, es su responsabilidad garantizar que su código no introduce riesgos de seguridad o errores de puntero. Par
a obtener más información, vea Seguridad (Guía de programación de C#).

Información general sobre código no seguro


El código no seguro tiene las propiedades siguientes:
Los métodos, tipos y bloques de código se pueden definir como no seguros.
En algunos casos, el código no seguro puede aumentar el rendimiento de una aplicación al eliminar las comprobaciones
de los límites de la matriz
Se requiere el código no seguro al llamar a funciones nativas que requieren punteros.
El uso de código no seguro implica riesgos de seguridad y de estabilidad.
Para que C# compile código no seguro, la aplicación se debe compilar con /unsafe.
Secciones relacionadas
Para obtener más información al respecto, vea:
Tipos de puntero (Guía de programación de C#)
Búferes de tamaño fijo (Guía de programación de C#)
Cómo: Utilizar punteros para copiar una matriz de bytes (Guía de programación de C#)
Cómo: Utilizar la función ReadFile de Windows (Guía de programación de C#)
unsafe (Referencia de C#)
Ejemplo de código no seguro

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
18 Código no seguro
B 3 Extensiones gramaticales para el código no seguro
Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Búferes de tamaño fijo (Guía de programación de C#)


En C# 2.0, puede utilizar la instrucción fixed para crear una matriz de tamaño fijo en una estructura de datos. Esto es útil
cuando se trabaja con código existente, como el código escrito en otros lenguajes, archivos DLL preexistentes o proyectos
COM. La matriz fija puede tomar cualquiera de los atributos o modificadores que se permiten para los miembros de las
estructuras normales. La única restricción es que el tipo de matriz debe ser bool, byte, char, short, int, long, sbyte, ushort,
uint, ulong, float o double.

private fixed char name[30];

Comentarios
En versiones anteriores de C#, declarar una estructura de tamaño fijo con el estilo de C++ era difícil, porque una estructura de
C# que contiene una matriz, no contiene los elementos de la matriz, sino una referencia a ellos.
C# 2.0 agrega la capacidad de incrustar una matriz de tamaño fijo en un objeto struct cuando se utiliza en un bloque de código
unsafe.
Por ejemplo, antes de C# 2.0, los siguientes objetos struct tendrían un tamaño de 8 bytes, siendo la matriz pathName una
referencia a la matriz asignada por montón:
C#
public struct MyArray
{
public char[] pathName;
private int reserved;
}

En C# 2.0 es posible declarar un objeto struct con una matriz incrustada:


C#
public struct MyArray // This code must appear in an unsafe block
{
public fixed char pathName[128];
}

En esta estructura, la matriz pathName es de tamaño y ubicación fijos y, por consiguiente, puede utilizarse con otro código no
seguro.
El tamaño de la matriz char de 128 elementos es 256 bytes. Los búferes char de tamaño fijo siempre admiten dos bytes por
carácter, independientemente de la codificación. Esto es verdadero, incluso cuando los búferes de caracteres se calculan por
referencia a los métodos API o estructuras con CharSet = CharSet.Auto o CharSet = CharSet.Ansi. Para obtener más
información, vea CharSet.
Otra matriz de tamaño fijo común es la matriz bool. Los elementos en una matriz bool siempre tienen un byte de tamaño: Las
matrices bool no son adecuadas para crear matrices de bits o búferes.
Nota
Con excepción de la memoria creada con stackalloc, el compilador de C# y el Common Language Runtime (CLR) no realizan
ninguna comprobación de saturación del búfer de seguridad. Como sucede con todo código no seguro, se ha de tener preca
ución.

Los búferes no seguros son diferentes de las matrices normales en los siguientes puntos:
Sólo se pueden utilizar búferes no seguros en un contexto no seguro.
Los búferes no seguros siempre son vectores, o matrices unidimensionales.
La declaración de la matriz debe incluir un recuento, por ejemplo, char id[8]. No puede utilizar char id[] en su lugar.
Los búferes no seguros sólo pueden ser campos de instancias de estructuras en un contexto no seguro.
Vea también
Tareas
Cómo: Llamar a archivos DLL nativos desde el código administrado mediante PInvoke
Cómo: Calcular referencias a matrices mediante PInvoke
Cómo: Calcular referencias de punteros incrustados mediante PInvoke
Cómo: Calcular referencias de punteros a función mediante PInvoke
Cómo: Calcular referencias de cadenas mediante PInvoke
Referencia
fixed (Instrucción, Referencia de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Cálculo de referencias predeterminado para matrices
Guía de programación de C#

Cómo: Utilizar la función ReadFile de Windows (Guía de


programación de C#)
Este ejemplo muestra la función de Windows ReadFile que lee y muestra un archivo de texto. La función ReadFile requiere el
uso de código unsafe porque requiere un puntero como parámetro.
La matriz de bytes pasada a la función Read es un tipo administrado. Esto significa que el recolector de elementos no utilizados
de Common Language Runtime (CLR) puede reubicar la memoria usada por la matriz según lo considere necesario. Para evitar
esto, se utiliza fixed para obtener un puntero a la memoria y marcarlo para que no lo mueva el recolector de elementos no
utilizados. Al final del bloque fixed, la memoria vuelve automáticamente a estar sujeta a moverse a través de la recolección de
elementos no utilizados.
Esta capacidad se conoce como fijación declarativa. El lado atractivo de la fijación es que apenas hay carga de ejecución, a
menos que se produzca una recolección de elementos no utilizados en el bloque fixed, lo cual no es probable que suceda.
Ejemplo
C#
class FileReader
{
const uint GENERIC_READ = 0x80000000;
const uint OPEN_EXISTING = 3;
System.IntPtr handle;

[System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]


static extern unsafe System.IntPtr CreateFile
(
string FileName, // file name
uint DesiredAccess, // access mode
uint ShareMode, // share mode
uint SecurityAttributes, // Security Attributes
uint CreationDisposition, // how to create
uint FlagsAndAttributes, // file attributes
int hTemplateFile // handle to template file
);

[System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]


static extern unsafe bool ReadFile
(
System.IntPtr hFile, // handle to file
void* pBuffer, // data buffer
int NumberOfBytesToRead, // number of bytes to read
int* pNumberOfBytesRead, // number of bytes read
int Overlapped // overlapped buffer
);
[System.Runtime.InteropServices.DllImport("kernel32", SetLastError = true)]
static extern unsafe bool CloseHandle
(
System.IntPtr hObject // handle to object
);

public bool Open(string FileName)


{
// open the existing file for reading
handle = CreateFile
(
FileName,
GENERIC_READ,
0,
0,
OPEN_EXISTING,
0,
0
);
if (handle != System.IntPtr.Zero)
{
return true;
}
else
{
return false;
}
}

public unsafe int Read(byte[] buffer, int index, int count)


{
int n = 0;
fixed (byte* p = buffer)
{
if (!ReadFile(handle, p + index, count, &n, 0))
{
return 0;
}
}
return n;
}

public bool Close()


{
return CloseHandle(handle);
}
}

class Test
{
static int Main(string[] args)
{
if (args.Length != 1)
{
System.Console.WriteLine("Usage : ReadFile <FileName>");
return 1;
}

if (!System.IO.File.Exists(args[0]))
{
System.Console.WriteLine("File " + args[0] + " not found.");
return 1;
}

byte[] buffer = new byte[128];


FileReader fr = new FileReader();

if (fr.Open(args[0]))
{
// Assume that an ASCII file is being read.
System.Text.ASCIIEncoding Encoding = new System.Text.ASCIIEncoding();

int bytesRead;
do
{
bytesRead = fr.Read(buffer, 0, buffer.Length);
string content = Encoding.GetString(buffer, 0, bytesRead);
System.Console.Write("{0}", content);
}
while (bytesRead > 0);

fr.Close();
return 0;
}
else
{
System.Console.WriteLine("Failed to open requested file");
return 1;
}
}
}

Vea también
Referencia
Tipos de puntero (Guía de programación de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Referencia de C#
Recolección de elementos no utilizados
Guía de programación de C#

Tipos de puntero (Guía de programación de C#)


En un contexto no seguro, un tipo puede ser un tipo de puntero así como un tipo de valor o un tipo de referencia. Una
declaración de tipo de puntero adopta una de las formas siguientes:

type* identifier;
void* identifier; //allowed but not recommended

Cualquiera de los tipos siguientes puede ser un tipo de puntero:


sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal o bool.
Cualquier tipo de enum.
Cualquier tipo de puntero (pointer).
Cualquier tipo de estructura (struct) definido por el usuario que sólo contenga campos de tipos no administrados.
Los tipos de puntero no se heredan de object y no existe ninguna conversión entre tipos de puntero y object. Además, las
conversiones boxing y unboxing no admiten punteros. Sin embargo, puede realizar conversiones entre diferentes tipos de
puntero y entre tipos de puntero y tipos integrales.
Cuando declare varios punteros en la misma declaración, debe escribir el * sólo junto al tipo subyacente, no como prefijo en
cada nombre de puntero. Por ejemplo:

int* p1, p2, p3; // Ok


int *p1, *p2, *p3; // Invalid in C#

Un puntero no puede apuntar a una referencia o a una estructura que contenga referencias, porque es posible que la
referencia a un objeto se recolecte como elemento no utilizado aunque haya un puntero que apunte a ella. GC no controla si
hay tipos de punteros que apuntan a un objeto.
El valor de la variable de puntero de tipo myType* es la dirección de una variable de tipo myType. A continuación se muestran
ejemplos de declaraciones de tipo de puntero:
Ejemplo Descripción
int* p p es un puntero a un entero

int** p p es un puntero a un puntero o a un entero

int*[] p p es una matriz unidimensional de punteros a enteros

char* p p es un puntero a un valor char

void* p p es un puntero a un tipo desconocido

El operador de direccionamiento indirecto de puntero * puede utilizarse para tener acceso al contenido de la ubicación
señalada por la variable de puntero. Por ejemplo, para la siguiente declaración,

int* myVariable;

la expresión *myVariable denota la variable int que se encuentra en la dirección contenida en myVariable.
No se puede aplicar el operador de direccionamiento indirecto a un puntero de tipo void*. Sin embargo, es posible utilizar una
conversión de tipos para convertir un puntero de tipo void en cualquier otro tipo de puntero y viceversa.
Un puntero puede ser null. La aplicación del operador de direccionamiento indirecto a un puntero nulo (null) da como
resultado un comportamiento definido según la implementación.
Tenga en cuenta que el paso de punteros entre métodos puede provocar un comportamiento no definido. Un ejemplo es la
devolución de un puntero a una variable local a través de un parámetro Out o Ref, o como resultado de la función. Si el
puntero se estableció en un bloque fijo, es posible que la variable a la que apunta ya no pueda ser fija.
La tabla siguiente muestra los operadores e instrucciones que pueden funcionar sobre punteros en un contexto no seguro:
Operador/instrucción Uso
* Para realizar el direccionamiento indirecto de puntero.

-> Para tener acceso a un miembro de una estructura a través de un puntero.

[] Para indizar un puntero.

& Para obtener la dirección de una variable.

++ y -- Para incrementar y reducir punteros.

+y- Para realizar aritmética de punteros.

==, !=, <, >, <= y >= Para comparar punteros.

stackalloc Para asignar memoria en la pila.

fixed (Instrucción) Para hacer que una variable sea temporalmente fija para que pueda encontrarse su dirección.
Especificación del lenguaje C#
Para obtener más información, vea la sección siguiente de Especificación del lenguaje C#.
18 Código no seguro
Vea también
Referencia
Conversiones de puntero (Guía de programación de C#)
Expresiones de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Conversión boxing y unboxing (Guía de programación de C#)
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Conversiones de puntero (Guía de programación de C#)


La tabla siguiente muestra las conversiones de puntero implícitas predefinidas. Las conversiones implícitas se pueden dar en
muchas ocasiones, incluidas la invocación a métodos y las instrucciones de asignación.
Conversiones de puntero implícitas
De Para
Cualquier tipo de puntero. void*

null Cualquier tipo de puntero.

La conversión de puntero explícita se utiliza para realizar conversiones para las que no existe conversión implícita utilizando
una expresión de conversión de tipos. La siguiente tabla muestra estas conversiones.
Conversiones de puntero explícitas
De Para
Cualquier tipo de puntero. Cualquier otro tipo de puntero

sbyte, byte, short, ushort, int, uint, long o ulong Cualquier tipo de puntero.

Cualquier tipo de puntero. sbyte, byte, short, ushort, int, uint, long o ulong
Ejemplo
En el ejemplo siguiente, un puntero a int se convierte en un puntero a byte. Observe que el puntero señala al byte
direccionado más bajo de la variable. Cuando incrementa sucesivamente el resultado, hasta el tamaño de int (4 bytes), puede
mostrar los bytes restantes de la variable.
C#
// compile with: /unsafe

C#
class ClassConvert
{
static void Main()
{
int number = 1024;

unsafe
{
// Convert to byte:
byte* p = (byte*)&number;

System.Console.Write("The 4 bytes of the integer:");


// Display the 4 bytes of the int variable:
for (int i = 0 ; i < sizeof(int) ; ++i)
{
System.Console.Write(" {0:X2}", *p);
// Increment the pointer:
p++;
}
System.Console.WriteLine();
System.Console.WriteLine("The value of the integer: {0}", number);
}
}
}
Resultado
The 4 bytes of the integer: 00 04 00 00
The value of the integer: 1024

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Expresiones de puntero (Guía de programación de C#)


En esta sección, se tratan las expresiones de puntero siguientes:
Obtener el valor de una variable
Obtener la dirección de una variable
Cómo: Obtener acceso a un miembro con un puntero (Guía de programación de C#)
Cómo: Obtener acceso a un elemento de matriz con un puntero (Guía de programación de C#)
Manipular punteros
Vea también
Referencia
Conversiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Cómo: Obtener el valor de una variable de puntero (Guía de


programación de C#)
Utilice el operador de direccionamiento indirecto del puntero para obtener la variable en la ubicación indicada por un puntero.
La expresión tiene el formato siguiente, donde p es un tipo de puntero:

*p;

No se puede utilizar el operador de direccionamiento indirecto unario en una expresión de cualquier tipo distinta de la del tipo
de puntero. Tampoco se puede aplicar a un puntero void.
Cuando se aplica el operador de direccionamiento indirecto a un puntero null, el resultado depende de la implementación.
Ejemplo
En el ejemplo siguiente, se tiene acceso a una variable del tipo char mediante punteros de tipos diferentes. Hay que tener en
cuenta que la dirección de theChar variará de una ejecución a otra porque la dirección física asignada a una variable puede
cambiar.
C#
// compile with: /unsafe

C#
unsafe class TestClass
{
static void Main()
{
char theChar = 'Z';
char* pChar = &theChar;
void* pVoid = pChar;
int* pInt = (int*)pVoid;

System.Console.WriteLine("Value of theChar = {0}", theChar);


System.Console.WriteLine("Address of theChar = {0:X2}",(int)pChar);
System.Console.WriteLine("Value of pChar = {0}", *pChar);
System.Console.WriteLine("Value of pInt = {0}", *pInt);
}
}

Resultados del ejemplo


Value of theChar = Z
Address of theChar = 12F718
Value of pChar = Z
Value of pInt = 90

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Cómo: Obtener la dirección de una variable (Guía de


programación de C#)
Para obtener la dirección de una expresión unaria, que se evalúa como una variable fija, use el operador de dirección.

int number;
int* p = &number; //address-of operator &

El operador de dirección sólo se puede aplicar a una variable. Si la variable es una variable móvil, puede utilizar la
instrucción fixed para fijar temporalmente la variable antes de obtener su dirección.
Es responsabilidad del usuario asegurarse de que se inicialice la variable. El compilador no emitirá un mensaje de error si no se
inicializa la variable.
No se puede obtener la dirección de una constante o un valor.
Ejemplo
En este ejemplo, se declara un puntero a int, p, y se le asigna la dirección de una variable de entero, number. La variable number
se inicializa como resultado de la asignación a *p. Comentar esta instrucción de asignación eliminará la inicialización de la
variable number, pero no se emitirá un error de compilación. Observe el uso del operador Acceso a miembros -> para obtener
y mostrar la dirección almacenada en el puntero.
C#
// compile with: /unsafe

C#
class AddressOfOperator
{
static void Main()
{
int number;

unsafe
{
// Assign the address of number to a pointer:
int* p = &number;
// Commenting the following statement will remove the
// initialization of number.
*p = 0xffff;

// Print the value of *p:


System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p);
// Print the address stored in p:
System.Console.WriteLine("The address stored in p: {0}", p->ToString());
}
// Print the value of the variable number:
System.Console.WriteLine("Value of the variable number: {0:X}", number);
}
}

Resultados del ejemplo


Value at the location pointed to by p: FFFF
The address stored in p: 65535
Value of the variable number: FFFF
Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Cómo: Obtener acceso a un miembro con un puntero (Guía de


programación de C#)
Para tener acceso a un miembro de una estructura que se declara en un contexto no seguro, puede utilizar el operador de
acceso a miembros, como se muestra en el ejemplo siguiente en el que p es un puntero a una estructura que contiene un
miembro x.

CoOrds* p = &home;
p -> x = 25; //member access operator ->

Ejemplo
En este ejemplo, se declara una estructura, CoOrds, que contiene dos coordenadas x e y y se crean instancias de la misma.
Utilizando el operador de acceso a miembros -> y un puntero a la instancia home, se asignan valores a x e y.
Nota
Observe que la expresión p->x es equivalente a la expresión (*p).x y se puede obtener el mismo resultado utilizando cualqu
iera de las dos expresiones.

C#
// compile with: /unsafe

C#
struct CoOrds
{
public int x;
public int y;
}

class AccessMembers
{
static void Main()
{
CoOrds home;

unsafe
{
CoOrds* p = &home;
p->x = 25;
p->y = 12;
System.Console.WriteLine("The coordinates are: x={0}, y={1}", p->x, p->y );
}
}
}

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Cómo: Obtener acceso a un elemento de matriz con un puntero


(Guía de programación de C#)
En un contexto no seguro, puede tener acceso a un elemento en memoria utilizando el acceso a elementos de puntero, como
se muestra en el ejemplo siguiente:

char* charPointer = stackalloc char[123];


for (int i = 65; i < 123; i++)
{
charPointer[i] = (char)i; //access array elements
}

La expresión entre corchetes debe poder convertirse implícitamente en int, uint, long o ulong. La operación p[e] es
equivalente a *(p+e). Al igual que en C y C++, el acceso al elemento de puntero no comprueba errores fuera de los límites.
Ejemplo
En este ejemplo, se asignan 123 ubicaciones de memoria a una matriz de caracteres, charPointer. La matriz se utiliza para
mostrar las letras en minúscula y en mayúscula en dos bucles for.
Observe que la expresión charPointer[i] es equivalente a la expresión *(charPointer + i) y se puede obtener el mismo
resultado utilizando cualquiera de las dos expresiones.
C#
// compile with: /unsafe

C#
class Pointers
{
unsafe static void Main()
{
char* charPointer = stackalloc char[123];

for (int i = 65; i < 123; i++)


{
charPointer[i] = (char)i;
}

// Print uppercase letters:


System.Console.WriteLine("Uppercase letters:");
for (int i = 65; i < 91; i++)
{
System.Console.Write(charPointer[i]);
}
System.Console.WriteLine();
// Print lowercase letters:
System.Console.WriteLine("Lowercase letters:");
for (int i = 97; i < 123; i++)
{
System.Console.Write(charPointer[i]);
}
}
}

Resultados del ejemplo


Uppercase letters:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Lowercase letters:
abcdefghijklmnopqrstuvwxyz

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Manipular punteros (Guía de programación de C#)


Esta sección contiene las siguientes operaciones de puntero:
Incremento y decremento
Operaciones aritméticas
Comparación
Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Operadores de C#
Tipos de puntero (Guía de programación de C#)
/unsafe (Habilitar modo Unsafe) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Aumentar y disminuir punteros (Guía de programación


de C#)
Utilice los operadores de incremento y decremento, ++ y --, para cambiar la ubicación del puntero en sizeof (pointer-type)
para un puntero de tipo pointer-type*. Las expresiones de incremento y decremento adquieren la forma siguiente:

++p;
P++;
--p;
p--;

Los operadores de incremento y decremento se pueden aplicar a punteros de cualquier tipo, a excepción del tipo void*.
El efecto de aplicar el operador de incremento a un puntero del tipo pointer-type es agregar sizeof (pointer-type) a la dirección
que se encuentra en la variable del puntero.
El efecto de aplicar el operador de decremento a un puntero del tipo pointer-type es restar sizeof (pointer-type) de la dirección
que se encuentra en la variable del puntero.
No se genera ninguna excepción cuando la operación desborda el dominio del puntero y el resultado depende de la
implementación.
Ejemplo
En este ejemplo, se avanza a través de una matriz incrementando el puntero según el tamaño de int. Con cada paso que
avanza, se muestra la dirección y el contenido del elemento de matriz.
C#
// compile with: /unsafe

C#
class IncrDecr
{
unsafe static void Main()
{
int[] numbers = {0,1,2,3,4};

// Assign the array address to the pointer:


fixed (int* p1 = numbers)
{
// Step through the array elements:
for(int* p2=p1; p2<p1+numbers.Length; p2++)
{
System.Console.WriteLine("Value:{0} @ Address:{1}", *p2, (long)p2);
}
}
}
}

Resultados del ejemplo


Value:0 @ Address:12860272
Value:1 @ Address:12860276
Value:2 @ Address:12860280
Value:3 @ Address:12860284
Value:4 @ Address:12860288

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Operadores de C#
Manipular punteros (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Operaciones aritméticas en punteros (Guía de programación de


C#)
En este tema se analiza la utilización de los operadores aritméticos + y - para manipular punteros.
Nota
No se puede realizar ninguna operación aritmética en punteros nulos.

Sumar valores numéricos a punteros y restarlos de éstos


Puede agregar un valor n de tipo int, uint, long o ulong a un puntero, p, de cualquier tipo excepto void*. El resultado p+n es el
puntero que resulta de sumar n * sizeof(p) to the address of p. De forma similar, p-n es el puntero que resulta de restar
n * sizeof(p) de la dirección de p.

Restar punteros
También es posible restar punteros del mismo tipo. El resultado siempre es de tipo long. Por ejemplo, si p1 y p2 son punteros
del tipo pointer-type*, entonces la expresión p1-p2 da como resultado:
((long)p1 - (long)p2)/sizeof(pointer_type)

No se genera ninguna excepción cuando la operación aritmética desborda el dominio del puntero y el resultado depende de la
implementación.
Ejemplo
C#
// compile with: /unsafe

C#
class PointerArithmetic
{
unsafe static void Main()
{
int* memory = stackalloc int[30];
long* difference;
int* p1 = &memory[4];
int* p2 = &memory[10];
difference = (long*)(p2 - p1);

System.Console.WriteLine("The difference is: {0}", (long)difference);


}
}

Resultado
The difference is: 6

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
18.5.6 Aritmética de punteros
Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Operadores de C#
Manipular punteros (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Comparación de punteros (Guía de programación de C#)


Puede aplicar los operadores siguientes para comparar punteros de cualquier tipo:
== != < > <= >=
Los operadores de comparación comparan las direcciones de los dos operandos como si fueran enteros sin signo.
Ejemplo
C#
// compile with: /unsafe

C#
class CompareOperators
{
unsafe static void Main()
{
int x = 234;
int y = 236;
int* p1 = &x;
int* p2 = &y;

System.Console.WriteLine(p1 < p2);


System.Console.WriteLine(p2 < p1);
}
}

Resultados del ejemplo


True
False

Vea también
Referencia
Expresiones de puntero (Guía de programación de C#)
Operadores de C#
Manipular punteros (Guía de programación de C#)
Tipos de puntero (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
stackalloc (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Tipos (Referencia de C#)
Guía de programación de C#

Cómo: Utilizar punteros para copiar una matriz de bytes (Guía


de programación de C#)
El ejemplo siguiente utiliza punteros para copiar bytes de una matriz a otra.
En este ejemplo se utiliza la palabra clave unsafe, que permite el uso de punteros en el método Copy. La instrucción fixed se
utiliza para declarar punteros a las matrices de origen y destino. Así se fija la ubicación de las matrices de origen y destino en
memoria, para que no puedan ser desplazadas por la recolección de elementos no utilizados. Estos bloques de memoria se
liberan cuando finaliza el bloque fixed. Dado que la función Copy en este ejemplo utiliza la palabra clave unsafe, se debe
compilar con la opción del compilador /unsafe.
Ejemplo
C#
// compile with: /unsafe

C#
class TestCopy
{
// The unsafe keyword allows pointers to be used within the following method:
static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
{
if (src == null || srcIndex < 0 ||
dst == null || dstIndex < 0 || count < 0)
{
throw new System.ArgumentException();
}

int srcLen = src.Length;


int dstLen = dst.Length;
if (srcLen - srcIndex < count || dstLen - dstIndex < count)
{
throw new System.ArgumentException();
}

// The following fixed statement pins the location of the src and dst objects
// in memory so that they will not be moved by garbage collection.
fixed (byte* pSrc = src, pDst = dst)
{
byte* ps = pSrc;
byte* pd = pDst;

// Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a


time:
for (int i = 0 ; i < count / 4 ; i++)
{
*((int*)pd) = *((int*)ps);
pd += 4;
ps += 4;
}
// Complete the copy by moving any bytes that weren't moved in blocks of 4:
for (int i = 0; i < count % 4 ; i++)
{
*pd = *ps;
pd++;
ps++;
}
}
}

static void Main()


{
byte[] a = new byte[100];
byte[] b = new byte[100];

for (int i = 0; i < 100; ++i)


{
a[i] = (byte)i;
}
Copy(a, 0, b, 0, 100);
System.Console.WriteLine("The first 10 elements are:");

for (int i = 0; i < 10; ++i)


{
System.Console.Write(b[i] + " ");
}
System.Console.WriteLine("\n");
}
}

Resultados
The first 10 elements are:
0 1 2 3 4 5 6 7 8 9

Vea también
Tareas
Ejemplo de código no seguro
Referencia
/unsafe (Habilitar modo Unsafe) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Recolección de elementos no utilizados
Guía de programación de C#

Comentarios de documentación XML (Guía de programación de


C#)
En Visual C# puede crear documentación para el código si incluye etiquetas XML en campos de comentario especiales del
código fuente, directamente antes del bloque de código al que hacen referencia. Por ejemplo:

/// <summary>
/// This class performs an important function.
/// </summary>
public class MyClass{}

Cuando compila con la opción /doc, el compilador busca todas las etiquetas XML del código fuente y crea un archivo de
documentación XML.
Nota
Los comentarios de documentación XML no son metadatos; no se incluyen en el ensamblado compilado y, por tanto, no se p
uede obtener acceso a ellos mediante la reflexión.

En esta sección
Etiquetas recomendadas para comentarios de documentación
Procesar el archivo XML
Delimitadores para etiquetas de documentación
Cómo: Utilizar las características de documentación XML (Guía de programación de C#)

Secciones relacionadas
Para obtener más información al respecto, vea:
/doc (procesar comentarios de documentación)
Ejemplo XML Documentation
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
Apéndice A Comentarios de la documentación

Vea también
Conceptos
Guía de programación de C#
Guía de programación de C#

Etiquetas recomendadas para comentarios de documentación


(Guía de programación de C#)
El compilador de C# procesa los comentarios de documentación del código y genera con ellos un archivo XML. El
procesamiento del archivo XML para crear documentación es un detalle que se debe implementar localmente.
Las etiquetas se procesan sobre construcciones de código, tales como tipos y miembros de tipos.
Nota
Los comentarios de documentación no se pueden aplicar a un espacio de nombres.

El compilador procesará cualquier etiqueta válida en XML. Las siguientes etiquetas proporcionan la funcionalidad habitual en la
documentación de usuario:

<c> <para> <see>*

<code> <param>* <seealso>*

<example> <paramref> <summary>

<exception>* <permission>* <typeparam>*

<include>* <remarks> <typeparamref>

<list> <returns> <value>

(* indica que el compilador comprueba la sintaxis.)


Si desea que en el texto de un comentario de documentación aparezcan corchetes angulares, utilice &lt; y &gt;. Por ejemplo,
&lt;texto entre corchetes angulares&gt;.
Vea también
Tareas
Ejemplo XML Documentation
Referencia
/doc (Procesar comentarios de documentación) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Comentarios de documentación XML (Guía de programación de C#)
Comentarios de documentación XML (Guía de programación de C#)
Guía de programación de C#

<c> (Guía de programación de C#)

<c>text</c>

Parámetros
text
Texto que se desea marcar como código.
Comentarios
La etiqueta <c> proporciona un modo de indicar que el texto de una descripción se debería marcar como código. Utilice
<code> para marcar varias líneas como código.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <summary><c>DoWork</c> is a method in the <c>TestClass</c> class.
/// </summary>
public static void DoWork(int Int1)
{
}

/// text for Main


static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<code> (Guía de programación de C#)

<code>content</code>

Parámetros
content
Texto que se desea marcar como código.
Comentarios
La etiqueta <code> proporciona un modo de marcar varias líneas como código. Utilice <c> para indicar que el texto de una
descripción se debería marcar como código.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
Vea el tema <example> para obtener un ejemplo sobre la utilización de la etiqueta <code>.
Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<example> (Guía de programación de C#)

<example>description</example>

Parámetros
description
Descripción del ejemplo de código.
Comentarios
La etiqueta <example> permite especificar un ejemplo de cómo utilizar un método u otro miembro de una biblioteca.
Generalmente, esto supone utilizar la etiqueta <code>.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <summary>
/// The GetZero method.
/// </summary>
/// <example> This sample shows how to call the GetZero method.
/// <code>
/// class TestClass
/// {
/// static int Main()
/// {
/// return GetZero();
/// }
/// }
/// </code>
/// </example>
public static int GetZero()
{
return 0;
}

/// text for Main


static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<exception> (Guía de programación de C#)

<exception cref="member">description</exception>

Parámetros
cref = "member"
Referencia a una excepción disponible desde el entorno de compilación actual. El compilador comprueba si existe la
excepción dada y convierte member al nombre de elemento canónico en el resultado XML. member debe aparecer entre
comillas dobles (" ").
Para obtener más información sobre cómo crear una referencia cref a un tipo genérico, vea
<see> (Guía de programación de C#).
description
Descripción de la excepción.
Comentarios
La etiqueta <exception> permite especificar las excepciones que se pueden producir. Esta etiqueta puede aplicarse a las
definiciones de métodos, propiedades, eventos e indizadores.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// comment for class


public class EClass : System.Exception
{
// class definition...
}

/// comment for class


class TestClass
{
/// <exception cref="System.Exception">Thrown when...</exception>
public void DoSomething()
{
try
{
}
catch (EClass)
{
}
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<include> (Guía de programación de C#)

<include file='filename' path='tagpath[@name="id"]' />

Parámetros
filename
Nombre del archivo que contiene la documentación. El nombre de archivo se puede completar con una ruta de acceso.
Agregue filename entre comillas simples (' ').
tagpath
Ruta de acceso de las etiquetas de filename que conduce a la etiqueta name. Ponga la ruta de acceso entre comillas simples
(' ').
name
Especificador de nombre en la etiqueta que precede a los comentarios; name poseerá un id.
id
Identificador para la etiqueta que precede a los comentarios. Ponga el id. entre comillas dobles (" ").
Comentarios
La etiqueta <include> permite hacer referencia a comentarios colocados en otro archivo que describen los tipos y miembros
del código fuente. Ésta es una alternativa al método habitual de colocar los comentarios de la documentación directamente en
el archivo de código fuente.
La etiqueta <include> utiliza la sintaxis XPath de XML. Consulte la documentación de XPath para conocer diversos modos de
personalizar el uso de <include>.
Ejemplo
Este ejemplo utiliza varios archivos. El primer archivo, que utiliza <include>, se muestra a continuación:
C#
// compile with: /doc:DocFileName.xml
/// <include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test"]/*' />
class Test
{
static void Main()
{
}
}
/// <include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test2"]/*' />
class Test2
{
public void Test()
{
}
}

El segundo archivo, xml_include_tag.doc, contiene los siguientes comentarios de documentación:

<MyDocs>

<MyMembers name="test">
<summary>
The summary for this type.
</summary>
</MyMembers>
<MyMembers name="test2">
<summary>
The summary for this other type.
</summary>
</MyMembers>

</MyDocs>

Resultado del programa


<?xml version="1.0"?>
<doc>
<assembly>
<name>xml_include_tag</name>
</assembly>
<members>
<member name="T:Test">
<summary>
The summary for this type.
</summary>
</member>
<member name="T:Test2">
<summary>
The summary for this other type.
</summary>
</member>
</members>
</doc>

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<list> (Guía de programación de C#)

<list type="bullet" | "number" | "table">


<listheader>
<term>term</term>
<description>description</description>
</listheader>
<item>
<term>term</term>
<description>description</description>
</item>
</list>

Parámetros
term
Término que se define en description.
description
Elemento de una lista numerada o con viñetas, o definición de un term.
Comentarios
El bloque <listheader> se utiliza para definir la fila de encabezado de una tabla o de una lista de definiciones. Cuando se define
una tabla, sólo es necesario suministrar una entrada para un término en el encabezado.
Cada elemento de la lista se especifica con un bloque <item>. Cuando se crea una lista de definiciones, se deberán especificar
tanto term como description. Sin embargo, para una tabla, lista con viñetas o lista numerada, sólo es necesario suministrar una
entrada para description.
Una lista o una tabla pueden tener tantos bloques <item> como sean necesarios.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <summary>Here is an example of a bulleted list:
/// <list type="bullet">
/// <item>
/// <description>Item 1.</description>
/// </item>
/// <item>
/// <description>Item 2.</description>
/// </item>
/// </list>
/// </summary>
static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<para> (Guía de programación de C#)

<para>content</para>

Parámetros
content
Texto del párrafo.
Comentarios
La etiqueta <para> se utiliza dentro de otra etiqueta, tal como <summary>, <remarks> o <returns>, y permite dar una
estructura al texto.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
Vea <summary> para obtener un ejemplo del uso de <para>.
Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<param> (Guía de programación de C#)

<param name='name'>description</param>

Parámetros
name
Nombre de un parámetro de método. Ponga el nombre entre comillas dobles (" ").
description
Descripción del parámetro.
Comentarios
La etiqueta <param> se debe utilizar en el comentario de una declaración de método para describir uno de los parámetros del
método.
El texto para la etiqueta <param> se mostrará en IntelliSense, el Examinador de objetos y en el Informe Web de comentario de
código.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <param name="Int1">Used to indicate status.</param>
public static void DoWork(int Int1)
{
}
/// text for Main
static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<paramref> (Guía de programación de C#)

<paramref name="name"/>

Parámetros
name
Nombre del parámetro al que hay que hacer referencia. Ponga el nombre entre comillas dobles (" ").
Comentarios
La etiqueta <paramref> proporciona una forma de indicar que una palabra en los comentarios del código, por ejemplo en un
bloque <summary> o <remarks>, hace referencia a un parámetro. El archivo XML se puede procesar para dar formato a esta
palabra de alguna manera distinta, como con una fuente en negrita o en cursiva.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <summary>DoWork is a method in the TestClass class.
/// The <paramref name="Int1"/> parameter takes a number.
/// </summary>
public static void DoWork(int Int1)
{
}

/// text for Main


static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<permission> (Guía de programación de C#)

<permission cref="member">description</permission>

Parámetros
cref = "member"
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador comprueba
si el elemento de código dado existe y convierte member al nombre de elemento canónico en el resultado XML. member
debe aparecer entre comillas dobles (" ").
Para obtener información sobre cómo crear una referencia de tipo cref a un tipo genérico, vea
<see> (Guía de programación de C#).
description
Descripción del acceso al miembro.
Comentarios
La etiqueta <permission> permite documentar el acceso de un miembro. La clase PermissionSet permite especificar el acceso
a un miembro.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

class TestClass
{
/// <permission cref="System.Security.PermissionSet">Everyone can access this method.</
permission>
public static void Test()
{
}

static void Main()


{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<remarks> (Guía de programación de C#)

<remarks>description</remarks>

Parámetros
Description
Descripción del miembro.
Comentarios
La etiqueta <remarks> se utiliza para agregar información sobre un tipo, de modo que completa la información especificada
con <summary>. Esta información se muestra en el Examinador de objetos.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// <summary>
/// You may have some primary information about this class.
/// </summary>
/// <remarks>
/// You may have some additional information about this class.
/// </remarks>
public class TestClass
{
/// text for Main
static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<returns> (Guía de programación de C#)

<returns>description</returns>

Parámetros
description
Descripción del valor devuelto.
Comentarios
La etiqueta <returns> se debe utilizar en el comentario de una declaración de método para describir el valor devuelto.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <returns>Returns zero.</returns>
public static int GetZero()
{
return 0;
}

/// text for Main


static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<see> (Guía de programación de C#)

<see cref="member"/>

Parámetros
cref = "member"
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador comprueba
si el elemento de código dado existe y pasa member al nombre de elemento en el resultado XML. Agregue member entre
comillas dobles (" ").
Comentarios
La etiqueta <see> permite especificar un vínculo desde dentro del texto. Utilice <seealso> para indicar que el texto debe
colocarse en una sección Vea también.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Vea <summary> para obtener un ejemplo del uso de <see>.
Ejemplo
El ejemplo siguiente muestra cómo convertir una referencia cref en un tipo genérico.
C#
// compile with: /doc:DocFileName.xml

// the following cref shows how to specify the reference, such that,
// the compiler will resolve the reference
/// <summary cref="C{T}">
/// </summary>
class A { }

// the following cref shows another way to specify the reference,


// such that, the compiler will resolve the reference
// <summary cref="C &lt; T &gt;">

// the following cref shows how to hard-code the reference


/// <summary cref="T:C`1">
/// </summary>
class B { }
/// <summary cref="A">
/// </summary>
/// <typeparam name="T"></typeparam>
class C<T> { }

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<seealso> (Guía de programación de C#)

<seealso cref="member"/>

Parámetros
cref = "member"
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador comprueba
si el elemento de código dado existe y pasa member al nombre de elemento en el resultado XML. member debe aparecer
entre comillas dobles (" ").
Para obtener información sobre cómo crear una referencia de tipo cref a un tipo genérico, vea
<see> (Guía de programación de C#).
Comentarios
La etiqueta <seealso> permite especificar el texto que se desea que aparezca en una sección Vea también. Utilice <see> para
especificar un vínculo desde dentro del texto.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
Vea <summary> para obtener un ejemplo del uso de <seealso>.
Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<summary> (Guía de programación de C#)

<summary>description</summary>

Parámetros
description
Resumen del objeto.
Comentarios
La etiqueta <summary> se utiliza para describir un tipo o un miembro de tipo. Utilice <remarks> para suministrar
información adicional a una descripción de tipo.
El texto de la etiqueta <summary> es la única fuente de información sobre el tipo en IntelliSense y también se muestra en el
Examinador de objetos.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class TestClass


public class TestClass
{
/// <summary>DoWork is a method in the TestClass class.
/// <para>Here's how you could make a second paragraph in a description. <see cref="Sys
tem.Console.WriteLine(System.String)"/> for information about output statements.</para>
/// <seealso cref="TestClass.Main"/>
/// </summary>
public static void DoWork(int Int1)
{
}

/// text for Main


static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<typeparam> (Guía de programación de C#)

<typeparam name="name">description</typeparam>

Parámetros
name
Nombre del parámetro de tipo. Ponga el nombre entre comillas dobles (" ").
description
Descripción del parámetro de tipo.
Comentarios
La etiqueta <typeparam> se debería utilizar en el comentario de una declaración de tipo o método genérico para describir un
parámetro de tipo. Agregue una etiqueta para cada parámetro de tipo del tipo o método genérico.
Para obtener más información, vea Genéricos (Guía de programación de C#).
El texto de la etiqueta <typeparam> se mostrará en IntelliSense, el informe Web de comentario de código de
Examinador de objetos.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Vea <typeparamref> (Guía de programación de C#) para obtener un ejemplo de código que muestra cómo utilizar
<typeparam>.
Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Guía de programación de C#

<typeparamref> (Guía de programación de C#)

<typeparamref name="name"/>

Parámetros
name
Nombre del parámetro de tipo. Ponga el nombre entre comillas dobles (" ").
Comentarios
Para obtener más información sobre los parámetros de tipo en tipos y métodos genéricos, vea Genéricos.
Utilice esta etiqueta para permitir a los consumidores del archivo de documentación dar formato a la palabra de una manera
distinta, por ejemplo en cursiva.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// comment for class


public class TestClass
{
/// <summary>
/// Creates a new array of arbitrary type <typeparamref name="T"/>
/// </summary>
/// <typeparam name="T">The element type of the array</typeparam>
public static T[] mkArray<T>(int n)
{
return new T[n];
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

<value> (Guía de programación de C#)

<value>property-description</value>

Parámetros
property-description
Descripción de la propiedad.
Comentarios
La etiqueta <value> permite describir el valor que representa una propiedad. Tenga en cuenta que al agregar una propiedad a
través de un asistente para código en el entorno de desarrollo de Visual Studio .NET, se agregará una etiqueta <summary>
para la nueva propiedad. A continuación, se debe agregar manualmente una etiqueta <value> que describa el valor que
representa la propiedad.
Compile con el parámetro /doc para procesar los comentarios de documentación y generar un archivo con ellos.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// text for class Employee


public class Employee
{
private string _name;

/// <summary>The Name property represents the employee's name.</summary>


/// <value>The Name property gets/sets the _name data member.</value>
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
/// text for class MainClass
public class MainClass
{
/// text for Main
static void Main()
{
}
}

Vea también
Referencia
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Procesar el archivo XML (Guía de programación de C#)


El compilador genera una cadena id. por cada construcción del código marcada para generar documentación. Para obtener
información sobre cómo etiquetar el código, vea Etiquetas recomendadas para comentarios de documentación). La cadena id.
identifica de forma exclusiva cada construcción. Los programas que procesan el archivo XML pueden utilizar la cadena id. para
identificar el correspondiente elemento de metadatos/reflexión de .NET Framework al que se aplica la documentación.
El archivo XML no es una representación jerárquica del código; es una lista sencilla con un identificador generado para cada
elemento.
El compilador cumple las siguientes reglas cuando genera las cadenas id.:
No se coloca ningún espacio en blanco en la cadena.
La primera parte de la cadena de id. identifica el tipo de miembro por medio de un único carácter seguido de dos puntos.
Se utilizan los siguientes tipos de miembros:
Carác Descripción
ter
N espacio de nombres (namespace)
No se pueden agregar comentarios de documentación a un espacio de nombres, pero se pueden hacer referencia
s cref a ellos donde se admitan.

T tipo: class, interface, struct, enum, delegate

F campo

P propiedad (incluidos indizadores u otras propiedades indizadas)

M método (incluidos métodos especiales como constructores, operadores, etc.)

E evento

! cadena de error
El resto de la cadena proporciona información acerca del error. El compilador de C# genera información de error
para vínculos que no se pueden resolver.

La segunda parte de la cadena es el nombre completo del elemento, empezando en la raíz del espacio de nombres. El
nombre del elemento, los tipos contenedores y el espacio de nombres se separan mediante puntos. Si el propio nombre
del elemento contiene puntos, éstos se reemplazan por el signo #. Se supone que ningún elemento contiene un signo #
directamente en su nombre. Por ejemplo, el nombre completo del constructor de String sería "System.String.#ctor".
Para propiedades y métodos, si existen argumentos para el método, la lista de argumentos que se encuentra entre
paréntesis aparece a continuación. Si no existen argumentos, no se escribe ningún paréntesis. Los argumentos se
separan por comas. La codificación de cada argumento indica directamente cómo se codifica en una firma de .NET
Framework:
Tipos base. Los tipos normales (ELEMENT_TYPE_CLASS o ELEMENT_TYPE_VALUETYPE) se representan como el
nombre completo del tipo.
Tipos intrínsecos (por ejemplo, ELEMENT_TYPE_I4, ELEMENT_TYPE_OBJECT, ELEMENT_TYPE_STRING,
ELEMENT_TYPE_TYPEDBYREF y ELEMENT_TYPE_VOID). Se representan como el nombre completo del
correspondiente tipo completo. Por ejemplo, System.Int32 o System.TypedReference.
ELEMENT_TYPE_PTR se representa con un '*' a continuación del tipo modificado.
ELEMENT_TYPE_BYREF se representa con un signo '@' a continuación del tipo modificado.
ELEMENT_TYPE_PINNED se representa con un signo '^' a continuación del tipo modificado. El compilador de C#
nunca genera este resultado.
ELEMENT_TYPE_CMOD_REQ se representa como una '|' y el nombre completo de la clase modificadora, a
continuación del tipo modificado. El compilador de C# nunca genera este resultado.
ELEMENT_TYPE_CMOD_OPT se representa como un '!' y el nombre completo de la clase modificadora, a
continuación del tipo modificado.
ELEMENT_TYPE_SZARRAY se representa como "[]" a continuación del tipo de elemento de la matriz.
ELEMENT_TYPE_GENERICARRAY se representa como "[?]" a continuación del tipo de elemento de la matriz. El
compilador de C# nunca genera este resultado.
ELEMENT_TYPE_ARRAY se representa como [límite inferior:size,límite inferior:size] donde el número de comas es
el rango, 1, y los límites inferiores y el tamaño de cada dimensión, si se conocen, se representan en decimal. Si no
se especifica un límite inferior ni un tamaño, simplemente se omite. Si el límite inferior y el tamaño de una
dimensión particular se omiten, el signo ':' también se omite. Por ejemplo, una matriz de dos dimensiones con 1
como límites inferiores y sin tamaños especificados se representa como [1:,1:].
ELEMENT_TYPE_FNPTR se representa como "=FUNC:type (firma)", donde type es el tipo de valor devuelto y firma
corresponde a los argumentos del método. Si no existen argumentos, los paréntesis se omiten. El compilador de
C# nunca genera este resultado.
Los siguientes componentes de una firma no se representan porque nunca se utilizan para diferenciar métodos
sobrecargados:
convención de llamadas
tipo de valor devuelto
ELEMENT_TYPE_SENTINEL
Sólo para operadores de conversión (op_Implicit y op_Explicit), el valor devuelto del método se codifica como un signo
'~' seguido del tipo de valor devuelto.
En los tipos genéricos, el nombre del tipo va seguido de un acento invertido y de un número que indica el número de
parámetros de tipo genérico. Por ejemplo,
<member name="T:SampleClass`2"> es la etiqueta para un tipo definido como public class SampleClass<T, U>.

Para métodos que toman tipos genéricos como parámetros, los parámetros de tipo genérico se especifican como
números con un acento invertido antepuesto (por ejemplo `0, `1). Cada número representa una notación de matrices
basada en cero en los parámetros genéricos del tipo.
Ejemplos
Los siguientes ejemplos muestran cómo se generarían las cadenas de id. para una clase y sus miembros:
C#
///
///
namespace N // "N:N"
{
///
///
public unsafe class X // "T:N.X"
{
public X(){}
//----------------------------
// The result of the above is:
// "M:N.X.#ctor"

/// <param name="i"></param>


public X(int i){}
//----------------------------
// The result of the above is:
// "M:N.X.#ctor(System.Int32)"
~X(){}
//----------------------------
// The result of the above is:
// "M:N.X.Finalize", destructor's representation in metadata

public string q;
//----------------------------
// The result of the above is:
// "F:N.X.q"

/// <returns></returns>
public const double PI = 3.14;
//----------------------------
// The result of the above is:
// "F:N.X.PI"

/// <param name="s"></param>


/// <param name="y"></param>
/// <param name="z"></param>
/// <returns></returns>
public int f(){return 1;}
//----------------------------
// The result of the above is:
// "M:N.X.f"

/// <param name="array1"></param>


/// <param name="array"></param>
/// <returns></returns>
public int bb(string s, ref int y, void * z){return 1;}
//----------------------------
// The result of the above is:
// "M:N.X.bb(System.String,System.Int32@,=System.Void*)"

/// <param name="x"></param>


/// <param name="xx"></param>
/// <returns></returns>
public int gg(short[] array1, int[,] array){return 0;}
//----------------------------
// The result of the above is:
// "M:N.X.gg(System.Int16[], System.Int32[0:,0:])"

public static X operator+(X x, X xx){return x;}


//----------------------------
// The result of the above is:
// "M:N.X.op_Addition(N.X,N.X)"

public int prop {get{return 1;} set{}}


//----------------------------
// The result of the above is:
// "P:N.X.prop"

public event D d;
//----------------------------
// The result of the above is:
// "E:N.X.d"

public int this[string s]{get{return 1;}}


//----------------------------
// The result of the above is:
// "P:N.X.Item(System.String)"

public class Nested{}


//----------------------------
// The result of the above is:
// "T:N.X.Nested"

public delegate void D(int i);


//----------------------------
// The result of the above is:
// "T:N.X.D"

/// <param name="x"></param>


/// <returns></returns>
public static explicit operator int(X x){return 1;}
//----------------------------
// The result of the above is:
// "M:N.X.op_Explicit(N.X)~System.Int32"
}
}

Vea también
Tareas
Ejemplo XML Documentation
Referencia
/doc (Procesar comentarios de documentación) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Comentarios de documentación XML (Guía de programación de C#)
Guía de programación de C#

Delimitadores de etiquetas de documentación (Guía de


programación de C#)
La utilización de comentarios de documentación XML requiere delimitadores, que indican al compilador el inicio y el final de
un comentario de documentación. Puede utilizar los siguientes tipos de delimitadores con las etiquetas de documentación
XML:
///

Ésta es la forma que se muestra en los ejemplos de documentación y que usan las plantillas de proyectos de Visual C#.
Nota
El IDE de Visual Studio tiene una función llamada Edición de comentarios automática, que inserta automáticamente las etiq
uetas <summary> y </summary> y sitúa el cursor entre ambas después de que haya escrito el delimitador /// en el Edito
r de código. El acceso a esta característica se encuentra en Formato, C#/J#, Editor de texto, Opciones (Cuadro de diálogo) e
n sus páginas de propiedad del proyecto.

/** */

Delimitadores de múltiples líneas.


Existen algunas reglas de formato al usar los delimitadores /** */.

Si el resto de la línea que contiene el delimitador /** está en blanco, la línea no se procesa para comentarios. Si el
primer carácter es un espacio en blanco, éste se omite y se procesa el resto de la línea. En caso contrario, todo el texto de
la línea que se encuentra después del delimitador /** se procesa como parte del comentario.
Si en la línea que contiene el delimitador */ sólo hay espacio en blanco hasta dicho delimitador, se omite la línea. En caso
contrario, el texto que hay en la línea hasta el delimitador */ se procesa como parte del comentario, sujeto a las reglas
del patrón de coincidencia que se describen en el apartado siguiente:
Para las líneas que siguen a una que empieza con el delimitador /**, el compilador busca un patrón común al principio
de cada línea que consiste en espacios en blanco opcionales y un asterisco (*), seguido de más espacios en blanco
opcionales. Si el compilador encuentra un conjunto de caracteres común al principio de cada línea, omitirá este patrón
para todas las líneas que se encuentran después del delimitador /** hasta la línea que contiene el delimitador */ y,
posiblemente, incluyendo esta última.
Algunos ejemplos:
La única parte del siguiente comentario que se procesará es la línea que comienza con <summary>. Los dos formatos de
etiquetas siguientes producirán los mismos comentarios:
/**

<summary>text</summary>

*/

/** <summary>text</summary> */

El compilador aplica un patrón de " * " para omitir al principio de la segunda y tercera líneas.
/**

* <summary>

* text </summary>*/

El compilador no encuentra ningún patrón en este comentario porque no hay ningún asterisco en la segunda línea. Por
lo tanto, todo el texto que hay en la segunda y tercera líneas, hasta el delimitador */, se procesará como parte del
comentario.
/**
* <summary>

text </summary>*/

El compilador no encuentra ningún patrón en este comentario por dos razones. En primer lugar, ninguna línea comienza
con un número de espacios coherente delante del asterisco. En segundo lugar, la quinta línea comienza con una etiqueta,
que no coincide con los espacios. Por lo tanto, todo el texto que hay a partir de la segunda línea hasta el delimitador */ se
procesará como parte del comentario.
/**

* <summary>

* text

* text2

* </summary>

*/

Vea también
Tareas
Ejemplo XML Documentation
Referencia
/doc (Procesar comentarios de documentación) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Comentarios de documentación XML (Guía de programación de C#)
Comentarios de documentación XML (Guía de programación de C#)
Guía de programación de C#

Cómo: Utilizar las características de documentación XML (Guía


de programación de C#)
El siguiente ejemplo proporciona una descripción básica de un tipo documentado.
Ejemplo
C#
// compile with: /doc:DocFileName.xml

/// <summary>
/// Class level summary documentation goes here.</summary>
/// <remarks>
/// Longer comments can be associated with a type or member
/// through the remarks tag</remarks>
public class TestClass
{
/// <summary>
/// Store for the name property</summary>
private string _name = null;

/// <summary>
/// The class constructor. </summary>
public TestClass()
{
// TODO: Add Constructor Logic here
}

/// <summary>
/// Name property </summary>
/// <value>
/// A value tag is used to describe the property value</value>
public string Name
{
get
{
if (_name == null)
{
throw new System.Exception("Name is null");
}
return _name;
}
}

/// <summary>
/// Description for SomeMethod.</summary>
/// <param name="s"> Parameter description for s goes here</param>
/// <seealso cref="System.String">
/// You can use the cref attribute on any tag to reference a type or member
/// and the compiler will check that the reference exists. </seealso>
public void SomeMethod(string s)
{
}
/// <summary>
/// Some other method. </summary>
/// <returns>
/// Return results are described through the returns tag.</returns>
/// <seealso cref="SomeMethod(string)">
/// Notice the use of the cref attribute to reference a specific method </seealso>
public int SomeOtherMethod()
{
return 0;
}
/// <summary>
/// The entry point for the application.
/// </summary>
/// <param name="args"> A list of command line arguments</param>
static int Main(System.String[] args)
{
// TODO: Add code to start application here
return 0;
}
}

Resultados del ejemplo


// This .xml file was generated with the previous code sample.
<?xml version="1.0"?>
<doc>
<assembly>
<name>xmlsample</name>
</assembly>
<members>
<member name="T:SomeClass">
<summary>
Class level summary documentation goes here.</summary>
<remarks>
Longer comments can be associated with a type or member
through the remarks tag</remarks>
</member>
<member name="F:SomeClass.m_Name">
<summary>
Store for the name property</summary>
</member>
<member name="M:SomeClass.#ctor">
<summary>The class constructor.</summary>
</member>
<member name="M:SomeClass.SomeMethod(System.String)">
<summary>
Description for SomeMethod.</summary>
<param name="s"> Parameter description for s goes here</param>
<seealso cref="T:System.String">
You can use the cref attribute on any tag to reference a type or member
and the compiler will check that the reference exists. </seealso>
</member>
<member name="M:SomeClass.SomeOtherMethod">
<summary>
Some other method. </summary>
<returns>
Return results are described through the returns tag.</returns>
<seealso cref="M:SomeClass.SomeMethod(System.String)">
Notice the use of the cref attribute to reference a specific method </seeal
so>
</member>
<member name="M:SomeClass.Main(System.String[])">
<summary>
The entry point for the application.
</summary>
<param name="args"> A list of command line arguments</param>
</member>
<member name="P:SomeClass.Name">
<summary>
Name property </summary>
<value>
A value tag is used to describe the property value</value>
</member>
</members>
</doc>

Compilar el código
Para compilar el ejemplo, escriba lo siguiente en la línea de comandos:
csc XMLsample.cs /doc:XMLsample.xml
Se creará el archivo XMLsample.xml, el cual se puede ver en el explorador o con el comando TYPE.
Programación eficaz
La documentación XML empieza con ///. Cuando se crea un proyecto nuevo, el asistente agrega automáticamente algunas
líneas iniciales con ///. El procesamiento de estos comentarios presenta algunas restricciones:
La documentación debe estar en XML bien formado. Si el XML no está bien formado, se generará un error de advertencia
y el archivo de documentación incluirá un comentario que mencione el error encontrado.
Los programadores pueden crear su propio conjunto de etiquetas. Existe un conjunto de etiquetas recomendado (vea la
sección Información adicional). Algunas de las etiquetas recomendadas tienen significados especiales:
La etiqueta <param> se usa para describir parámetros. Cuando se utiliza, el compilador comprueba si el
parámetro existe y si todos los parámetros están descritos en la documentación. Si la comprobación no tiene
éxito, el compilador emite una advertencia.
El atributo cref se puede asociar a cualquier etiqueta para proporcionar una referencia a un elemento de código.
El compilador comprobará si existe ese elemento de código. Si la comprobación no tiene éxito, el compilador
emite una advertencia. El compilador respeta cualquier instrucción using cuando busca un tipo descrito en el
atributo cref.
La etiqueta <summary> la utiliza IntelliSense, dentro de Visual Studio, para mostrar información adicional acerca
de un tipo o un miembro.
Nota
El archivo XML no proporciona información completa acerca del tipo y los miembros (por ejemplo, no contiene ninguna info
rmación de tipos). Para obtener información completa acerca de un tipo o miembro, el archivo de documentación debe utiliz
arse conjuntamente con el mecanismo de reflexión sobre el tipo o el miembro real.

Vea también
Tareas
Ejemplo XML Documentation
Referencia
/doc (Procesar comentarios de documentación) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Comentarios de documentación XML (Guía de programación de C#)
Comentarios de documentación XML (Guía de programación de C#)
Guía de programación de C#

Dominios de aplicación (Guía de programación de C#)


Los dominios de aplicación proporcionan un método flexible y seguro para aislar aplicaciones en ejecución.
Normalmente, los dominios de aplicación se crean y manipulan mediante hosts en tiempo de ejecución. Es posible que,
ocasionalmente, la aplicación interactúe mediante programación con los dominios de aplicación, por ejemplo, para descargar
un componente sin tener que detener la aplicación que se está ejecutando.
Los dominios de aplicación ayudan a mejorar la seguridad separando las aplicaciones y sus correspondientes datos. Un
proceso único puede ejecutar varios dominios de aplicación con el mismo nivel de aislamiento que existiría en procesos
independientes. Al ejecutar varias aplicaciones dentro de un proceso único, se aumenta la escalabilidad del servidor.
En el siguiente ejemplo de código, cree un nuevo dominio de aplicación y, a continuación, cargue y ejecute un ensamblado
generado previamente, HelloWorld.exe, que se encuentra en el disco C.
C#
static void Main()
{
// Create an Application Domain:
System.AppDomain newDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

// Load and execute an assembly:


newDomain.ExecuteAssembly(@"c:\HelloWorld.exe");

// Unload the application domain:


System.AppDomain.Unload(newDomain);
}

Información general sobre dominios de aplicación


Los dominios de aplicación tienen las siguientes propiedades:
Para poder ejecutar un ensamblado, éste debe cargarse antes en un dominio de aplicación. Para obtener más
información, vea Ensamblados y Caché de ensamblados global (Guía de programación de C#).
Los errores de un dominio de aplicación no pueden afectar al código que se esté ejecutando en otro dominio de
aplicación.
Es posible detener aplicaciones individuales y descargar el código sin detener todo el proceso. No puede descargar
ensamblados o tipos individuales, sólo dominios de aplicación completos.
Secciones relacionadas
Información general sobre dominios de aplicación
Dominios de aplicación
Dominios de aplicación y ensamblados
Programar con dominios de aplicación
Programar con dominios de aplicación y ensamblados
Ejecutar código en otro dominio de aplicación (Guía de programación de C#)
Cómo: Crear y utilizar un dominio de aplicación (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.1 Inicio de aplicación
Vea también
Conceptos
Guía de programación de C#
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Guía de programación de C#

Ejecutar código en otro dominio de aplicación (Guía de


programación de C#)
Una vez que se carga un ensamblado en un dominio de aplicación, se puede ejecutar el código que contiene. La forma más
sencilla de hacerlo es utilizar AssemblyLoad, que cargará el ensamblado en el dominio de aplicación actual, y comenzar la
ejecución del código en el punto de entrada predeterminado del ensamblado.
Si desea cargar el ensamblado en otro dominio de la aplicación, utilice ExecuteAssembly o ExecuteAssemblyByName, o una de
las otras versiones sobrecargadas de estos métodos.
Si desea ejecutar el otro ensamblado a partir de un punto de entrada distinto del predeterminado, defina un nuevo tipo en el
ensamblado remoto, que deriva de MarshalByRefObject. A continuación, utilice CreateInstance para crear una instancia de ese
tipo en la aplicación.
Observe el siguiente archivo que crea un ensamblado que consiste en un espacio de nombres único y dos clases. Suponga que
este ensamblado se ha generado y se ha guardado en la unidad C con el nombre HelloWorldRemote.exe.
C#
// This namespace contains code to be called.
namespace HelloWorldRemote
{
public class RemoteObject : System.MarshalByRefObject
{
public RemoteObject()
{
System.Console.WriteLine("Hello, World! (RemoteObject Constructor)");
}
}
class Program
{
static void Main()
{
System.Console.WriteLine("Hello, World! (Main method)");
}
}
}

Para tener acceso al código desde otra aplicación, puede cargar el ensamblado en el dominio de aplicación actual o crear un
nuevo dominio de aplicación y cargarle el ensamblado. Si carga el ensamblado en el dominio de aplicación actual con
Assembly.LoadFrom, puede utilizar Assembly.CreateInstance para crear una instancia de la clase RemoteObject, lo que
hace que se ejecute el constructor del objeto.
C#
static void Main()
{
// Load the assembly into the current appdomain:
System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\Hello
WorldRemote.exe");
// Instantiate RemoteObject:
newAssembly.CreateInstance("HelloWorldRemote.RemoteObject");
}

Cuando cargue el ensamblado en un dominio de aplicación independiente, utilice AppDomain.ExecuteAssembly para tener
acceso al punto de entrada predeterminado o AppDomain.CreateInstance para crear una instancia de la clase
RemoteObject. La creación de la instancia hace que se ejecute el constructor.
C#
static void Main()
{
System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

// Load the assembly and call the default entry point:


NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe");
// Create an instance of RemoteObject:
NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObj
ect");
}

Si no desea cargar el ensamblado mediante programación, utilice Agregar referencia del Explorador de soluciones para
especificar el ensamblado HelloWorldRemote.exe. A continuación, agregue una directiva using HelloWorldRemote; al bloque
using de la aplicación y utilice el tipo RemoteObject en el programa para declarar una instancia del objeto RemoteObject, de
la forma siguiente:
C#
static void Main()
{
// This code creates an instance of RemoteObject, assuming HelloWorldRemote has been ad
ded as a reference:
HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}

Vea también
Referencia
Dominios de aplicación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Información general sobre dominios de aplicación
Dominios de aplicación y ensamblados
Programar con dominios de aplicación
Otros recursos
Dominios de aplicación
Programar con dominios de aplicación y ensamblados
Guía de programación de C#

Cómo: Crear y utilizar un dominio de aplicación (Guía de


programación de C#)
Los dominios de aplicación proporcionan un método para aislar el código con fines de seguridad y rendimiento. Para obtener
más información, vea Dominios de aplicación (Guía de programación de C#).
Utilizar un dominio de aplicación
1. Cree el dominio de aplicación. El host de Common Language Runtime crea automáticamente un dominio de aplicación
para la aplicación. Para obtener información, vea el tema Cómo: Crear un dominio de aplicación.
2. Configure el dominio de aplicación. Para obtener más información, vea Cómo: Configurar un dominio de aplicación.
3. Cargue un ensamblado en el dominio de aplicación. Para obtener más información, vea
Cómo: Cargar ensamblados en un dominio de aplicación.
4. Obtenga acceso al contenido del otro ensamblado. Para obtener más información, vea
Ejecutar código en otro dominio de aplicación (Guía de programación de C#).
5. Descargue el dominio de aplicación. Para obtener más información, vea Cómo: Descargar un dominio de aplicación.
Vea también
Referencia
Dominios de aplicación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Información general sobre dominios de aplicación
Dominios de aplicación y ensamblados
Programar con dominios de aplicación
Otros recursos
Dominios de aplicación
Programar con dominios de aplicación y ensamblados
Guía de programación de C#

Ensamblados y Caché de ensamblados global (Guía de


programación de C#)
Un ensamblado es una unidad de creación fundamental de cualquier aplicación .NET Framework. Por ejemplo, al crear una
aplicación simple de C#, Visual Studio crea un ensamblado en la forma de un archivo ejecutable portable (PE), específicamente
un archivo EXE o DLL.
Los ensamblados contienen metadatos que describen su propio número de versión interno y los detalles de todos los datos y
tipos de objetos que contienen. Para obtener más información, vea Manifiesto del ensamblado.
Los ensamblados sólo se cargan conforme se van necesitando. Si no se utilizan, no se cargan. Esto significa que los
ensamblados pueden constituir una manera eficaz a la hora de administrar recursos en proyectos de mayor envergadura.
Los ensamblados pueden contener uno o más módulos. Por ejemplo, los proyectos de mayor envergadura se pueden
planificar de tal forma que varios desarrolladores individuales trabajen en módulos separados y, a la vez, todos juntos para
crear un solo ensamblado. Para obtener más información sobre módulos, vea el tema
Cómo: Generar un ensamblado de varios archivos.
Información general sobre ensamblados
Los ensamblados tienen las siguientes propiedades:
Los ensamblados se implementan como archivos .exe o .dll.
Es posible compartir un ensamblado entre aplicaciones colocándolo en la caché de ensamblados global.
Los ensamblados deben tener un nombre seguro antes de que se puedan colocar en la caché de ensamblados global.
Para obtener más información, vea Ensamblados con nombre seguro.
Los ensamblados sólo se cargan en la memoria si son necesarios.
Se puede obtener información mediante programación acerca de un ensamblado haciendo uso de la reflexión. Para
obtener más información, vea el tema Reflexión (Guía de programación de C#).
Si sólo se desea cargar un ensamblado para inspeccionarlo, utilice un método como ReflectionOnlyLoadFrom.
Es posible utilizar dos versiones del mismo ensamblado en una única aplicación. Para obtener más información, vea
alias externo (Referencia de C#).
Secciones relacionadas
Para obtener más información:
Ensamblados de confianza (Guía de programación de C#)
Cómo: Compartir un ensamblado con otras aplicaciones (Guía de programación de C#)
Cómo: Cargar y descargar ensamblados (Guía de programación de C#)
Cómo: Determinar si un archivo es un ensamblado (Guía de programación de C#)
extern (Referencia de C#)
Ensamblados en Common Language Runtime
Información general sobre ensamblados
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.2 Estructura del programa
9.1 Unidades de compilación
Vea también
Referencia
Dominios de aplicación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Metadatos y la estructura del archivo PE
Guía de programación de C#

Ensamblados de confianza (Guía de programación de C#)


Se puede tener acceso a un tipo interno o miembro interno de un ensamblado desde otro ensamblado.
Comentarios
La característica de ensamblados de confianza permite tener acceso a los miembros internos; los tipos y miembros privados
permanecerán inaccesibles.
Para dar a un ensamblado (ensamblado B) acceso a los tipos y miembros internos de otro ensamblado (ensamblado A), utilice
el atributo InternalsVisibleToAttribute en el ensamblado A.
Nota
Cuando compile un ensamblado (ensamblado B) que tendrá acceso a los tipos o miembros internos de otro ensamblado (en
samblado A), debe especificar explícitamente el nombre del archivo de resultados (.exe o .dll) con la opción del compilador /
out (vea /out (Establecer el nombre de archivo de los resultados) (Opciones del compilador de C#) para obtener más inform
ación). Esto es necesario porque el compilador no ha generado aún el nombre del ensamblado que está creando en el mome
nto de enlazar a las referencias externas.

La clase StrongNameIdentityPermission también proporciona la capacidad de compartir tipos, con las diferencias siguientes:
StrongNameIdentityPermission se aplica a un tipo individual, mientras que un ensamblado de confianza se aplica a
todo el ensamblado.
Si hay cientos de tipos en el ensamblado A que desea compartir con el ensamblado B, debe decorar cada uno de estos
tipos con StrongNameIdentityPermission, mientras que al utilizar un ensamblado de confianza, sólo deberá declarar
la relación de confianza una vez.
Con StrongNameIdentityPermission, los tipos que desea compartir se deben declarar como públicos. Con un
ensamblado de confianza, los tipos compartidos se declaran como privados.
Para obtener información sobre cómo generar un módulo .netmodule que pueda tener acceso a tipos no públicos en un
ensamblado, vea
/moduleassemblyname (Especificar un ensamblado de confianza para el módulo) (Opciones del compilador de C#).
Ejemplo
En este ejemplo, el ensamblado hace que los tipos y miembros internos sean visibles para el ensamblado denominado
cs_friend_assemblies_2.

// cs_friend_assemblies.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
using System;
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]

// internal by default
class Class1
{
public void Test()
{
Console.WriteLine("Class1.Test");
}
}

// public type with internal member


public class Class2
{
internal void Test()
{
Console.WriteLine("Class2.Test");
}
}
En este ejemplo, el ensamblado utiliza los tipos y miembros internos del ensamblado cs_friend_assemblies.dll.
Observe que debe especificar explícitamente el nombre del archivo de resultados (/out:cs_friend_assemblies_2.exe).
Si este ensamblado da a otro ensamblado (ensamblado C) acceso a sus tipos y miembros internos, el ensamblado C no pasa
automáticamente a ser de confianza para el ensamblado cs_friend_assemblies.dll.

// cs_friend_assemblies_2.cs
// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
// access an internal type
Class1 a = new Class1();
a.Test();

Class2 b = new Class2();


// access an internal member of a public type
b.Test();
}
}

Resultados
Class1.Test
Class2.Test

En este ejemplo se muestra cómo hacer que los tipos y miembros internos estén disponibles para los ensamblados que tienen
nombres seguros.
Para generar el archivo de claves y mostrar la clave pública, utilice la siguiente secuencia de comandos de sn.exe (para obtener
más información, vea Herramienta de nombre seguro (Sn.exe)):
sn -k friend_assemblies.snk // Genera la clave de nombre seguro
sn -p friend_assemblies.snk key.publickey // Extrae la clave pública de key.snk a key.publickey
sn -tp key.publickey // Muestra la clave pública almacenada en file'key.publickey
Pase el archivo de claves al compilador con /keyfile.

// cs_friend_assemblies_3.cs
// compile with: /target:library /keyfile:friend_assemblies.snk
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("cs_friend_assemblies_4, PublicKey=002400000480000094000000060
2000000240000525341310004000001000100031d7b6f3abc16c7de526fd67ec2926fe68ed2f9901afbc5f1b6b4
28bf6cd9086021a0b38b76bc340dc6ab27b65e4a593fa0e60689ac98dd71a12248ca025751d135df7b98c5f9d09
172f7b62dabdd302b2a1ae688731ff3fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c58
1fc0f2d966b77114b2c4")]
class Class1
{
public void Test()
{
System.Console.WriteLine("Class1.Test");
}
}

En este ejemplo se muestra cómo utilizar los tipos y miembros internos que están disponibles para los ensamblados que
tienen nombres seguros.

// cs_friend_assemblies_4.cs
// compile with: /keyfile:friend_assemblies.snk /reference:cs_friend_assemblies_3.dll /out:
cs_friend_assemblies_4.exe
public class M
{
static void Main()
{
Class1 a = new Class1();
a.Test();
}
}

Resultados
Class1.Test

Vea también
Conceptos
Guía de programación de C#
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Guía de programación de C#

Cómo: Determinar si un archivo es un ensamblado (Guía de


programación de C#)
Un archivo es un ensamblado si, y sólo si, se administra y contiene una entrada de ensamblado en sus metadatos. Para obtener
más información sobre ensamblados y metadatos, vea el tema Manifiesto del ensamblado.
Cómo determinar manualmente si un archivo es un ensamblado
1. Inicie Desensamblador de MSIL (Ildasm.exe).
2. Cargue el archivo que desea probar.
3. Si ILDASM informa de que el archivo no es un archivo ejecutable portable (PE), entonces no es un ensamblado. Para
obtener más información, vea el tema Cómo: Ver el contenido de un ensamblado.
Cómo determinar mediante programación si un archivo es un ensamblado
1. Llame al método GetAssemblyName y pase la ruta de acceso completa y el nombre del archivo que está probando.
2. Si se produce una excepción BadImageFormatException, el archivo no es un ensamblado.
Ejemplo
Este ejemplo prueba un archivo DLL para ver si es un ensamblado.
C#
class TestAssembly
{
static void Main()
{
try
{
System.Reflection.AssemblyName testAssembly =
System.Reflection.AssemblyName.GetAssemblyName(@"C:\WINDOWS\system\avicap.d
ll");

System.Console.WriteLine("Yes, the file is an Assembly.");


}

catch (System.IO.FileNotFoundException e)
{
System.Console.WriteLine("The file cannot be found.");
}

catch (System.BadImageFormatException e)
{
System.Console.WriteLine("The file is not an Assembly.");
}

catch (System.IO.FileLoadException e)
{
System.Console.WriteLine("The Assembly has already been loaded.");
}
}
}

El método GetAssemblyName carga el archivo de prueba y, a continuación, lo libera una vez que se lee la información.
Resultados
The file is not an Assembly.

Vea también
Tareas
Solución de problemas de excepciones: System.BadImageFormatException
Referencia
AssemblyName
Conceptos
Guía de programación de C#
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Guía de programación de C#

Cómo: Cargar y descargar ensamblados (Guía de programación


de C#)
Los ensamblados a los que hace referencia el programa se cargarán automáticamente en tiempo de generación, pero también
es posible cargar ensamblados específicos en el dominio de aplicación actual en tiempo de ejecución. Para obtener más
información, vea Dominios de aplicación (Guía de programación de C#).
No existe ninguna forma de descargar un ensamblado individual sin descargar todos los dominios de aplicación que lo
contienen. Aunque el ensamblado esté fuera de ámbito, el archivo de ensamblado actual permanecerá cargado hasta que se
descarguen todos los dominios de aplicación que lo contienen.
Si se desea descargar algunos ensamblados pero no otros, se debe considerar la posibilidad de crear un nuevo dominio de
aplicación, ejecutar el código dentro del dominio y, a continuación, descargar ese dominio de aplicación. Para obtener más
información, vea Cómo: Ejecutar código en otro dominio de aplicación (Guía de programación de C#).
Para cargar un ensamblado en un dominio de aplicación
Utilice uno de los diversos métodos de carga de las clases AppDomain y System.Reflection. Para obtener más
información, vea Cómo: Cargar ensamblados en un dominio de aplicación.

Para descargar un dominio de aplicación


No existe ninguna forma de descargar un ensamblado individual sin descargar todos los dominios de aplicación que lo
contienen. Utilice el método Unload de AppDomain para descargar los dominios de aplicación. Para obtener más
información, vea Cómo: Descargar un dominio de aplicación.

Vea también
Tareas
Cómo: Cargar ensamblados en un dominio de aplicación
Referencia
Dominios de aplicación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Guía de programación de C#

Cómo: Compartir un ensamblado con otras aplicaciones (Guía


de programación de C#)
Los ensamblados pueden ser privados o compartidos: de forma predeterminada, la mayoría de los programas de C# sencillos
constan de un ensamblado privado, ya que no van a ser utilizados por otras aplicaciones.
Para compartir un ensamblado con otras aplicaciones, se debe colocar en la Caché de ensamblados global (GAC).
Compartir un ensamblado
1. Cree el ensamblado. Para obtener más información, vea Crear ensamblados.
2. Asigne al ensamblado un nombre seguro. Para obtener más información, vea
Cómo: Firmar un ensamblado con un nombre seguro.
3. Asigne la información de versión al ensamblado. Para obtener más información, vea Versiones de los ensamblados.
4. Agregue el ensamblado a la Caché de ensamblados global. Para obtener más información, vea
Cómo: Instalar un ensamblado en la Caché de ensamblados global.
5. Obtenga acceso a los tipos contenidos en el ensamblado desde las otras aplicaciones. Para obtener más información, vea
Cómo: Hacer referencia a un ensamblado con nombre seguro.
Vea también
Conceptos
Guía de programación de C#
Ensamblados con nombre seguro
Otros recursos
Programar con ensamblados
Trabajar con ensamblados y la Caché de ensamblados global
Crear y utilizar ensamblados con nombre seguro
Guía de programación de C#

Atributos (Guía de programación de C#)


Los atributos constituyen un medio apropiado para asociar información declarativa con código de C# (tipos, métodos,
propiedades, etc.). Una vez asociado a una entidad del programa, el atributo se puede consultar en tiempo de ejecución
mediante una técnica denominada reflexión.
Existen dos formas de atributos: atributos que se definen en la biblioteca de clases base de Common Language Runtime y
atributos personalizados que se pueden crear para agregar información adicional al código. Esta información se puede
recuperar después mediante programación.
En este ejemplo, el atributo System.Reflection.TypeAttributes.Serializable se utiliza para aplicar una característica específica a
una clase:
C#
[System.Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}

Información general sobre atributos


Los atributos tienen las propiedades siguientes:
Los atributos agregan metadatos al programa. Los metadatos son información incrustada en el programa, tales como
instrucciones del compilador o descripciones de datos.
El programa puede examinar sus propios metadatos mediante la reflexión. Vea
Acceso a atributos mediante reflexión (Guía de programación de C#).
Los atributos se utilizan normalmente al interactuar con COM.

Secciones relacionadas
Para obtener más información, vea:
Utilizar atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
Cómo: Crear una unión de C/C++ mediante atributos (Guía de programación de C#)
Atributos comunes (Guía de programación de C#)
Ejemplo de atributos
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
1.12 Atributos
17 Atributos
Vea también
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Información general sobre atributos
Usos comunes de los atributos
Guía de programación de C#

Utilizar atributos (Guía de programación de C#)


Los atributos se pueden colocar en la mayoría de las declaraciones, aunque un determinado atributo podría restringir los tipos
de declaraciones en las que es válido. Desde el punto de vista sintáctico, un atributo se especifica colocando el nombre del
atributo, encerrado entre corchetes, delante de la declaración de la entidad a la que se aplica. Por ejemplo, un método con el
atributo DllImport se declara así:
C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

Para obtener más información, vea DllImportAttribute (Clase).


Muchos atributos tienen parámetros, que pueden ser posicionales, sin nombre, o con nombre. Los parámetros posicionales se
deben especificar en un determinado orden y no se pueden omitir; los parámetros con nombre son opcionales y se pueden
especificar en cualquier orden. Los parámetros posicionales se especifican en primer lugar. Por ejemplo, estos tres atributos
son equivalentes:

[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

El primer parámetro, el nombre de la DLL, es posicional y va siempre en primer lugar; los otros dos son parámetros con
nombre. En este caso, ambos parámetros con nombre se establecen como falso de forma predeterminada, por lo que se
pueden omitir. Consulte la documentación del atributo individual para obtener información sobre los valores de parámetro
predeterminados.
Una declaración puede incluir varios atributos, bien de forma separada, bien dentro del mismo grupo de corchetes:
C#
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }

Algunos atributos se pueden especificar varias veces para una entidad dada. Un ejemplo de este tipo de atributos multiuso es
Conditional:
C#
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}

Nota
Por convención, todos los nombres de atributo finalizan con la palabra "Attribute" para distinguirlos de otros elementos de .
NET Framework. No obstante, no tiene que especificar el sufijo de atributo cuando utiliza atributos en el código. Por ejemplo,
[DllImport] equivale a [DllImportAttribute], pero DllImportAttribute es el nombre real del atributo en .NET Framework
.

Vea también
Referencia
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
Attribute
System.Reflection
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Crear atributos personalizados (Guía de programación de C#)


Puede crear sus propios atributos personalizados definiendo una clase de atributo, una clase que se deriva directa o
indirectamente de Attribute, lo cual permite identificar definiciones de atributos en metadatos de forma rápida y sencilla.
Suponga que desea etiquetar clases y estructuras con el nombre del programador que escribió la clase o estructura. Podría
definir una clase de atributo personalizado Author:
C#
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct)
]
public class Author : System.Attribute
{
private string name;
public double version;

public Author(string name)


{
this.name = name;
version = 1.0;
}
}

El nombre de la clase es el nombre del atributo, Author. Se deriva de System.Attribute, por lo tanto, se trata de una clase de
atributo personalizado. Los parámetros del constructor son los parámetros posicionales del atributo personalizado, en este
caso, name, mientras que cualquier propiedad o campo público de lectura y escritura es un parámetro con nombre, en este
caso, version es el único parámetro con nombre. Observe el uso del atributo AttributeUsage para validar el atributo Author
sólo en las declaraciones de class y struct.
Podría utilizar este nuevo atributo de la siguiente forma:
C#
[Author("H. Ackerman", version = 1.1)]
class SampleClass
{
// H. Ackerman's code goes here...
}

AttributeUsage tiene un parámetro con nombre, AllowMultiple, con el que se puede hacer que un atributo personalizado
sea de un solo uso o bien multiuso.
C#
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct,
AllowMultiple = true) // multiuse attribute
]
public class Author : System.Attribute

C#
[Author("H. Ackerman", version = 1.1)]
[Author("M. Knott", version = 1.2)]
class SampleClass
{
// H. Ackerman's code goes here...
// M. Knott's code goes here...
}
Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Eliminar la ambigüedad de los destinos de atributos (Guía de


programación de C#)
En determinadas situaciones, el destino de un atributo, es decir, la entidad a la que se aplica, resulta ambiguo. Por ejemplo, en
la siguiente declaración de método, el atributo SomeAttr se podría aplicar al método o al valor devuelto por el método:
C#
public class SomeAttr : System.Attribute { }

[SomeAttr]
int Method()
{
return 0;
}

Este tipo de situación se presenta frecuentemente al realizar el cálculo de referencias. Para resolver la ambigüedad, C# dispone
de un conjunto de destinos predeterminados para cada tipo de declaración, que se pueden reemplazar especificando
explícitamente otros destinos de atributos.
C#
// default: applies to method
[SomeAttr]
int Method1() { return 0; }

// applies to method
[method: SomeAttr]
int Method2() { return 0; }

// applies to return value


[return: SomeAttr]
int Method3() { return 0; }

Observe que esto es independiente de los destinos en los cuales SomeAttr se define como válido; es decir, incluso si SomeAttr
se definió para aplicarse sólo a valores devueltos, el destino return (valor devuelto) debería especificarse de todas formas.
Dicho de otra forma, el compilador no utilizará información de AttributeUsage para resolver destinos de atributo ambiguos.
Para obtener más información, vea AttributeUsage (Guía de programación de C#).
La sintaxis para destinos de atributo es la siguiente:
[target : attribute-list]

Parámetros
target
Uno de los siguientes tipos: assembly, field, event, method, module, param, property, return o type.
attribute-list
Lista de atributos aplicables.
En la tabla siguiente se muestran todas las declaraciones en las que se permiten atributos; para cada declaración, los posibles
destinos de atributos se muestran en la segunda columna. Los destinos en negrita son los predeterminados.
Declaración Destinos posibles
assembly assembly

module module

class type
struct type

interface type

enum type

delegate type, return

method method, return

parameter param

Field field

property — indexer property

property — get accessor method, return

property — set accessor method, param, return

event — field event, field, method

event — property event, property

event — add method, param

event — remove method, param

Los atributos de nivel de módulo y ensamblado no disponen de destino predeterminado. Para obtener más información, vea
Atributos globales.
Ejemplo
C#
using System.Runtime.InteropServices;

C#
[Guid("12345678-1234-1234-1234-123456789abc"), InterfaceType(ComInterfaceType.InterfaceIsIU
nknown)]
interface ISampleInterface
{
[DispId(17)] // set the DISPID of the method
[return: MarshalAs(UnmanagedType.Interface)] // set the marshaling on the return type
object DoWork();
}

Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Attribute
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Acceso a atributos mediante reflexión (Guía de programación


de C#)
El hecho de poder definir atributos personalizados y colocarlos en el código fuente tendría un valor escaso si no se dispone de
un método para recuperar la información y actuar sobre ella. C# tiene un sistema de reflexión que permite recuperar la
información definida con atributos personalizados. El método clave es GetCustomAttributes, el cual devuelve una matriz de
objetos que son los equivalentes en tiempo de ejecución de los atributos del código fuente. Este método tiene varias versiones
sobrecargadas. Para obtener más información, vea Attribute.
Una especificación de atributos tal como:
C#
[Author("H. Ackerman", version = 1.1)]
class SampleClass

equivale conceptualmente a:
C#
Author anonymousAuthorObject = new Author("H. Ackerman");
anonymousAuthorObject.version = 1.1;

Sin embargo, el código sólo se ejecuta cuando se consultan los atributos de SampleClass . Una llamada a
GetCustomAttributes en SampleClass hace que se construya un objeto Author y se inicialice como se indicó anteriormente.
Si la clase cuenta con otros atributos, se crean de forma similar otros objetos de atributo. A continuación,
GetCustomAttributes devuelve el objeto Author y cualquier otro objeto de atributo en una matriz. Es posible recorrer en
iteración esta matriz y determinar qué atributos se aplicaron según el tipo de cada elemento de la matriz, así como extraer
información de los objetos atributo.
Ejemplo
A continuación se muestra un ejemplo completo. Se define un atributo personalizado, que se aplica a varias entidades, y se
recupera por medio del mecanismo de reflexión.
C#
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct,
AllowMultiple = true) // multiuse attribute
]
public class Author : System.Attribute
{
string name;
public double version;

public Author(string name)


{
this.name = name;
version = 1.0; // Default value
}
public string GetName()
{
return name;
}
}

[Author("H. Ackerman")]
private class FirstClass
{
// ...
}
// No Author attribute
private class SecondClass
{
// ...
}

[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]


private class ThirdClass
{
// ...
}
class TestAuthorAttribute
{
static void Main()
{
PrintAuthorInfo(typeof(FirstClass));
PrintAuthorInfo(typeof(SecondClass));
PrintAuthorInfo(typeof(ThirdClass));
}

private static void PrintAuthorInfo(System.Type t)


{
System.Console.WriteLine("Author information for {0}", t);
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); // reflection
foreach (System.Attribute attr in attrs)
{
if (attr is Author)
{
Author a = (Author)attr;
System.Console.WriteLine(" {0}, version {1:f}", a.GetName(), a.version);
}
}
}
}

Resultado
Author information for FirstClass
H. Ackerman, version 1.00
Author information for SecondClass
Author information for ThirdClass
H. Ackerman, version 1.00
M. Knott, version 2.00

Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
System.Reflection
Attribute
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Cómo: Crear una unión de C/C++ mediante atributos (Guía de


programación de C#)
Mediante los atributos, es posible personalizar cómo se organizan las estructuras en la memoria. Por ejemplo, se puede crear
lo que se conoce en C/C++ como unión mediante los atributos StructLayout(LayoutKind.Explicit) y FieldOffset.
Ejemplo
En este segmento de código, todos los campos de TestUnion comienzan en la misma ubicación de la memoria.
C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[System.Runtime.InteropServices.FieldOffset(0)]
public int i;

[System.Runtime.InteropServices.FieldOffset(0)]
public double d;

[System.Runtime.InteropServices.FieldOffset(0)]
public char c;

[System.Runtime.InteropServices.FieldOffset(0)]
public byte b;
}

A continuación se da otro ejemplo donde los campos comienzan en diferentes ubicaciones establecidas de manera explícita.
C#
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
[System.Runtime.InteropServices.FieldOffset(0)]
public long lg;

[System.Runtime.InteropServices.FieldOffset(0)]
public int i1;
[System.Runtime.InteropServices.FieldOffset(4)]
public int i2;
[System.Runtime.InteropServices.FieldOffset(8)]
public double d;
[System.Runtime.InteropServices.FieldOffset(12)]
public char c;

[System.Runtime.InteropServices.FieldOffset(14)]
public byte b;
}

Los dos campos int, i1 e i2, comparten las mismas posiciones de memoria que lg. Esta clase de control sobre la organización
de una estructura es útil cuando se utilizan llamadas de la plataforma.
Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Attribute
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Atributos comunes (Guía de programación de C#)


En esta sección se describen los atributos que se utilizan con más frecuencia en los programas C#.
En esta sección
Conditional (Guía de programación de C#)
Obsolete (Guía de programación de C#)
Atributos globales (Guía de programación de C#)
AttributeUsage (Guía de programación de C#)
Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Attribute
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Guía de programación de C#

Conditional (Guía de programación de C#)


Realiza la ejecución de un método que depende de un identificador de preprocesamiento. El atributo Conditional es un alias
para ConditionalAttribute y se puede aplicar a un método o a una clase de atributo.
En este ejemplo, Conditional se aplica a un método para habilitar o deshabilitar la presentación de información de diagnóstico
específica del programa:

#define TRACE_ON
using System;
using System.Diagnostics;

public class Trace


{
[Conditional("TRACE_ON")]
public static void Msg(string msg)
{
Console.WriteLine(msg);
}
}

public class ProgramClass


{
static void Main()
{
Trace.Msg("Now in Main...");
Console.WriteLine("Done.");
}
}

Si no se define el identificador TRACE_ON, no se mostrará ningún resultado de seguimiento.


El atributo Conditional se utiliza a menudo con el identificador DEBUG para habilitar las funciones de rastreo y registro en las
versiones de depuración, pero no en las versiones de lanzamiento, como se indica a continuación:

[Conditional("DEBUG")]
static void DebugMethod()
{
}

Comentarios
Cuando se llama a un método marcado como condicional, la presencia o ausencia del símbolo de preprocesamiento
especificado determina si la llamada se incluye o se omite. Si el símbolo se define, la llamada se incluye; en caso contrario, la
llamada se omite. El uso de Conditional es una alternativa más limpia, elegante y menos propensa a errores que agregar
métodos dentro de #if y #endif, como se indica a continuación:

#if DEBUG
void ConditionalMethod()
{
}
#endif

Un método condicional debe ser un método en una clase o declaración de estructura y debe tener un tipo de valor devuelto
void.
Uso de varios identificadores
Si un método presenta varios atributos Conditional, se incluye una llamada al método en el caso de que al menos uno de los
símbolos condicionales esté definido (es decir, los símbolos están conectados mediante una operación lógica OR). En este
ejemplo, la presencia de A o de B tendrá como resultado la llamada a un método:
C#
[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
// ...
}

Para conseguir el efecto de una operación lógica AND entre símbolos, se pueden definir métodos condicionales en serie. Por
ejemplo, el segundo método que se expone a continuación sólo se ejecutará si se definen A y B:
C#
[Conditional("A")]
static void DoIfA()
{
DoIfAandB();
}
[Conditional("B")]
static void DoIfAandB()
{
// Code to execute when both A and B are defined...
}

Uso de Conditional con clases de atributo


El atributo Conditional también se puede aplicar a una definición de clase de atributo. En este ejemplo, el atributo
personalizado Documentation sólo agregará información a los metadatos si se define DEBUG.
C#
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
string text;

public Documentation(string text)


{
this.text = text;
}
}

class SampleClass
{
// This attribute will only be included if DEBUG is defined.
[Documentation("This method displays an integer.")]
static void DoWork(int i)
{
System.Console.WriteLine(i.ToString());
}
}

Vea también
Referencia
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Attribute
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Obsolete (Guía de programación de C#)


El atributo Obsolete marca una entidad del programa como si su uso ya no estuviera recomendado. Cada uso de una entidad
marcada obsoleta generará en consecuencia una advertencia o un error, dependiendo de la configuración del atributo. Por
ejemplo:

[System.Obsolete("use class B")]


class A
{
public void Method() { }
}
class B
{
[System.Obsolete("use NewMethod", true)]
public void OldMethod() { }
public void NewMethod() { }
}

En este ejemplo, el atributo Obsolete se aplica a la clase A y al método B.OldMethod. Como el segundo argumento del
constructor del atributo aplicado a B.OldMethod se establece en true, el uso de este método genera un error de compilación,
mientras que el uso de la clase A sólo genera una advertencia. Sin embargo, llamar a B.NewMethod no genera ninguna
advertencia o error.
La cadena proporcionada como primer argumento al constructor de atributos se mostrará como parte de la advertencia o
error. Por ejemplo, cuando se utiliza con las definiciones anteriores, el código siguiente genera dos advertencias y un error:

// Generates 2 warnings:
A a = new A();
// Generate no errors or warnings:
B b = new B();
b.NewMethod();
// Generates an error, terminating compilation:
b.OldMethod();

Se generan dos advertencias para la clase A: uno para la declaración de la referencia de clase y otro para el constructor de
clase.
El atributo Obsolete se puede utilizar sin argumentos, pero incluyendo una explicación del motivo por el que el elemento está
obsoleto y una recomendación sobre qué utilizar en su lugar.
El atributo Obsolete es un atributo de uso único y se puede aplicar a cualquier entidad que permite el uso de atributos.
Obsolete es un alias para ObsoleteAttribute.

Vea también
Referencia
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
Attribute
System.Reflection
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Atributos globales (Guía de programación de C#)


La mayoría de los atributos se aplican a elementos específicos del lenguaje, tales como clases o métodos; sin embargo, algunos
atributos son globales, es decir, se aplican a todo un ensamblado o módulo. Por ejemplo, el atributo AssemblyVersionAttribute
se puede utilizar para incrustar información de versión en un ensamblado, de la forma siguiente:

[assembly: AssemblyVersion("1.0.0.0")]

Los atributos globales aparecen en el código fuente después de las directivas de nivel superior using y antes de las
declaraciones de tipo o de espacio de nombres. Los atributos globales pueden aparecer en varios archivos de código fuente,
pero los archivos se deben compilar en un paso de compilación único.
Éstos son algunos de los atributos del nivel de ensamblado de .NET Framework utilizados con más frecuencia:
AssemblyCompanyAttribute
AssemblyConfigurationAttribute
AssemblyCopyrightAttribute
AssemblyCultureAttribute
AssemblyDescriptionAttribute
AssemblyProductAttribute
AssemblyTitleAttribute
AssemblyTrademarkAttribute
Estos atributos se utilizan en proyectos basados en Visual Studio Plantilla Aplicación para formularios Windows Forms. Esta
plantilla incluye un archivo denominado AssemblyInfo.cs, que incluye estas instancias de atributo:

[assembly: AssemblyTitle("WindowsApplication1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("WindowsApplication1")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2005")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

Nota
Los atributos aplicables a un ensamblado se omiten si no se está creando un ensamblado.

Atributos de firma de ensamblados


En versiones anteriores de Visual Studio, la firma de ensamblados con nombres seguros se realizaba con estos atributos del
nivel del ensamblado
AssemblyKeyFileAttribute
AssemblyKeyNameAttribute
AssemblyDelaySignAttribute
Todavía se sigue admitiendo, pero la manera preferida de firmar los ensamblados es utilizar la Página de firma del Diseñador
de proyectos. Para obtener más información, vea Página Firma, Diseñador de proyectos y
Cómo: Firmar un ensamblado (Visual Studio).
Vea también
Referencia
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
System.Reflection
Conceptos
Guía de programación de C#
Atributos (Guía de programación de C#)
Otros recursos
Atributos comunes (Guía de programación de C#)
Guía de programación de C#

AttributeUsage (Guía de programación de C#)


Determina cómo se utiliza una clase de atributo personalizado. AttributeUsage es un atributo que se aplica a definiciones de
atributo personalizado para controlar cómo se aplica el nuevo atributo. La configuración predeterminada es similar a la
siguiente cuando se aplica explícitamente:

[System.AttributeUsage(System.AttributeTargets.All,
AllowMultiple=false,
Inherited=true)]
class NewAttribute : System.Attribute { }

En este ejemplo, la clase NewAttribute se puede aplicar a cualquier entidad de código con atributo, pero sólo se puede aplicar
una vez a cada entidad. Cuando se aplica a una clase base, es heredada por las clases derivadas.
Los argumentos AllowMultiple y Inherited son opcionales, por lo que este código tiene el mismo efecto:

[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }

El primer argumento AttributeUsage debe ser uno o más elementos de la enumeración AttributeTargets. Se puede utilizar OR
con varios tipos de destino, de la manera siguiente:

using System;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }

Si el argumento AllowMultiple se establece en true, el atributo resultante se puede aplicar más de una vez a una misma
entidad, como se indica a continuación:

using System;
[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
class MultiUseAttr : Attribute { }

[MultiUseAttr]
[MultiUseAttr]
class Class1 { }
[MultiUseAttr, MultiUseAttr]
class Class2 { }

En este caso, se puede aplicar MultiUseAttr repetidamente porque AllowMultiple está establecido en true. Ambos formatos
son válidos para aplicar varios atributos.
Si Inherited se establece en false, el atributo no es heredado por las clases que se derivan de una clase atribuida. Por ejemplo:

using System;
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
class Attr1 : Attribute { }

[Attr1]
class BClass { }

class DClass : BClass { }

En este caso, Attr1 no se aplica a DClass a través de la herencia.


Comentarios
El atributo AttributeUsage es un atributo de uso único, no se puede aplicar más de una vez a la misma clase. AttributeUsage
es un alias para AttributeUsageAttribute.
Para obtener más información, vea Acceso a atributos mediante reflexión (Guía de programación de C#).
Ejemplo
En el ejemplo siguiente se muestra el efecto de los argumentos Inherited y AllowMultiple en el atributo AttributeUsage, y
cómo se pueden enumerar los atributos personalizados aplicados a una clase.

using System;
// Create some custom attributes:
[AttributeUsage(System.AttributeTargets.Class, Inherited=false)]
class A1 : System.Attribute { }
[AttributeUsage(System.AttributeTargets.Class)]
class A2 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class, AllowMultiple=true)]
class A3 : System.Attribute { }

// Apply custom attributes to classes:


[A1,A2]
class BaseClass { }

[A3,A3]
class DerivedClass : BaseClass { }

public class TestAttributeUsage


{
static void Main()
{
BaseClass b = new BaseClass();
DerivedClass d = new DerivedClass();

// Display custom attributes for each class.


Console.WriteLine("Attributes on Base Class:");
object[] attrs = b.GetType().GetCustomAttributes(true);
foreach (Attribute attr in attrs)
{
Console.WriteLine(attr);
}

Console.WriteLine("Attributes on Derived Class:");


attrs = d.GetType().GetCustomAttributes(true);
foreach (Attribute attr in attrs)
{
Console.WriteLine(attr);
}
}
}

Resultados del ejemplo


Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2

Vea también
Referencia
Utilizar atributos (Guía de programación de C#)
Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)
Crear atributos personalizados (Guía de programación de C#)
Acceso a atributos mediante reflexión (Guía de programación de C#)
Attribute
System.Reflection
Conceptos
Guía de programación de C#
Reflexión (Guía de programación de C#)
Atributos (Guía de programación de C#)
Guía de programación de C#

Clases de colección (Guía de programación de C#)


.NET Framework ofrece clases especializadas para almacenamiento y recuperación de datos. Estas clases proporcionan
compatibilidad para pilas, colas, listas y tablas hash. La mayoría de las clases de colección implementan las mismas interfaces,
que se pueden heredar para crear nuevas clases de colección que se ajusten a necesidades de almacenamiento de datos más
especializadas.
Nota
Las aplicaciones destinadas a la versión 2.0 y posteriores de .NET Framework deben utilizar las clases de colección genéricas
del espacio de nombres System.Collections.Generic, que proporcionan mayor seguridad de tipos que sus homólogas no gen
éricas.

C#
ArrayList list = new ArrayList();
list.Add(10);
list.Add(20);

Información general sobre las clases de colección


Las clases de colección tienen las propiedades siguientes
Las clases de colección están definidas como parte del espacio de nombres System.Collections o
System.Collections.Generic.
La mayoría de las clases de colección derivan de las interfaces ICollection, IComparer, IEnumerable, IList, IDictionary
e IDictionaryEnumerator, y los tipos genéricos equivalentes.
Al utilizar clases de colección genéricas, se proporciona más seguridad de tipos y, en algunos casos, se puede
proporcionar mayor rendimiento, sobre todo al almacenar tipos de valor. Para obtener más información, vea
Ventajas de los genéricos (Guía de programación de C#).
Secciones relacionadas
Cuándo utilizar colecciones genéricas
Colecciones y estructuras de datos
Seleccionar una clase de colección
Comparaciones y ordenaciones en colecciones
Crear y manipular colecciones
Cómo: Obtener acceso a una clase de colección mediante Foreach (Guía de programación de C#)
Ejemplo de clases de colección
Vea también
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Guía de programación de C#

Cómo: Obtener acceso a una clase de colección mediante


Foreach (Guía de programación de C#)
En el ejemplo de código siguiente se muestra cómo escribir una clase de colección no genérica que se pueda utilizar con la
instrucción foreach. La clase es un analizador de cadenas, similar a la función strtok de la biblioteca en tiempo de ejecución de
C.
Nota
Este ejemplo representa la práctica recomendada sólo en los casos en los que no se puede utilizar una clase de colección gen
érica. Los genéricos se admiten en la versión 2.0 y posteriores del lenguaje C# y .NET Framework. Para obtener un ejemplo d
e cómo implementar una clase de colección genérica con seguridad de tipos que admite IEnumerable<T> y, en consecuenc
ia, evita los problemas descritos a continuación, vea
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#).

En el ejemplo siguiente, Tokens divide la oración "This is a sample sentence." en símbolos con los separadores ' ' y '-', y
enumera esos símbolos con la instrucción foreach:
C#
Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

foreach (string item in f)


{
System.Console.WriteLine(item);
}

Internamente, Tokens utiliza una matriz, la cual implementa IEnumerator e IEnumerable. El ejemplo de código podría haber
utilizado los métodos de enumeración de la matriz, pero eso iría en contra del propósito de este ejemplo.
En C#, no es estrictamente necesario que una clase de colección herede de IEnumerable e IEnumerator para que pueda ser
compatible con foreach; siempre que la clase disponga de los miembros GetEnumerator, MoveNext, Reset y Current
requeridos, funcionará con foreach. Omitir las interfaces tiene la ventaja de que permite definir el tipo de valor devuelto de
Current de modo que sea más específico que object, con lo que se consigue seguridad de tipos.

Por ejemplo, al principio del código de ejemplo anterior, cambie las líneas siguientes:

// No longer inherits from IEnumerable:


public class Tokens
// Doesn't return an IEnumerator:
public TokenEnumerator GetEnumerator()
// No longer inherits from IEnumerator:
public class TokenEnumerator
// Type-safe: returns string, not object:
public string Current

Ahora, debido a que Current devuelve una cadena, el compilador puede detectar cuándo se utiliza un tipo incompatible en una
instrucción foreach:

// Error: cannot convert string to int:


foreach (int item in f)

El inconveniente de omitir IEnumerable e IEnumerator es que la clase de colección ya no puede interactuar con las
instrucciones foreach (o equivalentes) de otros lenguajes compatibles con Common Language Runtime.
Puede combinar lo mejor de ambos enfoques (seguridad de tipos de C# e interoperabilidad con otros lenguajes compatibles
con Common Language Runtime) si hereda de IEnumerable e IEnumerator, y utiliza implementación de interfaces explícita,
tal como se muestra en el ejemplo siguiente.
Ejemplo
C#
using System.Collections;
// Declare the Tokens class:
public class Tokens : IEnumerable
{
private string[] elements;

Tokens(string source, char[] delimiters)


{
// Parse the string into tokens:
elements = source.Split(delimiters);
}

// IEnumerable Interface Implementation:


// Declaration of the GetEnumerator() method
// required by IEnumerable
public IEnumerator GetEnumerator()
{
return new TokenEnumerator(this);
}

// Inner class implements IEnumerator interface:


private class TokenEnumerator : IEnumerator
{
private int position = -1;
private Tokens t;

public TokenEnumerator(Tokens t)
{
this.t = t;
}
// Declare the MoveNext method required by IEnumerator:
public bool MoveNext()
{
if (position < t.elements.Length - 1)
{
position++;
return true;
}
else
{
return false;
}
}

// Declare the Reset method required by IEnumerator:


public void Reset()
{
position = -1;
}

// Declare the Current property required by IEnumerator:


public object Current
{
get
{
return t.elements[position];
}
}
}

// Test Tokens, TokenEnumerator


static void Main()
{
// Testing Tokens by breaking the string into tokens:
Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

foreach (string item in f)


{
System.Console.WriteLine(item);
}
}
}

Resultados
This
is
a
sample
sentence.

Vea también
Referencia
System.Collections.Generic
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Clases de colección (Guía de programación de C#)
Otros recursos
Referencia de C#
Guía de programación de C#

Excepciones y control de excepciones (Guía de programación


de C#)
Las características de control de excepciones del lenguaje C# proporcionan una manera de afrontar cualquier situación
inesperada o excepcional que se presente mientras se ejecuta un programa. El control de excepciones utiliza las palabras clave
try, catch y finally para intentar acciones que podrían no realizarse correctamente, controlar errores y limpiar los recursos
después. Common Language Runtime (CLR), las bibliotecas de otro fabricante o el código de aplicación que utiliza la palabra
clave throw pueden generar excepciones.
En este ejemplo, el método hace una prueba para realizar una división por cero y detecta el error. Sin el control de excepciones,
este programa finalizaría con un error DivideByZeroException no controlado.

int SafeDivision(int x, int y)


{
try
{
return (x / y);
}
catch (System.DivideByZeroException dbz)
{
System.Console.WriteLine("Division by zero attempted!");
return 0;
}
}

Información general sobre excepciones


Las excepciones tienen las propiedades siguientes:
Cuando la aplicación encuentra una circunstancia excepcional, como una división por cero o una advertencia de que no
hay suficiente memoria, se genera una excepción.
Utilice un bloque try alrededor de las instrucciones que puedan generar excepciones.
Cuando se produce una excepción dentro del bloque try, el flujo de control salta inmediatamente a un controlador de
excepciones asociado, si existe alguno.
Si no hay un controlador de excepciones para una excepción determinada, el programa deja de ejecutarse y presenta un
mensaje de error.
Si un bloque catch define una variable de excepción, puede utilizar dicho bloque para obtener más información sobre el
tipo de excepción que se ha producido.
Las acciones que pueden producir una excepción se ejecutan con la palabra clave try.
Un controlador de excepciones es un bloque de código que se ejecuta cuando se produce una excepción. En C#, la
palabra clave catch se utiliza para definir un controlador de excepciones.
Un programa que utiliza la palabra clave throw puede generar explícitamente excepciones.
Los objetos de excepción contienen información detallada sobre el error que incluye el estado de la pila de llamadas y
una descripción de texto del error.
El código se ejecuta en un bloque finally aunque se produzca una excepción, permitiendo así que el programa libere
recursos.
Secciones relacionadas
Consulte los temas siguientes para obtener más información sobre las excepciones y el control de excepciones:
Utilizar excepciones (Guía de programación de C#)
Control de excepciones (Guía de programación de C#)
Crear y producir excepciones (Guía de programación de C#)
Excepciones generadas por el compilador (Guía de programación de C#)
Cómo: Controlar una excepción mediante Try y Catch (Guía de programación de C#)
Cómo: Ejecutar código de limpieza mediante finally (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
8.9.5 La instrucción throw
8.10 La instrucción try
16 Excepciones
Vea también
Referencia
Palabras clave de C#
throw (Referencia de C#)
try-catch (Referencia de C#)
try-finally (Referencia de C#)
try-catch-finally (Referencia de C#)
Conceptos
Guía de programación de C#
Información general sobre excepciones
Otros recursos
Instrucciones de diseño de excepciones
Controlar y generar excepciones
Guía de programación de C#

Utilizar excepciones (Guía de programación de C#)


En el lenguaje C#, los errores del programa se difunden en tiempo de ejecución a través del programa mediante un
mecanismo denominado excepciones. Las excepciones se producen cuando el código encuentra un error y se detectan
mediante el código que puede corregir el error. Las excepciones se pueden producir mediante el Common Language Runtime
(CLR) de .NET Framework o mediante código de un programa. Una vez que se produce una excepción, ésta se difunde a la pila
de llamadas hasta que se encuentra una instrucción catch para la excepción. Las excepciones no detectadas se identifican a
través de un controlador de excepciones genérico proporcionado por el sistema que muestra un cuadro de diálogo.
Las clases derivadas de Exception representan estas excepciones. Esta clase identifica el tipo de excepción y contiene las
propiedades con detalles acerca de ésta. Producir una excepción implica crear una instancia de una clase derivada de la
excepción, configurar opcionalmente las propiedades de la excepción y, a continuación, producir el objeto con la palabra clave
throw. Por ejemplo:
C#
private static void TestThrow()
{
System.ApplicationException ex =
new System.ApplicationException("Demonstration exception in TestThrow()");

throw ex;
}

Después de que se produzca una excepción, el motor en tiempo de ejecución comprueba la instrucción actual para ver si está
dentro de un bloque try. Si es así, cualquier bloque catch asociado al bloque try se comprueba para ver si puede detectar la
excepción. Los bloques Catch especifican generalmente los tipos de excepción; si el tipo del bloque catch es el mismo tipo de
la excepción o de una clase base de la excepción, el bloque catch puede controlar el método. Por ejemplo:
C#
static void TestCatch()
{
try
{
TestThrow();
}
catch (System.ApplicationException ex)
{
System.Console.WriteLine(ex.ToString());
}
}

Si la instrucción que produce una excepción no está dentro de un bloque try, o el bloque try que la encierra no tiene un bloque
catch coincidente, el motor en tiempo de ejecución comprueba el método de llamada a una instrucción try y a los bloques
catch. El motor en ejecución continúa hasta la pila de llamadas, en búsqueda de un bloque catch compatible. Después de
encontrar y ejecutar el bloque catch, el control se pasa a la primera instrucción después del bloque catch.
Una instrucción try puede contener más de un bloque catch. Se ejecuta la primera instrucción catch que puede controlar la
excepción; cualquier instrucción catch posterior, aun cuando sea compatible, se omite. Por ejemplo:
C#
static void TestCatch2()
{
try
{
TestThrow();
}
catch (System.ApplicationException ex)
{
System.Console.WriteLine(ex.ToString()); // this block will be executed
}
catch (System.Exception ex)
{
System.Console.WriteLine(ex.ToString()); // this block will NOT be executed
}
System.Console.WriteLine("Done"); // this statement is executed after the catch block
}

Antes de ejecutar el bloque catch, se comprueba que los bloques try que se han evaluado mediante el motor en tiempo de
ejecución, incluido el bloque try que contiene el bloque compatible catch, contienen bloques finally. Estos bloques Finally
permiten al programador limpiar cualquier estado ambiguo que haya quedado de un bloque try cancelado, o liberar cualquier
recurso externo (como controladores de gráficos, conexiones de base de datos o secuencias de archivos) sin esperar a que el
recolector de elementos no utilizados del motor en tiempo de ejecución finalice los objetos. Por ejemplo:
C#
static void TestFinally()
{
System.IO.FileStream file = null;
System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");
try
{
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
// Closing the file allows you to reopen it immediately - otherwise IOException is
thrown.
if (file != null)
{
file.Close();
}
}

try
{
file = fileInfo.OpenWrite();
System.Console.WriteLine("OpenWrite() succeeded");
}
catch (System.IO.IOException)
{
System.Console.WriteLine("OpenWrite() failed");
}
}

Si WriteByte() produjo una excepción, el código del segundo bloque try que intenta reabrir el archivo produciría un error si
no se llama a file.Close(), y el archivo permanecería bloqueado. Debido a que los bloques finally se ejecutan aunque se
produzca o no una excepción, el bloque finally en el ejemplo anterior permite al archivo cerrarse correctamente y ayuda a
evitar un error.
Si no se encuentra ningún bloque catch compatible en la pila de llamadas después de que se produzca una excepción, puede
suceder una de estas tres cosas:
Si la excepción está dentro de un destructor, el destructor se anula y se llama al destructor base, si existe.
Si la pila de llamadas contiene un constructor estático o un inicializador de campo estático, se produce una
TypeInitializationException, con la excepción original asignada a la propiedad InnerException de la nueva excepción.
Si se alcanza el comienzo del subproceso, éste finaliza.
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Control de excepciones (Guía de programación de C#)


Los programadores de C# utilizan bloques try para separar el código al que puede afectar una excepción y bloques catch para
controlar las excepciones resultantes. Se puede utilizar un bloque finally para ejecutar el código independientemente de que se
inicie una excepción, lo cual es necesario a veces porque el código que sigue a una construcción try/catch podría no ejecutarse
si se produce una excepción. Un bloque try se debe utilizar con un bloque catch o finally, y puede incluir varios bloques catch.
Por ejemplo:
C#
try
{
// Code to try here.
}
catch (System.Exception ex)
{
// Code to handle exception here.
}

C#
try
{
// Code to try here.
}
finally
{
// Code to execute after try here.
}

C#
try
{
// Code to try here.
}
catch (System.Exception ex)
{
// Code to handle exception here.
}
finally
{
// Code to execute after try (and possibly catch) here.
}

Una instrucción try sin un bloque catch o finally producirá un error del compilador.
Bloques Catch
Un bloque catch puede especificar un tipo de excepción que se detectará. Este tipo se denomina filtro de excepción y debe ser
el tipo Exception o uno derivado de éste. Las excepciones definidas por la aplicación deberían derivarse de
ApplicationException.
Se pueden encadenar varios bloques catch con filtros de excepción diferentes. Los bloques catch múltiples se evalúan de
arriba a abajo, pero sólo se ejecuta un bloque catch para cada excepción iniciada. Se ejecutará el primer bloque catch que
especifique el tipo exacto o una clase base de la excepción que se haya producido. Si ningún bloque catch especifica un filtro de
excepción correspondiente, a continuación se ejecutará un bloque catch sin un filtro (si existe alguno). Es importante colocar
los bloques catch con las clases de excepción más concretas (más derivadas), en primer lugar.
Debe detectar excepciones cuando:
Tenga un conocimiento específico del motivo por el que se produjo la excepción y pueda implementar una recuperación
concreta, por ejemplo, detectar una excepción FileNotFoundException y solicitar al usuario que escriba un nuevo nombre
de archivo.
Pueda crear y producir una excepción nueva más específica. Por ejemplo:
C#
int GetInt(int[] array, int index)
{
try
{
return array[index];
}
catch(System.IndexOutOfRangeException e)
{
throw new System.ArgumentOutOfRangeException(
"Parameter index is out of range.");
}
}

Para controlar parcialmente una excepción. Por ejemplo, podría utilizar un bloque catch para agregar una entrada a un
registro de errores, pero después producir otra vez la excepción para permitir el control posterior de la excepción. Por
ejemplo:
C#
try
{
// try to access a resource
}
catch (System.UnauthorizedAccessException e)
{
LogError(e); // call a custom error logging procedure
throw e; // re-throw the error
}

Bloques Finally
Un bloque finally permite la limpieza de acciones realizada en un bloque try. Si el bloque finally está presente, se ejecuta
después de los bloques try y catch. Un bloque finally se ejecuta siempre, sin tener en cuenta si se produce una excepción o si
se encuentra un bloque catch que coincida con el tipo de excepción.
El bloque finally se puede utilizar para liberar recursos como secuencias de archivos, conexiones de base de datos y
controladores de gráficos sin esperar a que el recolector de elementos no utilizados del motor en tiempo de ejecución finalice
los objetos. Vea using (Instrucción, Referencia de C#) para obtener más información.
En este ejemplo, el bloque finally se utiliza para cerrar un archivo abierto en el bloque try. Observe que se comprueba el
estado del identificador del archivo antes de cerrarlo. Si el bloque try no puede abrir el archivo, el identificador del archivo
seguirá establecido en null. Opcionalmente, si se abre correctamente el archivo y no se produce una excepción, el bloque
finally se ejecutará y cerrará el archivo abierto.
C#
System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
file = fileinfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
// check for null because OpenWrite
// might have failed
if (file != null)
{
file.Close();
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
16 Excepciones
8.9.5 La instrucción throw
8.10 La instrucción try
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
try-catch (Referencia de C#)
try-finally (Referencia de C#)
try-catch-finally (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Guía de programación de C#

Crear y producir excepciones (Guía de programación de C#)


Las excepciones se utilizan para indicar que se ha producido un error mientras el programa está en ejecución. Los objetos de
excepción que describen un error se crean y, a continuación, se producen con la palabra clave throw. El motor de ejecución
busca el controlador de excepciones más compatible.
Los programadores deberían producir excepciones cuando:
El método no puede finalizar su funcionalidad definida. Por ejemplo, si el parámetro de un método tiene un valor no
válido:
C#
static void CopyObject(SampleClass original)
{
if (original == null)
{
throw new System.ArgumentException("Parameter cannot be null", "original");
}

Se realiza una llamada inadecuada a un objeto, basada en el estado del objeto. Por ejemplo, al tratar de escribir en un
archivo de sólo lectura. En los casos en que el estado del objeto no permite realizar una operación, produzca una
instancia de InvalidOperationException o un objeto basado en una derivación de esta clase. Éste es un ejemplo de un
método que produce un objeto InvalidOperationException:
C#
class ProgramLog
{
System.IO.FileStream logFile = null;
void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}

void WriteLog()
{
if (!this.logFile.CanWrite)
{
throw new System.InvalidOperationException("Logfile cannot be read-only");
}
// Else write data to the log and return.
}
}

Cuando un argumento para un método provoca una excepción. En este caso, se debería detectar una excepción original y
se debería crear una instancia de ArgumentException. La excepción original se debería pasar al constructor de
ArgumentException como el parámetro InnerException:
C#
static int GetValueFromArray(int[] array, int index)
{
try
{
return array[index];
}
catch (System.IndexOutOfRangeException ex)
{
System.ArgumentException argEx = new System.ArgumentException("Index is out of
range", "index", ex);
throw argEx;
}
}

Las excepciones contienen una propiedad denominada StackTrace. Esta cadena contiene el nombre de los métodos en la pila
actual de llamadas, junto con el nombre del archivo y número de línea donde se produjo la excepción para cada método. CRL
crea automáticamente un objeto StackTrace desde el punto de la instrucción throw, de modo que las excepciones se deben
producir desde el punto donde debe comenzar el seguimiento de la pila.
Todas las excepciones contienen una propiedad denominada Message. Esta cadena se debería establecer para explicar la razón
de la excepción. Tenga en cuenta que no se debe colocar información confidencial de seguridad en el texto del mensaje.
Además de Message, ArgumentException contiene una propiedad llamada ParamName que se debe establecer en el
nombre del argumento que provocó que se produjera la excepción. En el caso de un establecedor de propiedades,
ParamName se debería establecer en value.
Los métodos públicos y protegidos deberían producir excepciones cada vez que no pueden finalizar su función deseada. La
clase de excepción producida debería ser la excepción más concreta disponible que se ajuste a las condiciones del error. Estas
excepciones se deberían documentar como parte de la funcionalidad de la clase y las clases derivadas o actualizaciones de la
clase original deberían mantener el mismo comportamiento para la compatibilidad con versiones anteriores.
Las excepciones no se deben utilizar para modificar el flujo de un programa como parte de la ejecución normal; sólo se deben
utilizar para informar de condiciones de error y controlarlas. Las excepciones no se deben devolver como un valor o parámetro
en lugar de iniciarse. Los programadores no deberían producir System.Exception, System.SystemException,
NullReferenceException o IndexOutOfRangeException intencionalmente.
Definir clases de excepción
Los programas pueden producir cualquiera de las clases de excepción predefinidas en el espacio de nombres System (excepto
donde se indicó anteriormente) o crear sus propias clases de excepción mediante la derivación de ApplicationException. Las
clases derivadas deberían definir al menos cuatro constructores: un constructor predeterminado, uno que establece la
propiedad del mensaje y otro que establece las propiedades Message y InnerException. El cuarto constructor se utiliza para
serializar la excepción. Las nuevas clases de excepción deberían ser serializables. Por ejemplo:
C#
public class InvalidDepartmentException : System.ApplicationException
{
public InvalidDepartmentException() {}
public InvalidDepartmentException(string message) {}
public InvalidDepartmentException(string message, System.Exception inner) {}

// Constructor needed for serialization


// when exception propagates from a remoting server to the client.
protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo inf
o,
System.Runtime.Serialization.StreamingContext context) {}
}

Las nuevas propiedades sólo se deberían agregar a la clase de excepción cuando los datos que proporcionan son útiles para
resolver la excepción. Si a la clase de excepción derivada se agregan nuevas propiedades, ToString() se debería reemplazar
para devolver la información agregada.
Especificación del lenguaje C#
Para obtener más información, vea las siguientes secciones en la Especificación del lenguaje C#:
8.9.5 La instrucción Throw
8.10 La instrucción Try
16 Excepciones
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Control de excepciones (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Excepciones generadas por el compilador (Guía de


programación de C#)
El Common Language Runtime (CLR) de .NET Framework produce automáticamente algunas excepciones como resultado de
operaciones básicas en las que se produce un error. A continuación se muestran estas excepciones y sus condiciones de error.
Excepción Descripción
ArithmeticException Clase base de las excepciones producidas durante operaciones aritméticas, como
DivideByZeroException y OverflowException.

ArrayTypeMismatchException Se produce cuando una matriz no puede almacenar un elemento dado porque el tipo real del el
emento es incompatible con el tipo real de la matriz.

DivideByZeroException Se produce cuando tiene lugar un intento de dividir un valor integral por cero.

IndexOutOfRangeException Se produce cuando tiene lugar un intento de indizar una matriz cuando el índice es menor que c
ero o se encuentra fuera de los límites de la matriz.

InvalidCastException Se produce cuando tiene lugar un error en tiempo de ejecución en una conversión explícita de u
n tipo base a una interfaz o a un tipo derivado.

NullReferenceException Se produce al intentar hacer referencia a un objeto cuyo valor es null.

OutOfMemoryException Se produce cuando el intento de asignar memoria mediante el operador new da un error. Esto i
ndica que la memoria disponible en Common Language Runtime se ha agotado.

OverflowException Se produce cuando una operación aritmética en un contexto checked produce un desbordamien
to.

StackOverflowException Se produce cuando se agota la pila de excepciones debido a la existencia de demasiadas llamad
as al método pendientes; normalmente, suele indicar un nivel de recursividad muy profundo o i
nfinito.

TypeInitializationException Se produce cuando un constructor estático produce una excepción sin que haya cláusulas catch
compatibles para capturarla.
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Control de excepciones (Guía de programación de C#)
try-catch (Referencia de C#)
try-finally (Referencia de C#)
try-catch-finally (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Controlar una excepción mediante Try y Catch (Guía de


programación de C#)
El propósito de un bloque try-catch es detectar y controlar una excepción generada por código en funcionamiento. Algunas
excepciones se pueden controlar en un bloque catch y el problema se puede resolver sin que se vuelva a generar la excepción;
sin embargo, con más frecuencia lo único que puede hacer es asegurarse de que se produzca la excepción adecuada.
Ejemplo
En este ejemplo, IndexOutOfRangeException no es la excepción más adecuada: ArgumentOutOfRangeException tiene más
sentido para el método porque el argumento de index pasado por el llamador produce el error.
C#
class TestTryCatch
{
static int GetInt(int[] array, int index)
{
try
{
return array[index];
}
catch (System.IndexOutOfRangeException e) // CS0168
{
System.Console.WriteLine(e.Message);
//set IndexOutOfRangeException to the new exception's InnerException
throw new System.ArgumentOutOfRangeException("index parameter is out of range."
, e);
}
}
}

Comentarios
El código que produce una excepción está incluido en el bloque try. Una instrucción catch se agrega inmediatamente después
para controlar IndexOutOfRangeException, si se produce. El bloque catch controla IndexOutOfRangeException y en su lugar
produce la excepción ArgumentOutOfRangeException, más adecuada. Para proporcionar al llamador tanta información como
sea posible, considere la posibilidad de especificar la excepción original como InnerException de la nueva excepción. Dado que
la propiedad InnerException es de sólo lectura, debe asignarla en el constructor de la nueva excepción.
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Control de excepciones (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Ejecutar código de limpieza mediante finally (Guía de


programación de C#)
El propósito de una instrucción finally es asegurarse de que la limpieza necesaria de objetos, por lo general objetos que
contienen recursos externos, se produzca inmediatamente, incluso cuando se produce una excepción. Un ejemplo de esta
limpieza es llamar a Close en FileStream inmediatamente después de su uso en lugar de esperar que el objeto sea recolectado
como elemento no utilizado por Common Language Runtime, de la siguiente manera:
C#
static void CodeWithoutCleanup()
{
System.IO.FileStream file = null;
System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();
file.WriteByte(0xF);

file.Close();
}

Ejemplo
Para convertir el código anterior en una instrucción try-catch-finally, el código de limpieza está separado del código activo
como se muestra a continuación.
C#
static void CodeWithCleanup()
{
System.IO.FileStream file = null;
System.IO.FileInfo fileInfo = null;

try
{
fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
catch(System.Exception e)
{
System.Console.WriteLine(e.Message);
}
finally
{
if (file != null)
{
file.Close();
}
}
}

Como puede producirse una excepción en cualquier momento dentro del bloque try antes de la llamada a OpenWrite() o la
propia llamada a OpenWrite() podría producir un error, no se garantiza que el archivo esté abierto cuando se intenta cerrarlo.
El bloque finally agrega una comprobación para asegurarse de que el objeto FileStream no es null antes de llamar al
método Close. Sin la comprobación de null, el bloque finally podría iniciar su propia excepción NullReferenceException, pero
se debería evitar producir excepciones en bloques finally si es posible.
Una conexión de base de datos también es un elemento que debería cerrarse en un bloque finally. Dado que el número de
conexiones permitido a un servidor de base de datos está limitado a veces, es importante cerrar las conexiones de base de
datos tan rápido como sea posible. Si se produce una excepción antes de poder cerrar la conexión, se trata de otro caso en el
que es preferible utilizar el bloque finally a esperar a la recolección de elementos no utilizados.
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
Control de excepciones (Guía de programación de C#)
using (Instrucción, Referencia de C#)
try-catch (Referencia de C#)
try-finally (Referencia de C#)
try-catch-finally (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Detectar excepciones no compatibles con CLS


Algunos lenguajes de .NET, incluido C++/CLI, permiten que los objetos inicien excepciones que no se derivan de Exception.
Tales excepciones se denominan excepciones que no son CLS o no excepciones. En Visual C# no puede iniciar excepciones que
no son CLS, pero puede detectarlas de dos maneras:
Dentro de un bloque catch (Exception e) como RuntimeWrappedException.

De forma predeterminada, un ensamblado Visual C# detecta las excepciones que no son CLS como excepciones
ajustadas. Utilice este método si necesita obtener acceso a la excepción original a través de la propiedad
WrappedException. En el procedimiento siguiente se explica cómo detectar excepciones de esta manera.
Dentro de un bloque catch general (un bloque catch sin tipo de excepción especificado) colocado detrás de un bloque
catch (Exception) o catch (Exception e).

Utilice este método si desea realizar alguna acción (como escribir en un archivo de registro) en respuesta a las
excepciones que no son CLS y no necesita obtener acceso a la información de excepción. De forma predeterminada,
Common Language Runtime ajusta todas las excepciones. Para deshabilitar este comportamiento, agregue este atributo
del nivel de ensamblado al código, normalmente en el archivo AssemblyInfo.cs: [assembly:
RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)].

Para detectar una excepción que no es CLS


1. Dentro de catch(Exception e) block, utilice la palabra clave as para comprobar si e se puede convertir en
RuntimeWrappedException.
2. Obtenga acceso a la excepción original a través de la propiedad WrappedException.
Ejemplo
El ejemplo siguiente muestra cómo detectar una excepción que no es CLS iniciada desde una biblioteca de clases escrita en
C++/CLR. Tenga en cuenta que, en este ejemplo, el código de cliente Visual C# sabe de antemano que el tipo de excepción que
se va a iniciar es System.String. Puede volver a convertir la propiedad WrappedException en su tipo original siempre que ese
tipo sea accesible desde el código.

// Class library written in C++/CLR


ThrowNonCLS.Class1 myClass = new ThrowNonCLS.Class1();

try
{
// throws gcnew System::String(
// "I do not derive from System.Exception!");
myClass.TestThrow();
}

catch (Exception e)
{
RuntimeWrappedException rwe = e as RuntimeWrappedException;
if (rwe != null)
{
String s = rwe.WrappedException as String;
if (s != null)
{
Console.WriteLine(s);
}
}
else
{
// handle other System.Exception types
}
}
Vea también
Referencia
Excepciones y control de excepciones (Guía de programación de C#)
RuntimeWrappedException
Guía de programación de C#

Interoperabilidad (Guía de programación de C#)


La interoperabilidad permite conservar y aprovechar las inversiones existentes en código no administrado. El código que se
ejecuta bajo el control de Common Language Runtime (CLR) se denomina "código administrado" y el código que se ejecuta
fuera de CLR se denomina "código no administrado". Los componentes COM, COM+, C++, los componentes de ActiveX y la
API Win32 son ejemplos de código no administrado.
.NET Framework habilita la interoperabilidad con código no administrado a través de los servicios de invocación de plataforma,
el espacio de nombres System.Runtime.InteropServices y CLR, y a través de la interoperabilidad COM.
Hay dos maneras de utilizar las API no administradas desde el código administrado: a través de la invocación de
plataforma y mediante IJW (It Just Works) en C++. La invocación de plataforma permite al código administrado llamar a
funciones exportadas desde una biblioteca de vínculos dinámicos (DLL) no administrada, como la API Win32 y los
archivos DLL personalizados. CLR administra la carga del archivo DLL y el cálculo de referencias de parámetros. Para
conocer el rendimiento, se puede comprobar si hay una función equivalente disponible en .NET Framework en lugar de
utilizar la invocación de plataforma. Para obtener más información, vea Aproximación a la invocación de plataforma.
La interoperabilidad COM permite al código administrado interactuar con objetos COM a través de interfaces y clientes
COM. Hay dos maneras de utilizar los componentes COM del código administrado:
Para llamar a los componentes COM que son compatibles con la automatización OLE, utilice la interoperabilidad
COM o tlbimp.exe. CLR controla la activación del componente COM y el cálculo de referencias de parámetros.
Para componentes COM basados en IDL, utilice IJW y C++. Cada clase pública administrada que implementa
IUnknown, IDispatch y otras interfaces COM estándar, se pueden llamar desde un código no administrado a
través de la interoperabilidad COM. Para obtener más información, vea
Migración e interoperabilidad de componentes COM/Microsoft .NET.
Para obtener más información, vea Interoperar con código no administrado y Mejorar rendimiento de interoperabilidad.
Tanto PInvoke como la interoperabilidad COM utilizan cálculo de referencias para traducir los argumentos como enteros,
cadenas, matrices, estructuras y punteros entre el código administrado y no administrado. Para obtener más información, vea
Información general acerca del cálculo de referencia de interoperabilidad.
Secciones relacionadas
Información general sobre interoperabilidad (Guía de programación de C#)
Cómo: Utilizar la interoperabilidad COM para crear una hoja de cálculo Excel (Guía de programación de C#)
Cómo: Utilizar la invocación de plataforma para reproducir un archivo de onda (Guía de programación de C#)
Cómo: Utilizar la interoperabilidad COM para corregir la ortografía con Word (Guía de programación de C#)
Clases COM de ejemplo (Guía de programación de C#)
Cómo: Utilizar código administrado como complemento de automatización de Excel (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.5.7 Métodos externos
17.5 Atributos para la interoperabilidad
18.8 Asignación dinámica de memoria
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Interoperabilidad en .NET Compact Framework
Guía de programación de C#

Información general sobre interoperabilidad (Guía de


programación de C#)
Las herramientas y técnicas para interoperar entre código administrado y no administrado en C# incluyen servicios de
invocación de plataforma y herramientas para interoperabilidad entre .NET Framework y COM.
Invocación de plataforma
La invocación de plataforma busca y llama al código no administrado como una función exportada. También calcula las
referencias de los argumentos de la llamada, tales como parámetros de entrada y salida, enteros, cadenas, matrices y
estructuras, según sea necesario. Para obtener más información, vea
Calcular referencias de datos con invocación de plataforma y Consumir funciones DLL no administradas.
Nota
Common Language Runtime (CLR) administra el acceso a los recursos del sistema. Llamar a código no administrado fuera d
e CLR omite este mecanismo de seguridad y, por consiguiente, presenta un riesgo de seguridad. Por ejemplo, un código no a
dministrado podría llamar directamente a recursos en código no administrado, lo que omitiría el mecanismo de seguridad d
e CLR. Para obtener más información, vea .NET Framework Security.

Herramientas para interoperabilidad entre .NET Framework y COM


Para llamar a las API de COM desde código administrado, utilice Importador de la biblioteca de tipos (TlbImp.exe), que
acepta una biblioteca de tipos como entrada y genera un ensamblado de .NET Framework y metadatos administrados
asociados. A continuación puede agregar este ensamblado de .NET Framework generado al proyecto de Visual Studio
como una referencia de proyecto. Por ejemplo, utilice TlbImp comlibrary.dll /out: comlnetibrary.dll y agregue una
referencia a comlnetibrary.dll en el proyecto. Para obtener más información, vea
Importar una biblioteca de tipos como un ensamblado y Calling COM Components from .NET Clients.
Para llamar a código administrado desde COM, utilice Exportador de la biblioteca de tipos (Tlbexp.exe), que acepta un
ensamblado administrado como entrada y genera una biblioteca de tipos que contiene definiciones COM de todos los
tipos public definidos en ese ensamblado.
Para llamar a componentes administrados desde clientes COM, utilice
Herramienta Registro de ensamblados (Regasm.exe), que lee los metadatos de un ensamblado de .NET Framework y
agrega las entradas del Registro, de modo que los clientes COM puedan crear clases administradas.
Para llamar a controles ActiveX, utilice Importador de controles ActiveX de formularios Windows Forms (Aximp.exe), que
acepta la biblioteca de tipos de un control ActiveX como entrada y genera un control contenedor que permite que el
control se aloje en formularios Windows Forms. Por ejemplo, Aximp activex.ocx crea dos archivos, viz.activex.dl y
Axactivex.dll, y el archivo Axactivex.dll generado automáticamente se puede utilizar como referencia de proyecto.

Nota
Para utilizar las herramientas anteriores, por ejemplo, a fin de registrar un ensamblado administrado para COM interop, de
be tener permisos de seguridad de administrador o de usuario avanzado. Para obtener más información, vea
.NET Framework Security.

Ejemplos y técnicas de interoperabilidad


Para obtener más información, vea Información general acerca del cálculo de referencia de interoperabilidad. Para obtener
más información sobre técnicas de interoperabilidad, vea:
Cómo: Utilizar la invocación de plataforma para reproducir un archivo de onda (Guía de programación de C#)
Cómo: Utilizar código administrado como complemento de automatización de Excel (Guía de programación de C#)
Cómo: Utilizar la interoperabilidad COM para corregir la ortografía con Word (Guía de programación de C#)
Cómo: Utilizar la interoperabilidad COM para crear una hoja de cálculo Excel (Guía de programación de C#)
Vea también
Conceptos
Guía de programación de C#
Información general acerca del cálculo de referencias personalizado
Otros recursos
Calcular referencias de datos con interoperabilidad COM
Interoperabilidad en .NET Compact Framework
Cálculo de referencia de interoperabilidad
Guía de programación de C#

Cómo: Utilizar la interoperabilidad COM para crear una hoja de


cálculo Excel (Guía de programación de C#)
El ejemplo de código siguiente muestra cómo utilizar COM interop para crear una hoja de cálculo de Excel. Para obtener más
información sobre Excel, vea Microsoft Excel Objects y Open Method
En este ejemplo se muestra cómo abrir una hoja de cálculo de Excel existente en C# mediante la función COM interop de
.NET Framework. El ensamblado de Excel se utiliza para abrir y escribir datos en un intervalo de celdas en la hoja de cálculo de
Excel.
Nota
Debe tener instalado Excel en el sistema para que este código se ejecute correctamente.

Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valore
s de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones
del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para crear una hoja de cálculo de Excel con interoperabilidad COM


1. Cree una nueva aplicación de consola de C# en Visual Studio y denomínela CreateExcelWorksheet.
2. Agregue el ensamblado de Excel como una referencia al proyecto: haga clic con el botón secundario del mouse (ratón) en
el proyecto y seleccione Agregar referencia.
3. Haga clic en la ficha COM del cuadro de diálogo Agregar referencia y busque Biblioteca de objetos de Microsoft
Excel 11.
4. Haga doble clic en Biblioteca de objetos de Microsoft Excel 11 y presione Aceptar.
Nota
Según la versión de Office instalada, el Ensamblado de Excel se puede denominar Biblioteca de objetos de Excel 10
o Biblioteca de objetos de Excel 11.

5. Copie el código siguiente y pegue el contenido del archivo Program.cs.


C#
using System;
using System.Reflection;
using Microsoft.Office.Interop.Excel;

public class CreateExcelWorksheet


{
static void Main()
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Intero
p.Excel.Application();

if (xlApp == null)
{
Console.WriteLine("EXCEL could not be started. Check that your office inst
allation and project references are correct.");
return;
}
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];

if (ws == null)
{
Console.WriteLine("Worksheet could not be created. Check that your office
installation and project references are correct.");
}

// Select the Excel cells, in the range c1 to c7 in the worksheet.


Range aRange = ws.get_Range("C1", "C7");

if (aRange == null)
{
Console.WriteLine("Could not get a range. Check to be sure you have the co
rrect versions of the office DLLs.");
}

// Fill the cells in the C1 to C7 range of the worksheet with the number 6.
Object[] args = new Object[1];
args[0] = 6;
aRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, aRange,
args);

// Change the cells in the C1 to C7 range of the worksheet to the number 8.


aRange.Value2 = 8;
}
}

Seguridad
Para utilizar COM interop, debe tener permisos de seguridad de administrador o de usuario avanzado. Para obtener más
información sobre seguridad, vea .NET Framework Security.
Vea también
Tareas
Cómo: Utilizar la interoperabilidad COM para corregir la ortografía con Word (Guía de programación de C#)
Conceptos
Guía de programación de C#
Información general sobre interoperabilidad (Guía de programación de C#)
Otros recursos
Interoperabilidad en .NET Compact Framework
Ejemplos de interoperabilidad COM
Guía de programación de C#

Cómo: Utilizar la invocación de plataforma para reproducir un


archivo de onda (Guía de programación de C#)
El siguiente ejemplo de código de C# se muestra cómo utilizar los servicios de invocación de plataforma para reproducir un
archivo de sonido de onda en la plataforma de Windows.
Ejemplo
En este código de ejemplo se utiliza DllImport para importar el punto de entrada del método PlaySound de winmm.dll
como Form1 PlaySound(). El ejemplo tiene un formulario Windows Forms simple con un botón. Al hacer clic en el botón, se
abre un cuadro de diálogo OpenFileDialog estándar de Windows, de modo que pueda abrir un archivo para reproducirlo.
Cuando se selecciona un archivo de onda, éste se reproduce mediante el método PlaySound() del método del ensamblado
winmm.DLL. Para obtener más información acerca del método PlaySound de winmm.dll, vea
Using PlaySound to Play Waveform-Audio FilesUsing PlaySound to Play Waveform-Audio Files. Busque y seleccione un
archivo con una extensión .wav y, a continuación, haga clic en Abrir para reproducir el archivo de onda mediante la invocación
de plataforma. Un cuadro de texto muestra la ruta de acceso completa del archivo seleccionado.
El cuadro de diálogo Abrir archivos se puede filtrar para que muestre sólo los archivos que tengan una extensión .wav a
través de la siguiente configuración de filtro:
C#
dialog1.Filter = "Wav Files (*.wav)|*.wav";

C#
using System.Windows.Forms;

namespace WinSound
{
public partial class Form1 : Form
{
private TextBox textBox1;
private Button button1;

public Form1() //constructor


{
InitializeComponent();
}
[System.Runtime.InteropServices.DllImport("winmm.DLL", EntryPoint = "PlaySound", Se
tLastError = true)]
private static extern bool PlaySound(string szSound, System.IntPtr hMod, PlaySoundF
lags flags);
[System.Flags]
public enum PlaySoundFlags : int
{
SND_SYNC = 0x0000,
SND_ASYNC = 0x0001,
SND_NODEFAULT = 0x0002,
SND_LOOP = 0x0008,
SND_NOSTOP = 0x0010,
SND_NOWAIT = 0x00002000,
SND_FILENAME = 0x00020000,
SND_RESOURCE = 0x00040004
}

private void button1_Click (object sender, System.EventArgs e)


{
OpenFileDialog dialog1 = new OpenFileDialog();

dialog1.Title = "Browse to find sound file to play";


dialog1.InitialDirectory = @"c:\";
dialog1.Filter = "Wav Files (*.wav)|*.wav";
dialog1.FilterIndex = 2;
dialog1.RestoreDirectory = true;
if(dialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = dialog1.FileName;
PlaySound (dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_SYNC);
}
}
}
}

Compilar el código
Para compilar el código
1. Cree un nuevo proyecto de aplicación para Windows C# en Visual Studio y asígnele el nombre WinSound.
2. Copie el código anterior y péguelo sobre el contenido del archivo Form1.cs.
3. Copie el código siguiente y péguelo en el archivo Form1.Designer.cs, en el método InitializeComponent(), después de
cualquier código existente.
C#
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(192, 40);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(88, 24);
this.button1.TabIndex = 0;
this.button1.Text = "Browse";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(8, 40);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(168, 20);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "FIle path";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Platform Invoke WinSound C#";
this.ResumeLayout(false);
this.PerformLayout();
4. Compile y ejecute el código.

Seguridad
Para obtener más información, vea .NET Framework Security.
Vea también
Tareas
Ejemplo de tecnología de invocación de plataformas
Conceptos
Guía de programación de C#
Información general sobre interoperabilidad (Guía de programación de C#)
Otros recursos
Calcular referencias de datos con invocación de plataforma
Guía de programación de C#

Cómo: Utilizar la interoperabilidad COM para corregir la


ortografía con Word (Guía de programación de C#)
El siguiente ejemplo de código muestra cómo utilizar la interoperabilidad COM para utilizar las funciones de corrección
ortográfica de Word en la aplicación de Visual C#. Para obtener más información, vea ProofreadingErrors Collection Object y
Microsoft Word Objects.
Ejemplo
Este ejemplo muestra cómo utilizar el corrector ortográfico de Word de una aplicación de C#. Crea un nuevo objeto
Word.application mediante la interoperabilidad COM. Además, utiliza la colección ProofreadingErrors en un objeto Range
y encuentra las palabras incorrectas en ese intervalo.
C#
using System.Reflection;
using Word = Microsoft.Office.Interop.Word;

namespace WordSpell
{
public partial class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;

public Form1() //constructor


{
InitializeComponent();
}

private void button1_Click(object sender, System.EventArgs e)


{
Word.Application app = new Word.Application();

int errors = 0;
if (textBox1.Text.Length > 0)
{
app.Visible = false;

// Setting these variables is comparable to passing null to the function.


// This is necessary because the C# null cannot be passed by reference.
object template = Missing.Value;
object newTemplate = Missing.Value;
object documentType = Missing.Value;
object visible = true;

Word._Document doc1 = app.Documents.Add(ref template, ref newTemplate, ref


documentType, ref visible);
doc1.Words.First.InsertBefore(textBox1.Text);
Word.ProofreadingErrors spellErrorsColl = doc1.SpellingErrors;
errors = spellErrorsColl.Count;
object optional = Missing.Value;

doc1.CheckSpelling(
ref optional, ref optional, ref optional, ref optional, ref optional, r
ef optional,
ref optional, ref optional, ref optional, ref optional, ref optional, r
ef optional);
label1.Text = errors + " errors corrected ";
object first = 0;
object last = doc1.Characters.Count - 1;
textBox1.Text = doc1.Range(ref first, ref last).Text;
}
object saveChanges = false;
object originalFormat = Missing.Value;
object routeDocument = Missing.Value;
app.Quit(ref saveChanges, ref originalFormat, ref routeDocument);
}
}
}

Compilar el código
Este ejemplo requiere que Word esté instalado en el sistema y, dependiendo de la versión de Office, el ensamblado Word se
puede denominar Microsoft Office 10 Object Library o Word 11 Object Library.
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valore
s de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones
del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para compilar el código


1. Cree un nuevo proyecto de aplicación para Windows C# en Visual Studio y denomínelo WordSpell.
2. Copie el código anterior y péguelo sobre el contenido del archivo Form1.cs.
3. Copie el código siguiente y péguelo en el archivo Form1.Designer.cs, en el método InitializeComponent(), después de
cualquier código existente.
C#
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(40, 40);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.textBox1.Size = new System.Drawing.Size(344, 136);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "";
//
// button1
//
this.button1.Location = new System.Drawing.Point(392, 40);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(96, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Check Spelling";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Location = new System.Drawing.Point(40, 24);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(336, 16);
this.label1.TabIndex = 2;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(5, 13);
this.ClientSize = new System.Drawing.Size(496, 205);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "SpellCheckDemo";
this.ResumeLayout(false);

4. Agregue el ensamblado Word como una referencia al proyecto. Haga clic con el botón secundario del mouse en el
proyecto (ratón), haga clic en Agregar referencia, haga clic en la ficha COM del cuadro de diálogo Agregar referencia.
Haga doble clic en Biblioteca de objetos de Microsoft Office 11 y presione Aceptar.
Observe que los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, según
la edición o configuración activa. Para cambiar su configuración, elija Importar y exportar configuraciones en el menú
Herramientas. Para obtener más información, vea Configuración de Visual Studio.

Seguridad
Para utilizar la interoperabilidad COM, es necesario tener permisos de seguridad de usuario avanzado o de administrador. Para
obtener más información, vea .NET Framework Security.
Vea también
Tareas
Cómo: Utilizar la interoperabilidad COM para crear una hoja de cálculo Excel (Guía de programación de C#)
Conceptos
Guía de programación de C#
Información general sobre interoperabilidad (Guía de programación de C#)
Otros recursos
Ejemplos de interoperabilidad COM
Guía de programación de C#

Clases COM de ejemplo (Guía de programación de C#)


A continuación se incluye un ejemplo de una clase que se expondría como un objeto COM. Una vez insertado este código de
ejemplo en un archivo .cs y agregado al proyecto, establezca la propiedad Registrar para interoperabilidad COM en True.
Para obtener más información, vea Cómo: Registrar un componente para interoperabilidad COM.
Exponer objetos de Visual C# para COM requiere declarar una interfaz de clase, una interfaz de eventos si es necesario y la
propia clase. Los miembros de clase deben seguir estas reglas para que sean visibles en COM:
La clase debe ser pública.
Las propiedades, métodos y eventos deben ser públicos.
Las propiedades y métodos deben declararse en la interfaz de clase.
Los eventos deben declararse en la interfaz de eventos.
Los demás miembros públicos de la clase que no se hayan declarado en estas interfaces no serán visibles para COM, pero lo
serán para el resto de objetos de .NET Framework.
Para exponer propiedades y métodos en COM, se deben declarar en la interfaz de clase y marcarlos con el atributo DispId, e
implementarlos en la clase. El orden en que se declaran los miembros en la interfaz es el orden utilizado para la tabla vtable
COM.
Para poder exponer los eventos de una clase, se deben declarar en la interfaz de eventos y marcarlos con un atributo DispId.
La clase no debe implementar esta interfaz.
La clase implementa la interfaz de clase; puede implementar más de una interfaz, pero la primera implementación debe ser la
interfaz de clase predeterminada. Implemente los métodos y propiedades expuestos para COM aquí. Deben marcarse como
públicos y coincidir con las declaraciones de la interfaz de clase. Asimismo, declare los eventos que inicia la clase aquí. Deben
marcarse como públicos y coincidir con las declaraciones de la interfaz de eventos.
Para obtener más información, vea Interoperabilidad COM, parte 1: ejemplo, Interoperabilidad COM, parte 2: ejemplo y
Ejemplos de interoperabilidad COM.
Ejemplo
C#
using System.Runtime.InteropServices;

namespace project_name
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public interface ComClass1Interface
{
}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ComClass1Events
{
}
[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ComClass1Events))]
public class ComClass1 : ComClass1Interface
{
}
}

Vea también
Referencia
Interoperabilidad (Guía de programación de C#)
Generar (Página, Diseñador de proyectos) (C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Utilizar código administrado como complemento de


automatización de Excel (Guía de programación de C#)
Con complementos de automatización de Excel, puede utilizar una función pública de la biblioteca COM que se llamará como
una fórmula de celda. En el ejemplo siguiente se muestra cómo crear un complemento de C# para calcular la tasa de impuesto
sobre la renta en una celda de una hoja de cálculo de Excel. ComRegisterFunctionAttribute registra el complemento de forma
automática y no se requieren herramientas adicionales para registrar el código administrado como un ensamblado de COM.
Para obtener información adicional, vea Información general sobre interoperabilidad (Guía de programación de C#).
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valore
s de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones
del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Calcular el impuesto sobre la renta


Una tabla de impuestos típica permite calcular el impuesto según los ingresos anuales de una persona. Por ejemplo, a
continuación se muestra una tabla de impuestos hipotética para personas.
Ejemplo de tabla de impuestos
1. Si los ingresos son más de 0 dólares y menos de 7.000 dólares, el impuesto corresponde al 10 por ciento de los ingresos.
2. Si los ingresos son más de 7.000 dólares y menos de 28.400 dólares, el impuesto corresponde al 15 por ciento de la
cantidad mayor que 7.000 dólares más 700,00 dólares.
3. Si los ingresos son más de 28.400 dólares y menos de 68.800 dólares, el impuesto corresponde al 25 por ciento de la
cantidad mayor que 28.400 dólares más 3.910,00 dólares.
4. Si los ingresos son más de 68.800 dólares y menos de 143.500 dólares, el impuesto corresponde al 28 por ciento de la
cantidad mayor que 68.800 dólares más 14.010,00 dólares.
5. Si los ingresos son más de 143.500 dólares y menos de 311.950 dólares, el impuesto corresponde al 33 por ciento de la
cantidad mayor que 143.500 dólares más 34.926,00 dólares.
6. Si los ingresos son más de 311.950 dólares, el impuesto corresponde al 35 por ciento de la cantidad mayor que 311.950
dólares más 90.514,50 dólares.
Crear un complemento de automatización para Excel mediante Visual Studio y código administrado
1. Cree un nuevo proyecto de Biblioteca de clases de Visual C# denominado ExcelAddIn.
2. En el menú Proyecto, haga clic en Propiedades y luego en el panel Generar. Haga clic en la casilla de verificación
Registrar para interoperabilidad COM. Esta configuración registra automáticamente el ensamblado para la
interoperabilidad COM.
3. Pegue el código siguiente en el archivo de clase.
C#
using System.Runtime.InteropServices;

namespace TaxTables
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class TaxTables
{
public static double Tax(double income)
{
if (income > 0 && income <= 7000) {return (.10 * income)
;}
if (income > 7000 && income <= 28400) {return 700.00 + (.15 * (income
- 7000));}
if (income > 28400 && income <= 68800) {return 3910.00 + (.25 * (income
- 28400));}
if (income > 68800 && income <= 143500) {return 14010.00 + (.28 * (income
- 68800));}
if (income > 143500 && income <= 311950) {return 34926.00 + (.33 * (income
- 143500));}
if (income > 311950) {return 90514.50 + (.35 * (income
- 311950));}
return 0;
}

[ComRegisterFunctionAttribute]
public static void RegisterFunction(System.Type t)
{
Microsoft.Win32.Registry.ClassesRoot.CreateSubKey
("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
}

[ComUnregisterFunctionAttribute]
public static void UnregisterFunction(System.Type t)
{
Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey
("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
}
}
}

Ejecutar el código
Ejecutar el complemento de Excel
Genere el proyecto ExcelAddIn y presione F5 para compilarlo.
Abra un nuevo libro en Excel.
En el menú Herramientas, haga clic en Complementos y, a continuación, haga clic en Automatización.
En el cuadro de diálogo Servidores de automatización, seleccione ExcelAddIn de la lista de complementos y haga clic en
Aceptar.
En una celda del libro, escriba =Tax(23500). La celda muestra 3175.
Para registrar el archivo ExcelAddIn.dll después de moverlo a un directorio diferente, ejecute regasm con /codebase. Es
posible que aparezca una advertencia que indica que el ensamblado está sin firmar.

Seguridad
Para utilizar interoperabilidad COM, debe tener permisos de seguridad de administrador o de usuario avanzado. Para obtener
más información, vea .NET Framework Security.
Vea también
Tareas
Cómo: Utilizar la interoperabilidad COM para crear una hoja de cálculo Excel (Guía de programación de C#)
Conceptos
Guía de programación de C#
Información general sobre interoperabilidad (Guía de programación de C#)
Guía de programación de C#

Subprocesamiento (Guía de programación de C#)


El subprocesamiento permite al programa de C# realizar procesamientos simultáneos a fin de que se pueda realizar más de
una operación a la vez. Por ejemplo, puede utilizar el subprocesamiento para supervisar los datos introducidos por el usuario,
realizar tareas en segundo plano y controlar flujos de entrada simultáneos. El espacio de nombres System.Threading
proporciona clases e interfaces que admiten programación multiproceso y permiten realizar fácilmente tareas como crear e
iniciar nuevos subprocesos, sincronizar varios subprocesos o suspender y cancelar subprocesos.
Para incorporar el subprocesamiento al código de C#, simplemente hay que crear una función que se ejecutará fuera del
subproceso principal y apuntar un nuevo objeto Thread a ella. El ejemplo de código siguiente crea un nuevo subproceso en
una aplicación de C#:
C#
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(anObject.AMethod);

El ejemplo de código siguiente inicia un nuevo subproceso en una aplicación de C#:


C#
newThread.Start();

El subprocesamiento múltiple soluciona problemas de capacidad de respuesta y ejecución de varias tareas, pero puede
representar problemas de sincronización y uso compartido de recursos porque los subprocesos se interrumpen y reanudan sin
generar advertencias de acuerdo con un mecanismo central de programación de subprocesos. Para obtener más información,
vea Sincronización de subprocesos (Guía de programación de C#). Vea Utilizar subprocesos y subprocesamiento para obtener
información general.
Información general
Los subprocesos tienen las siguientes propiedades:
Los subprocesos permiten al programa en C# realizar el procesamiento simultáneo.
El espacio de nombres System.Threading de .NET Framework facilita el uso de los subprocesos.
Los subprocesos comparten los recursos de la aplicación. Para obtener más información, vea
Utilizar subprocesos y subprocesamiento.
Secciones relacionadas
Vea los temas siguientes para obtener más información:
Utilizar el subprocesamiento (Guía de programación de C#)
Cómo: Crear y terminar subprocesos (Guía de programación de C#)
Cómo: Utilizar un grupo de subprocesos (Guía de programación de C#)
Cómo: Sincronizar un subproceso productor y un subproceso consumidor (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#:
3.10 Orden de ejecución
8.12 La instrucción lock
10.4.3 Campos volátiles
10.7.1 Eventos de tipo campo
Vea también
Tareas
Ejemplo Monitor Synchronization Technology
Ejemplo Wait Synchronization Technology
Referencia
Mutex
Conceptos
Guía de programación de C#
Exclusiones mutuas (mutex)
Monitores
Operaciones de bloqueo
AutoResetEvent
Delegados (Guía de programación de C#)
Otros recursos
Thread (Clase)
CÓMO: Sincronizar el acceso a un recurso compartido en un entorno de subprocesamiento múltiple mediante Visual C# .NET
Guía de programación de C#

Utilizar el subprocesamiento (Guía de programación de C#)


De forma predeterminada, un programa de C# tiene un subproceso. Este subproceso ejecuta el código del programa que
comienza y finaliza con el método Main. Cada comando ejecutado por Main (directamente o indirectamente) es realizado por el
subproceso predeterminado, o primario, y este subproceso finaliza cuando llega de nuevo a Main. Sin embargo, se pueden crear
subprocesos auxiliares para ejecutar código en paralelo con el subproceso primario. Estos subprocesos se denominan a menudo
subprocesos de trabajo.
Los subprocesos de trabajo se pueden utilizar para realizar tareas que llevan mucho tiempo o en las que el tiempo es crucial, sin
acaparar el subproceso primario. Por ejemplo, los subprocesos de trabajo se utilizan a menudo en aplicaciones de servidor para
atender las solicitudes de entrada sin esperar a que la solicitud anterior haya finalizado. Los subprocesos de trabajo también se
utilizan para realizar tareas "en segundo plano" en aplicaciones de escritorio a fin de que el subproceso principal, que controla los
elementos de la interfaz de usuario, siga respondiendo a las acciones del usuario.
El subprocesamiento múltiple resuelve los problemas de rendimiento y velocidad de respuesta, pero también presenta problemas
de uso compartido de recursos, como interbloqueos y condiciones de anticipación. Es mejor utilizar varios subprocesos para
tareas que requieran recursos diferentes como identificadores de archivos, conexiones de red, etc. Asignar múltiples subprocesos
a un único recurso probablemente produciría problemas de sincronización, y el bloqueo frecuente de los subprocesos mientras
esperan la finalización de otros subprocesos va en contra del propósito de utilizar varios subprocesos.
Una estrategia común es utilizar subprocesos de trabajo para realizar tareas que llevan mucho tiempo o en las que el tiempo es
crucial, que no requieran muchos de los recursos utilizados por otros subprocesos. Naturalmente, a algunos recursos del
programa deberán tener acceso varios subprocesos. Es estos casos, el espacio de nombres System.Threading proporciona clases
para sincronizar los subprocesos. Estas clases incluyen Mutex, Monitor, Interlocked, AutoResetEvent y ManualResetEvent.
Puede utilizar algunas de estas clases, o todas ellas, para sincronizar las actividades de varios subprocesos, pero el lenguaje C#
proporciona una parte de la compatibilidad necesaria. Por ejemplo, la instrucción lock proporciona características de
sincronización a través del uso implícito de Monitor.
En los temas siguientes se muestran técnicas del subprocesamiento múltiple comunes:
Cómo: Crear y terminar subprocesos (Guía de programación de C#)
Cómo: Sincronizar un subproceso productor y un subproceso consumidor (Guía de programación de C#)
Cómo: Utilizar un grupo de subprocesos (Guía de programación de C#)
Secciones relacionadas
Para obtener más información, vea:
HOW TO: Create a Thread by Using Visual C# .NET
HOW TO: Submit a Work Item to the Thread Pool by Using Visual C# .NET
CÓMO: Sincronizar el acceso a un recurso compartido en un entorno de subprocesamiento múltiple utilizando Visual C# .NET
Subprocesos y subprocesamiento
Sincronizar datos para subprocesamiento múltiple
Vea también
Tareas
Ejemplo Monitor Synchronization Technology
Ejemplo Wait Synchronization Technology
Ejemplo de subprocesamiento
Referencia
Mutex
Conceptos
Guía de programación de C#
Monitores
Operaciones de bloqueo
AutoResetEvent
Otros recursos
Subprocesamiento administrado
Utilizar subprocesos y subprocesamiento
Ejemplos de subprocesamiento
Thread Class
Guía de programación de C#

Sincronización de subprocesos (Guía de programación de C#)


En las secciones siguientes se describen las características y clases que se pueden utilizar para sincronizar el acceso a recursos en
aplicaciones multiproceso.
Una de las ventajas de utilizar varios subprocesos en una aplicación es que cada subproceso se ejecuta de forma asincrónica. En
las aplicaciones para Windows, esto permite realizar las tareas que exigen mucho tiempo en segundo plano mientras la ventana
de la aplicación y los controles siguen respondiendo. En las aplicaciones de servidor, el subprocesamiento múltiple proporciona
la capacidad de controlar cada solicitud de entrada con un subproceso diferente. De lo contrario, no se atendería cada nueva
solicitud hasta que se hubiera satisfecho totalmente la solicitud anterior.
Sin embargo, la naturaleza asincrónica de los subprocesos significa que el acceso a recursos como identificadores de archivos,
conexiones de red y memoria se deben coordinar. De lo contrario, dos o más subprocesos podrían tener acceso al mismo tiempo
al mismo recurso, cada uno desprevenido de las acciones del otro. El resultado serían daños imprevisibles en los datos.
Para las operaciones simples en tipos de datos numéricos enteros, la sincronización de subprocesos se puede lograr con
miembros de la clase Interlocked. Para todos los demás tipos de datos y los recursos no seguros para subprocesos, el
subprocesamiento múltiple sólo se puede realizar sin ningún riesgo utilizando las estructuras de este tema.
Para obtener información adicional sobre la programación multiproceso, vea:
Utilizar el subprocesamiento (Guía de programación de C#)
Principios básicos del subprocesamiento administrado
Utilizar subprocesos y subprocesamiento
Procedimientos recomendados para el subprocesamiento administrado
La palabra clave de bloqueo
La palabra clave lock se puede utilizar para garantizar que un bloque de código se ejecuta hasta el final sin que lo interrumpan
otros subprocesos. Esto se logra obteniendo un bloqueo de exclusión mutua para un objeto determinado durante la ejecución de
un bloque de código.
Una instrucción lock comienza con la palabra clave lock, que utiliza un objeto como argumento, seguida de un bloque de código
que sólo un subproceso puede ejecutar a la vez. Por ejemplo:
C#
public void Function()
{
System.Object lockThis = new System.Object();
lock(lockThis)
{
// Access thread-sensitive resources.
}
}

El argumento suministrado a la palabra clave lock tiene que ser un objeto basado en un tipo de referencia y se utiliza para definir
el ámbito del bloqueo. En el ejemplo anterior, el ámbito del bloqueo se limita a esta función porque no existe ninguna referencia
al objeto fuera de la función. Estrictamente, el objeto suministrado a lock sólo se utiliza para identificar únicamente el recurso
que varios subprocesos comparten, de modo que puede ser una instancia de clase arbitraria. Sin embargo, en la práctica, este
objeto normalmente representa el recurso para el que la sincronización de subprocesos es necesaria. Por ejemplo, si varios
subprocesos van a utilizar un objeto contenedor, se puede pasar el contenedor para bloquearlo. Entonces, el bloque de código
sincronizado que sigue al bloqueo tendría acceso al contenedor. Con tal de que otros subprocesos bloqueen el mismo
contenedor antes de tener acceso a él, el acceso al objeto se sincroniza de forma segura.
Generalmente, es mejor evitar el bloqueo en un tipo public o en instancias de objeto que estén fuera del control de la aplicación.
Por ejemplo, lock(this) puede ser problemático si se puede tener acceso a la instancia públicamente, ya que el código que está
fuera de su control también puede bloquear el objeto. Esto podría crear situaciones del interbloqueo, en las que dos o más
subprocesos esperan a que se libere el mismo objeto. El bloqueo de un tipo de datos público, como opuesto a un objeto, puede
producir problemas por la misma razón. El bloqueo de cadenas literales es especialmente arriesgado porque el Common
Language Runtime (CLR) interna las cadenas literales. Esto significa que hay una instancia de un literal de cadena determinado
para todo el programa, exactamente el mismo objeto representa el literal en todos los dominios de la aplicación en ejecución, en
todos los subprocesos. Como resultado, un bloqueo sobre una cadena que tiene el mismo contenido en cualquier parte del
proceso de la aplicación bloquea todas las instancias de esa cadena en la aplicación. Por tanto, es mejor bloquear un miembro
privado o protegido que no esté internado. Algunas clases proporcionan específicamente los miembros para bloquear. Por
ejemplo, el tipo Array proporciona SyncRoot. Muchos tipos de colección también proporcionan un miembro SyncRoot.
Para obtener más información sobre la palabra clave lock, vea:
lock (Instrucción, Referencia de C#)
Cómo: Sincronizar un subproceso productor y un subproceso consumidor (Guía de programación de C#)
Monitores
Al igual que la palabra clave lock, los monitores evitan que varios subprocesos ejecuten simultáneamente bloques de código. El
método Enter permite que un subproceso, y sólo uno, continué con las instrucciones siguientes; todos los demás subprocesos se
bloquean hasta que el subproceso en ejecución llama a Exit. Esto es similar a utilizar la palabra clave lock. De hecho, la palabra
clave lock se implementa con la clase Monitor. Por ejemplo:
C#
lock(x)
{
DoSomething();
}

Esto equivale a:
C#
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}

Normalmente, es preferible utilizar la palabra clave lock en vez de utilizar directamente la clase Monitor, porque lock es más
conciso y garantiza que se libera el monitor subyacente aunque el código protegido produzca una excepción. Esto se logra con la
palabra clave finally, que ejecuta su bloque de código asociado independientemente de que se produzca una excepción.
Para obtener más información sobre los monitores, vea Ejemplo Monitor Synchronization Technology.
Eventos de sincronización y controladores de espera
El uso de un bloqueo o un monitor es útil para evitar la ejecución simultánea de bloques de código utilizados por varios
subprocesos, pero estas construcciones no permiten que un subproceso comunique un evento a otro. Esto requiere eventos de
sincronización, que son objetos que tienen uno de dos estados (señalizado y no señalizado) y se pueden utilizar para activar y
suspender subprocesos. Los subprocesos se pueden suspender haciendo que esperen a que se produzca un evento de
sincronización que no esté señalizado y se pueden activar cambiando el estado del evento a señalizado. Si un subproceso intenta
esperar a que se produzca un evento que ya está señalizado, el subproceso se sigue ejecutando sin retraso.
Hay dos tipos de eventos de sincronización: AutoResetEvent y ManualResetEvent. Sólo difieren en que AutoResetEvent cambia
automáticamente de señalizado a no señalizado siempre que activa un subproceso. A la inversa, ManualResetEvent permite
que cualquier número de subprocesos esté activado si su estado es señalizado y sólo vuelve al estado no señalizado cuando se
llama a su método Reset.
Se puede hacer que los subprocesos esperen a que se produzcan eventos si se llama a uno de los métodos de espera, como
WaitOne, WaitAny o WaitAll. System.Threading.WaitHandle.WaitOne hace que el subproceso espere hasta que se señalice un
único evento, System.Threading.WaitHandle.WaitAny bloquea un subproceso hasta que se señalicen uno o varios eventos
especificados y System.Threading.WaitHandle.WaitAll bloquea el subproceso hasta que se señalicen todos los eventos indicados.
Un evento se señaliza cuando se llama a su método Set.
En el ejemplo siguiente, la función Main crea e inicia un subproceso. El nuevo subproceso espera a que se produzca un evento
mediante el método WaitOne. Se suspende el subproceso hasta que el evento sea señalizado por el subproceso primario que
está ejecutando la función Main. Cuando el evento se señaliza, vuelve a ejecutarse el subproceso auxiliar. En este caso, como el
evento sólo se utiliza para una activación del subproceso, se podrían utilizar las clases AutoResetEvent o ManualResetEvent.
C#
using System;
using System.Threading;
class ThreadingExample
{
static AutoResetEvent autoEvent;
static void DoWork()
{
Console.WriteLine(" worker thread started, now waiting on event...");
autoEvent.WaitOne();
Console.WriteLine(" worker thread reactivated, now exiting...");
}
static void Main()
{
autoEvent = new AutoResetEvent(false);
Console.WriteLine("main thread starting worker thread...");
Thread t = new Thread(DoWork);
t.Start();
Console.WriteLine("main thrad sleeping for 1 second...");
Thread.Sleep(1000);
Console.WriteLine("main thread signaling worker thread...");
autoEvent.Set();
}
}

Para obtener más ejemplos del uso de eventos de sincronización de subprocesos, vea:
Ejemplo Monitor Synchronization Technology
Ejemplo Reader-Writer Synchronization Technology
Ejemplo Thread Pools Technology
Ejemplo Wait Synchronization Technology
Objeto Mutex
Una exclusión mutua es similar a un monitor; impide la ejecución simultánea de un bloque de código por más de un subproceso
a la vez. De hecho, el nombre "mutex" es una forma abreviada del término "mutuamente exclusivo". Sin embargo, a diferencia de
los monitores, una exclusión mutua se puede utilizar para sincronizar los subprocesos entre varios procesos. Una exclusión
mutua se representa mediante la clase Mutex.
Cuando se utiliza para la sincronización entre procesos, una exclusión mutua se denomina una exclusión mutua con nombre
porque va a utilizarla otra aplicación y, por tanto, no se puede compartir por medio de una variable global o estática. Se debe
asignar un nombre para que ambas aplicaciones puedan tener acceso al mismo objeto de exclusión mutua.
Aunque se puede utilizar una exclusión mutua para la sincronización de subprocesos dentro de un proceso, normalmente es
preferible utilizar Monitor porque los monitores se diseñaron específicamente para .NET Framework y, por tanto, hacen un
mejor uso de los recursos. Por el contrario, la clase Mutex es un contenedor para una construcción de Win32. Aunque es más
eficaz que un monitor, la exclusión mutua requiere transiciones de interoperabilidad, que utilizan más recursos del sistema que la
clase Monitor. Para obtener un ejemplo de uso de la exclusión mutua, vea Exclusiones mutuas (mutex).
Secciones relacionadas
Cómo: Crear y terminar subprocesos (Guía de programación de C#)
Cómo: Utilizar un grupo de subprocesos (Guía de programación de C#)
CÓMO: Sincronizar el acceso a un recurso compartido en un entorno de subprocesamiento múltiple mediante Visual C# .NET
CÓMO: Crear un subproceso utilizando Visual C# .NET
CÓMO: Enviar un elemento de trabajo al grupo de subprocesos utilizando Visual C# .NET
CÓMO: Sincronizar el acceso a un recurso compartido en un entorno de subprocesamiento múltiple mediante Visual C# .NET
Vea también
Referencia
Thread
WaitOne
WaitAny
WaitAll
Monitor
Mutex
AutoResetEvent
ManualResetEvent
Interlocked
WaitHandle
Conceptos
Guía de programación de C#
Guía de programación de C#

Cómo: Crear y terminar subprocesos (Guía de programación de


C#)
En este ejemplo se muestra cómo crear un subproceso auxiliar o de trabajo, y utilizarlo para realizar el procesamiento en
paralelo con el subproceso primario. También se muestra cómo hacer que un subproceso espere a que termine la ejecución de
otro y, a continuación, finalice correctamente. Para obtener información adicional sobre el multiprocesamiento, vea
Subprocesamiento administrado y Utilizar el subprocesamiento (Guía de programación de C#).
El ejemplo crea una clase denominada Worker que contiene el método que el subproceso de trabajo ejecutará, denominado
DoWork. Ésta es esencialmente la función Main para el subproceso de trabajo. El subproceso de trabajo comenzará la ejecución
llamando a este método y finalizará automáticamente cuando el método devuelva un resultado. El método DoWork tiene la
apariencia siguiente:
C#
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}

La clase Worker contiene un método adicional que se utiliza para indicar a DoWork que debe devolver un resultado. Este método
se denomina RequestStop y tiene la apariencia siguiente:
C#
public void RequestStop()
{
_shouldStop = true;
}

El método RequestStop asigna simplemente el miembro de datos _shouldStop a true. Como el método DoWork comprueba el
miembro de datos, esto tiene el efecto indirecto de que DoWork devuelva un resultado, con lo que termina el subproceso de
trabajo. Sin embargo, es importante tener en cuenta que DoWork y RequestStop son ejecutados por subprocesos diferentes. El
subproceso de trabajo ejecuta DoWork y el subproceso primario ejecuta RequestStop, por lo que el miembro de datos
_shouldStop se declara volatile, de la forma siguiente:

C#
private volatile bool _shouldStop;

La palabra clave volatile alerta al compilador de que varios subprocesos tendrán acceso al miembro de datos _shouldStop y,
en consecuencia, no debe asumir que el estado de optimización del miembro será óptimo. Para obtener más información, vea
volatile (Referencia de C#).
El uso de volatile con el miembro de datos _shouldStop permite el acceso seguro de varios subprocesos a este miembro sin
utilizar técnicas formales de sincronización de subprocesos, pero sólo porque _shouldStop es un valor de tipo bool. Esto
significa que sólo es necesario utilizar operaciones atómicas únicas para modificar _shouldStop. Sin embargo, si este miembro
de datos fuera una clase, estructura o matriz, el acceso a él de varios subprocesos probablemente produciría daños
intermitentes en los datos. Considere un subproceso que cambia los valores en una matriz. Windows interrumpe con
regularidad los subprocesos para permitir a otros subprocesos que se ejecuten, de modo que este subproceso se detendría
después de asignar ciertos elementos de la matriz pero antes de asignar otros. Esto significa que la matriz tiene ahora un
estado que el programador nunca previó y, como resultado, cuando otro subproceso lea la matriz se producirá un error.
Antes de crear realmente el subproceso de trabajo, la función Main crea un objeto Worker y una instancia de Thread. El objeto
de subproceso se configura para utilizar el método Worker.DoWork como punto de entrada mediante el paso de una referencia
a este método al constructor Thread, de la forma siguiente:
C#
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);

En este momento, aunque el objeto de subproceso de trabajo existe y está configurado, no se ha creado el subproceso de
trabajo real todavía. Esto no ocurre hasta que Main llamada al método Start:
C#
workerThread.Start();

Entonces, el sistema inicia la ejecución del subproceso de trabajo, pero lo hace de forma asincrónica al subproceso primario.
Esto significa que la función Main continúa ejecutando el código inmediatamente, mientras el subproceso de trabajo realiza
simultáneamente la inicialización. Para garantizar que la función Main no intenta terminar el subproceso de trabajo antes de
que pueda ejecutarse, la función Main entra en un bucle hasta que la propiedad IsAlive del objeto de subproceso de trabajo se
establece en true:
C#
while (!workerThread.IsAlive);

A continuación, el subproceso primario se detiene brevemente con una llamada a Sleep. Esto asegura que la función DoWork
del subproceso de trabajo ejecutará el bucle dentro del método DoWork durante unos pocos recorridos antes de que la función
Main ejecute más comandos:

C#
Thread.Sleep(1);

Después de que transcurre un milisegundo, Main señala al objeto de subproceso de trabajo que debería finalizar utilizando el
método Worker.RequestStop que se introdujo previamente:
C#
workerObject.RequestStop();

También es posible terminar un subproceso desde otro con una llamada a Abort, pero esto termina a la fuerza el subproceso
afectado sin comprobar si ha completado su tarea y no proporciona ninguna oportunidad para la limpieza de recursos. Es
preferible la técnica mostrada en este ejemplo.
Por último, la función Main llama al método Join en el objeto de subproceso de trabajo. Este método hace que el subproceso
actual se bloquee, o espere, hasta que el subproceso que el objeto representa finalice. Por consiguiente, Join no devolverá
ningún resultado hasta que el subproceso de trabajo vuelva, con lo cual finaliza:
C#
workerThread.Join();

En este momento, sólo existe el subproceso primario que ejecuta Main. Muestra un mensaje final y, después, vuelve y finaliza
también el subproceso primario.
A continuación se muestra el ejemplo completo:
Ejemplo
C#
using System;
using System.Threading;
public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}

public class WorkerThreadExample


{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);

// Start the worker thread.


workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");

// Loop until worker thread activates.


while (!workerThread.IsAlive);
// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);

// Request that the worker thread stop itself:


workerObject.RequestStop();
// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
}

Resultados del ejemplo


main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated

Vea también
Tareas
Ejemplo de subprocesamiento
Referencia
Subprocesamiento (Guía de programación de C#)
Utilizar el subprocesamiento (Guía de programación de C#)
volatile (Referencia de C#)
Thread
Mutex
Monitor
Start
IsAlive
Sleep
Join
Abort
Conceptos
Guía de programación de C#
Otros recursos
Subprocesamiento administrado
Ejemplos de subprocesamiento
Guía de programación de C#

Cómo: Sincronizar un subproceso productor y un subproceso


consumidor (Guía de programación de C#)
El ejemplo siguiente muestra la sincronización de subprocesos entre el subproceso primario y dos subprocesos de trabajo
utilizando la palabra clave lock y las clases AutoResetEvent y ManualResetEvent. Para obtener más información, vea
lock (Instrucción, Referencia de C#).
El ejemplo crea dos subprocesos auxiliares o de trabajo. Un subproceso genera los elementos y los almacena en una cola
genérica que no es segura para subprocesos. Para obtener más información, vea Queue. El otro subproceso utiliza los
elementos de esa cola. Además, el subproceso primario muestra periódicamente el contenido de la cola, de modo que tres
subprocesos tienen acceso a la cola. La palabra clave lock se utiliza para sincronizar el acceso a la cola para asegurarse de que
no se daña el estado de la cola.
Además de simplemente evitar el acceso simultáneo con la palabra clave lock, dos objetos de evento proporcionan
posteriormente la sincronización. Uno se utiliza para indicar a los subprocesos de trabajo que finalicen y el otro lo utiliza el
subproceso productor para indicar al subproceso consumidor que se ha agregado un nuevo elemento a la cola. Estos dos
objetos de evento se encapsulan en una clase denominada SyncEvents. Esto permite pasar fácilmente los eventos a los objetos
que representan el subproceso consumidor y productor. La clase SyncEvents se define así:
C#
public class SyncEvents
{
public SyncEvents()
{

_newItemEvent = new AutoResetEvent(false);


_exitThreadEvent = new ManualResetEvent(false);
_eventArray = new WaitHandle[2];
_eventArray[0] = _newItemEvent;
_eventArray[1] = _exitThreadEvent;
}

public EventWaitHandle ExitThreadEvent


{
get { return _exitThreadEvent; }
}
public EventWaitHandle NewItemEvent
{
get { return _newItemEvent; }
}
public WaitHandle[] EventArray
{
get { return _eventArray; }
}
private EventWaitHandle _newItemEvent;
private EventWaitHandle _exitThreadEvent;
private WaitHandle[] _eventArray;
}

La clase AutoResetEvent se utiliza para el evento "nuevo elemento" porque es conveniente que este evento se restablezca
automáticamente cada vez que el subproceso consumidor responde a este evento. Alternativamente, la clase
ManualResetEvent se utiliza para el evento "salir" porque se desea que varios subprocesos respondan cuando se señala este
evento. Si se utilizara en su lugar AutoResetEvent, el evento revertiría a un estado no señalado después de que sólo un
subproceso respondiera al evento. El otro subproceso no respondería y, en ese caso, no podría finalizar.
La clase SyncEvents crea los dos eventos y los almacena de dos formas diferentes: como EventWaitHandle, que es la clase base
de AutoResetEvent y ManualResetEvent, y en una matriz basada en WaitHandle. Como verá en la descripción del
subproceso consumidor, esta matriz es necesaria para que el subproceso consumidor pueda responder a cualquier evento.
Los subprocesos consumidor y productor se representan con las clases denominadas Consumer y Producer, las cuales definen
un método denominado ThreadRun. Estos métodos se utilizan como puntos de entrada para los subprocesos de trabajo que el
método Main crea.
El método ThreadRun definido por la clase Producer tiene la apariencia siguiente:
C#
// Producer.ThreadRun
public void ThreadRun()
{
int count = 0;
Random r = new Random();
while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))
{
lock (((ICollection)_queue).SyncRoot)
{
while (_queue.Count < 20)
{
_queue.Enqueue(r.Next(0,100));
_syncEvents.NewItemEvent.Set();
count++;
}
}
}
Console.WriteLine("Producer thread: produced {0} items", count);
}

Este método recorre el código hasta que el evento "salir del subproceso" queda señalado. El estado de este evento se prueba
con el método WaitOne utilizando la propiedad ExitThreadEvent definida por la clase SyncEvents. En este caso, el estado del
evento se comprueba sin bloquear el subproceso actual porque el primer argumento utilizado con WaitOne es cero, lo que
indica que el método debe devolver un valor inmediatamente. Si WaitOne devuelve true, el evento en cuestión se señala
actualmente. En ese caso, se devuelve el método ThreadRun, que tiene el efecto de finalizar el subproceso de trabajo que
ejecuta este método.
Hasta que se señala el evento "salir del subproceso", el método Producer.ThreadStart intenta mantener 20 elementos en la
cola. Un elemento es simplemente un entero entre 0 y 100. La colección tiene que bloquearse antes de agregar nuevos
elementos para evitar que los subprocesos consumidor y primario tengan acceso simultáneamente a la colección. Esto se
realiza mediante la palabra clave lock. El argumento que se pasa a lock es el campo SyncRoot expuesto por medio de la
interfaz ICollection. Este campo se proporciona específicamente para sincronizar el acceso del subproceso. El acceso exclusivo a
la colección se concede para cualquier instrucción contenida en el bloque de código que sigue a lock. Para cada nuevo
elemento que el productor agrega a la cola, se realiza una llamada al método Set en el evento "nuevo elemento". Esto indica al
subproceso consumidor que emerja de su estado suspendido para procesar el nuevo elemento.
El objeto Consumer también define un método denominado ThreadRun. Al igual que en la versión del productor de ThreadRun,
un subproceso de trabajo creado por el método Main ejecuta este método. Sin embargo, la versión del consumidor de
ThreadStart debe responder a dos eventos. El método Consumer.ThreadRun tiene la apariencia siguiente:

C#
// Consumer.ThreadRun
public void ThreadRun()
{
int count = 0;
while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)
{
lock (((ICollection)_queue).SyncRoot)
{
int item = _queue.Dequeue();
}
count++;
}
Console.WriteLine("Consumer Thread: consumed {0} items", count);
}

Este método utiliza WaitAny para bloquear el subproceso consumidor hasta que se señale cualquiera de los identificadores de
espera en la matriz suministrada. En este caso hay dos identificadores en la matriz: uno para terminar los subprocesos de
trabajo y otro para indicar que se ha agregado un nuevo elemento a la colección. WaitAny devuelve el índice del evento que
se ha señalado. El evento "nuevo elemento" es el primero en la matriz, por lo que un índice de cero indica un nuevo elemento.
En este caso se comprueba si hay un índice de 1, que indica el evento "salir del subproceso", y éste se utiliza para determinar si
el método sigue utilizando elementos. Si el evento "nuevo elemento" se ha señalado, se obtiene acceso exclusivo a la colección
con lock y se utiliza el nuevo elemento. Dado que este ejemplo genera y utiliza miles de elementos, no muestra cada elemento
utilizado. En su lugar se utiliza Main para mostrar periódicamente el contenido de la cola, como se mostrará.
El método Main empieza la creación de la cola cuyo contenido se generará y utilizará, y una instancia de SyncEvents, que se vio
anteriormente:
C#
Queue<int> queue = new Queue<int>();
SyncEvents syncEvents = new SyncEvents();

A continuación, Main configura los objetos Producer y Consumer para el uso con subprocesos de trabajo. Sin embargo, este
paso no crea o inicia los subprocesos de trabajo reales:
C#
Producer producer = new Producer(queue, syncEvents);
Consumer consumer = new Consumer(queue, syncEvents);
Thread producerThread = new Thread(producer.ThreadRun);
Thread consumerThread = new Thread(consumer.ThreadRun);

Observe que la cola y el objeto de evento de sincronización se pasan a los subprocesos Consumer y Producer como
argumentos de constructor. Esto proporciona a ambos objetos los recursos compartidos que necesitan para realizar sus tareas
respectivas. A continuación, se crean dos nuevos objetos Thread utilizando el método ThreadRun de cada objeto como un
argumento. Cada subproceso de trabajo, cuando se inicie, utilizará este argumento como punto de entrada para el subproceso.
Después Main inicia los dos subprocesos de trabajo con una llamada al método Start, de la forma siguiente:
C#
producerThread.Start();
consumerThread.Start();

En este momento, se crean los dos subprocesos de trabajo y se inicia la ejecución asincrónica, independientemente del
subproceso primario que está ejecutando actualmente el método Main. De hecho, lo siguiente que Main hace es suspender el
subproceso primario con una llamada al método Sleep. El método suspende el subproceso que está actualmente en ejecución
durante unos milisegundos. Una vez transcurrido este intervalo, se reactiva Main y, en ese momento, se muestra el contenido
de la cola. Main repite esto cuatro veces, de la forma siguiente:
C#
for (int i=0; i<4; i++)
{
Thread.Sleep(2500);
ShowQueueContents(queue);
}

Por último, Main indica a los subprocesos de trabajo que finalicen invocando al método Set del evento "salir del subproceso" y,
después, llama al método Join en cada subproceso de trabajo para bloquear el subproceso primario hasta que cada
subproceso de trabajo responde al evento y finaliza.
Hay un último ejemplo de sincronización de subprocesos: el método ShowQueueContents. Este método, como los subprocesos
consumidor y productor, utiliza lock para obtener acceso exclusivo a la cola. Sin embargo, en este caso el acceso exclusivo es
particularmente importante, porque ShowQueueContents enumera sobre la colección completa. La enumeración sobre una
colección es una operación especialmente propensa a dañar los datos con operaciones asincrónicas porque implica recorrer el
contenido de toda la colección. El método ShowQueueContents tiene la apariencia siguiente:
C#
syncEvents.ExitThreadEvent.Set();

producerThread.Join();
consumerThread.Join();

Finalmente, observe que el subproceso primario ejecuta ShowQueueContents porque Main lo llama. Esto significa que este
método, cuando obtiene acceso exclusivo a la cola de elementos, bloquea de hecho los subprocesos consumidor y productor
para evitar que tengan acceso a la cola. ShowQueueContents bloquea la cola y enumera el contenido:
C#
private static void ShowQueueContents(Queue<int> q)
{
lock (((ICollection)q).SyncRoot)
{
foreach (int item in q)
{
Console.Write("{0} ", item);
}
}
Console.WriteLine();
}

A continuación se muestra el ejemplo completo.


Ejemplo
C#
using System;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
public class SyncEvents
{
public SyncEvents()
{

_newItemEvent = new AutoResetEvent(false);


_exitThreadEvent = new ManualResetEvent(false);
_eventArray = new WaitHandle[2];
_eventArray[0] = _newItemEvent;
_eventArray[1] = _exitThreadEvent;
}

public EventWaitHandle ExitThreadEvent


{
get { return _exitThreadEvent; }
}
public EventWaitHandle NewItemEvent
{
get { return _newItemEvent; }
}
public WaitHandle[] EventArray
{
get { return _eventArray; }
}

private EventWaitHandle _newItemEvent;


private EventWaitHandle _exitThreadEvent;
private WaitHandle[] _eventArray;
}
public class Producer
{
public Producer(Queue<int> q, SyncEvents e)
{
_queue = q;
_syncEvents = e;
}
// Producer.ThreadRun
public void ThreadRun()
{
int count = 0;
Random r = new Random();
while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))
{
lock (((ICollection)_queue).SyncRoot)
{
while (_queue.Count < 20)
{
_queue.Enqueue(r.Next(0,100));
_syncEvents.NewItemEvent.Set();
count++;
}
}
}
Console.WriteLine("Producer thread: produced {0} items", count);
}
private Queue<int> _queue;
private SyncEvents _syncEvents;
}

public class Consumer


{
public Consumer(Queue<int> q, SyncEvents e)
{
_queue = q;
_syncEvents = e;
}
// Consumer.ThreadRun
public void ThreadRun()
{
int count = 0;
while (WaitHandle.WaitAny(_syncEvents.EventArray) != 1)
{
lock (((ICollection)_queue).SyncRoot)
{
int item = _queue.Dequeue();
}
count++;
}
Console.WriteLine("Consumer Thread: consumed {0} items", count);
}
private Queue<int> _queue;
private SyncEvents _syncEvents;
}

public class ThreadSyncSample


{
private static void ShowQueueContents(Queue<int> q)
{
lock (((ICollection)q).SyncRoot)
{
foreach (int item in q)
{
Console.Write("{0} ", item);
}
}
Console.WriteLine();
}
static void Main()
{
Queue<int> queue = new Queue<int>();
SyncEvents syncEvents = new SyncEvents();

Console.WriteLine("Configuring worker threads...");


Producer producer = new Producer(queue, syncEvents);
Consumer consumer = new Consumer(queue, syncEvents);
Thread producerThread = new Thread(producer.ThreadRun);
Thread consumerThread = new Thread(consumer.ThreadRun);

Console.WriteLine("Launching producer and consumer threads...");


producerThread.Start();
consumerThread.Start();

for (int i=0; i<4; i++)


{
Thread.Sleep(2500);
ShowQueueContents(queue);
}

Console.WriteLine("Signaling threads to terminate...");


syncEvents.ExitThreadEvent.Set();

producerThread.Join();
consumerThread.Join();
}

Resultados del ejemplo


Configuring worker threads...
Launching producer and consumer threads...
22 92 64 70 13 59 9 2 43 52 91 98 50 96 46 22 40 94 24 87
79 54 5 39 21 29 77 77 1 68 69 81 4 75 43 70 87 72 59
0 69 98 54 92 16 84 61 30 45 50 17 86 16 59 20 73 43 21
38 46 84 59 11 87 77 5 53 65 7 16 66 26 79 74 26 37 56 92
Signalling threads to terminate...
Consumer Thread: consumed 1053771 items
Producer thread: produced 1053791 items

Vea también
Tareas
Ejemplo Monitor Synchronization Technology
Ejemplo Wait Synchronization Technology
Referencia
Sincronización de subprocesos (Guía de programación de C#)
lock (Instrucción, Referencia de C#)
AutoResetEvent
ManualResetEvent
Set
Join
WaitOne
WaitAll
Queue
ICollection
Start
Sleep
WaitHandle
EventWaitHandle
Conceptos
Guía de programación de C#
Otros recursos
Thread (Clase)
Guía de programación de C#

Cómo: Utilizar un grupo de subprocesos (Guía de programación


de C#)
Un grupo de subprocesos es una colección de subprocesos que se pueden utilizar para realizar varias tareas en segundo plano.
(Vea Utilizar el subprocesamiento (Guía de programación de C#) para obtener información adicional.) Esto deja libre el
subproceso primario para realizar otras tareas de forma asincrónica.
Los grupos de subprocesos se emplean a menudo en aplicaciones de servidor. Cada solicitud entrante se asigna a un
subproceso del grupo, a fin de que la solicitud se pueda procesar de forma asincrónica, sin acaparar el subproceso primario o
retardar el procesamiento de las solicitudes siguientes.
Cuando un subproceso del grupo finaliza su tarea, se devuelve a una cola de subprocesos en espera, donde se puede reutilizar.
Esta reutilización permite a las aplicaciones evitar el costo de crear un nuevo subproceso para cada tarea.
Los grupos de subprocesos tienen normalmente un número máximo de subprocesos. Si todos los subprocesos están
ocupados, las tareas adicionales se colocan en cola hasta que se puedan atender a medida que los subprocesos queden
disponibles.
Puede implementar su propio grupo de subprocesos, pero es más fácil utilizar el que proporciona .NET Framework a través de
la clase ThreadPool.
El ejemplo siguiente utiliza el grupo de subprocesos de .NET Framework para calcular el resultado de Fibonacci para diez
números entre 20 y 40. Cada resultado de Fibonacci se representa mediante la clase Fibonacci, que proporciona un método
denominado ThreadPoolCallback que realiza el cálculo. Se crea un objeto que representa cada valor de Fibonacci y se pasa el
método ThreadPoolCallback a QueueUserWorkItem, que asigna un subproceso disponible en el grupo para ejecutar el
método.
Debido a que se asigna un valor semialeatorio a cada objeto Fibonacci para el cálculo y cada uno de los diez subprocesos
compite para obtener tiempo del procesador, no existe ninguna manera de saber de antemano cuánto tiempo llevará calcular
los diez resultados. Por eso se pasa a cada objeto Fibonacci una instancia de la clase ManualResetEvent durante la
construcción. Cada objeto señaliza el objeto de evento proporcionado cuando se completa el cálculo, lo que permite al
subproceso primario bloquear la ejecución con WaitAll hasta que los diez objetos Fibonacci han calculado un resultado. A
continuación, el método Main muestra cada resultado de Fibonacci.
Ejemplo
C#
using System;
using System.Threading;

public class Fibonacci


{
public Fibonacci(int n, ManualResetEvent doneEvent)
{
_n = n;
_doneEvent = doneEvent;
}
// Wrapper method for use with thread pool.
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
Console.WriteLine("thread {0} started...", threadIndex);
_fibOfN = Calculate(_n);
Console.WriteLine("thread {0} result calculated...", threadIndex);
_doneEvent.Set();
}
// Recursive method that calculates the Nth Fibonacci number.
public int Calculate(int n)
{
if (n <= 1)
{
return n;
}
return Calculate(n - 1) + Calculate(n - 2);
}
public int N { get { return _n; } }
private int _n;

public int FibOfN { get { return _fibOfN; } }


private int _fibOfN;

private ManualResetEvent _doneEvent;


}
public class ThreadPoolExample
{
static void Main()
{
const int FibonacciCalculations = 10;

// One event is used for each Fibonacci object


ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
Random r = new Random();

// Configure and launch threads using ThreadPool:


Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
for (int i = 0; i < FibonacciCalculations; i++)
{
doneEvents[i] = new ManualResetEvent(false);
Fibonacci f = new Fibonacci(r.Next(20,40), doneEvents[i]);
fibArray[i] = f;
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
}

// Wait for all threads in pool to calculation...


WaitHandle.WaitAll(doneEvents);
Console.WriteLine("All calculations are complete.");

// Display the results...


for (int i= 0; i<FibonacciCalculations; i++)
{
Fibonacci f = fibArray[i];
Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN);
}
}
}

Resultados del ejemplo


launching 10 tasks...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
all calculations complete
Fibonacci(22) = 17711
Fibonacci(25) = 75025
Fibonacci(32) = 2178309
Fibonacci(36) = 14930352
Fibonacci(32) = 2178309
Fibonacci(26) = 121393
Fibonacci(35) = 9227465
Fibonacci(23) = 28657
Fibonacci(39) = 63245986
Fibonacci(22) = 17711

Vea también
Tareas
Ejemplo Monitor Synchronization Technology
Ejemplo Wait Synchronization Technology
Referencia
Subprocesamiento (Guía de programación de C#)
Utilizar el subprocesamiento (Guía de programación de C#)
Mutex
WaitAll
ManualResetEvent
Set
ThreadPool
QueueUserWorkItem
ManualResetEvent
Conceptos
Guía de programación de C#
Monitores
Otros recursos
Seguridad en .NET Framework
CÓMO: Sincronizar el acceso a un recurso compartido en un entorno de subprocesamiento utilizando Visual C# .NET
Guía de programación de C#

Rendimiento (Guía de programación de C#)


En esta sección se tratan dos problemas que pueden afectar negativamente al rendimiento y se ofrecen vínculos a los recursos
sobre problemas de rendimiento.
Boxing y Unboxing
Las conversiones boxing y unboxing son procesos que consumen muchos recursos. Cuando se aplica la conversión boxing a
un tipo de valor, se debe crear un objeto completamente nuevo. Esto puede llevar hasta 20 veces más que una asignación. Al
aplicar la conversión unboxing, el proceso de conversión puede llevar hasta cuatro veces más que una asignación. Para
obtener más información, vea Boxing y Unboxing.
Destructores
No se deben utilizar destructores vacíos. Cuando una clase contiene un destructor, se crea una entrada en la cola Finalize.
Cuando se llama al destructor, se invoca al recolector de elementos no utilizados para procesar la cola. Si el destructor está
vacío, simplemente se produce una pérdida de rendimiento. Para obtener más información, vea
Destructores (Guía de programación de C#).
Otros recursos
Writing Faster Managed Code: Know What Things Cost
Writing High-Performance Managed Applications : A Primer
Garbage Collector Basics and Performance Hints
Performance Tips and Tricks in .NET Applications
Vea también
Referencia
Seguridad (Guía de programación de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#

Reflexión (Guía de programación de C#)


La reflexión proporciona objetos (de tipo Type) que encapsulan ensamblados, módulos y tipos. Se puede utilizar la reflexión
para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo a partir de un objeto
existente, e invocar sus métodos o tener acceso a sus campos y propiedades. Si utiliza atributos en el código, la reflexión le
permite tener acceso a ellos. Para obtener más información, vea Atributos.
Éste es un ejemplo simple de Reflexión que utiliza el método estático, GetType heredado por todos los tipos de la clase base,
Object para obtener el tipo de una variable:
C#
// Using GetType to obtain type information:
int i = 42;
System.Type type = i.GetType();
System.Console.WriteLine(type);

El resultado es:
System.Int32

En este ejemplo, se utiliza la reflexión para obtener el nombre completo de un ensamblado cargado:
C#
// Using Reflection to get information from an Assembly:
System.Reflection.Assembly o = System.Reflection.Assembly.Load("mscorlib.dll");
System.Console.WriteLine(o.GetName());

El resultado es:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Información general sobre la reflexión


La reflexión resulta útil en estas situaciones:
Cuando se necesita tener acceso a atributos en los metadatos del programa. Vea el tema
Acceso a atributos mediante reflexión.
Para examinar e instanciar tipos en un ensamblado.
Para generar nuevos tipos en tiempo de ejecución. Utilice clases en System.Reflection.Emit.
Para realizar enlaces en tiempo de ejecución, con acceso a los métodos en tipos creados en tiempo de ejecución. Vea el
tema Cargar y utilizar tipos dinámicamente.
Secciones relacionadas
Para obtener más información:
Información general sobre la reflexión
Ver información de tipos
Reflexión y tipos genéricos
System.Reflection.Emit
Acceso a atributos mediante reflexión (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.12 Atributos
7.5.11 El operador typeof
Vea también
Referencia
Dominios de aplicación (Guía de programación de C#)
Conceptos
Guía de programación de C#
Ensamblados y Caché de ensamblados global (Guía de programación de C#)
Guía de programación de C#

Archivos DLL de C# (Guía de programación de C#)


Puede utilizar Visual C# para crear archivos DLL a los que pueden llamar otras aplicaciones de .NET y el código no
administrado.
En esta sección
Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#)
Muestra cómo crear proyectos de biblioteca de clases en Visual C#.
Secciones relacionadas
/baseaddress (Especificar la dirección base de un archivo DLL) (Opciones del compilador de C#)
Crear una clase para contener funciones de archivos DLL
Por qué no funcionan los puntos de interrupción del archivo DLL
Depurar proyectos DLL
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Guía de programación de C#

Cómo: Crear y utilizar archivos DLL de C# (Guía de


programación de C#)
Las bibliotecas de vínculos dinámicos (DLL) se vinculan al programa en tiempo de ejecución. Para ilustrar la creación y el uso
de una DLL, considere el siguiente escenario:
MathLibrary.DLL: archivo de biblioteca que contiene los métodos que se utilizarán durante la ejecución. En este ejemplo,
la DLL contiene dos métodos, Add y Multiply.
Add.cs: archivo de código fuente que contiene el método Add(long i, long j). Devuelve la suma de sus parámetros. La
clase AddClass, que contiene el método Add, es un miembro del espacio de nombres UtilityMethods.
Mult.cs: archivo de código fuente que contiene el método Multiply(long x, long y). Devuelve el producto de sus
parámetros. La clase MultiplyClass, que contiene el método Multiply, es también un miembro del espacio de nombres
UtilityMethods.

TestCode.cs: archivo que contiene el método Main. Utiliza los métodos del archivo DLL para calcular la suma y el
producto de los argumentos especificados en tiempo de ejecución.
Ejemplo
C#
// File: Add.cs
namespace UtilityMethods
{
public class AddClass
{
public static long Add(long i, long j)
{
return (i + j);
}
}
}

C#
// File: Mult.cs
namespace UtilityMethods
{
public class MultiplyClass
{
public static long Multiply(long x, long y)
{
return (x * y);
}
}
}

C#
// File: TestCode.cs
using UtilityMethods;

class TestCode
{
static void Main(string[] args)
{
System.Console.WriteLine("Calling methods from MathLibrary.DLL:");
if (args.Length != 2)
{
System.Console.WriteLine("Usage: TestCode <num1> <num2>");
return;
}
long num1 = long.Parse(args[0]);
long num2 = long.Parse(args[1]);

long sum = AddClass.Add(num1, num2);


long product = MultiplyClass.Multiply(num1, num2);

System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);


System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product);
}
}

Este archivo contiene el algoritmo que utiliza los métodos de la DLL, Add y Multiply. Empieza analizando los argumentos
especificados en la línea de comandos, num1 y num2. A continuación, calcula la suma mediante el método Add de la clase
AddClass, y el producto mediante el método Multiply de la clase MultiplyClass.

Observe que la directiva using situada al principio del archivo permite utilizar los nombres de las clases sin calificar para hacer
referencia a los métodos de la DLL en tiempo de compilación, como se indica a continuación:
C#
MultiplyClass.Multiply(num1, num2);

De lo contrario, sería necesario usar nombres completos, como se indica a continuación:


C#
UtilityMethods.MultiplyClass.Multiply(num1, num2);

Execution
Para ejecutar el programa, especifique el nombre del archivo EXE seguido de dos números, como se indica a continuación:
TestCode 1234 5678

Resultados
Calling methods from MathLibrary.DLL:
1234 + 5678 = 6912
1234 * 5678 = 7006652

Compilar el código
Para generar el archivo MathLibrary.DLL, compile los dos archivos Add.cs y Mult.cs mediante la siguiente línea de comandos:
csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs

La opción /target:library indica al compilador que genere un archivo DLL en vez de un archivo EXE. La opción /out del
compilador seguida de un nombre de archivo se utiliza para especificar el nombre de archivo de la DLL. Si no se utiliza, el
compilador usa el primer archivo (Add.cs) como nombre de la DLL.
Para generar el archivo ejecutable, TestCode.exe, utilice la siguiente línea de comandos:
csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs

La opción /out indica al compilador que genere un archivo EXE y especifica el nombre del archivo (TestCode.exe). Esta opción
del compilador no es de uso obligatorio. La opción /reference del compilador especifica el archivo o archivos DLL que utiliza el
programa.
Vea también
Tareas
Cómo: Especificar una dirección base para un archivo DLL
Conceptos
Guía de programación de C#
Crear una clase para contener funciones de archivos DLL
Guía de programación de C#

Seguridad (Guía de programación de C#)


La seguridad es un aspecto fundamental en todas las aplicaciones de C# y debe tenerse en cuenta en todas las fases del
desarrollo: no sólo cuando se ha realizado el diseño y la implementación.
Recomendaciones de seguridad específicas de C#
Ésta no es una lista exhaustiva de posibles problemas de seguridad. En ella se resaltan algunos problemas comunes sobre los
que deben estar prevenidos los desarrolladores de C#.
Utilice la palabra clave checked para controlar el contexto de comprobación de desbordamiento en las conversiones y
operaciones aritméticas de tipo integral.
Utilice siempre el tipo de datos más restrictivo para los parámetros. Por ejemplo, al pasar un valor a un método que
describe el tamaño de una estructura de datos, utilice el entero sin signo en lugar del entero.
No tome decisiones basadas en nombres de archivo. Los nombres de archivo se pueden expresar de muchas maneras
diferentes y se podría omitir la comprobación de un archivo determinado.
No incluya nunca contraseñas o información confidencial en el código de la aplicación.
Valide siempre los datos de entrada que se utilicen para generar consultas SQL.
Valide todas las entradas de los métodos. Los métodos de expresiones regulares en el espacio de nombres
System.Text.RegularExpressions son útiles para confirmar que la entrada sea correcta, como una dirección de correo
electrónico.
No muestre información de excepciones: esto proporciona pistas valiosas a cualquier posible atacante.
Asegúrese de que la aplicación funciona mientras se ejecuta con la menor cantidad de privilegios posibles. Pocas
aplicaciones requieren que el usuario inicie sesión como administrador.
No utilice sus propios algoritmos de cifrado, utilice las clases System.Security.Cryptography.
Asigne nombres seguros a los ensamblados.
No almacene información confidencial en archivos XML o en otros archivos de configuración.
Compruebe el código administrado que envuelve cuidadosamente el código nativo. Confirme que el código nativo sea
seguro, sobre todo con respecto a las saturaciones del búfer.
Actúe con precaución cuando utilice delegados pasados desde fuera de la aplicación.
Ejecute FxCop en los ensamblados para garantizar el cumplimiento de las Instrucciones de diseño de Microsoft .NET
Framework. FxCop también puede encontrar y proporcionar advertencias sobre más de 200 defectos de código.
En esta sección
Los siguientes temas de MSDN proporcionan información detallada sobre la creación de software seguro y confiable.
Centro de desarrollo Microsoft Seguridad.
Defend Your Apps and Critical User Info with Defensive Coding Techniques.
Información general sobre seguridad en .NET Framework.
Protección del código con las diez principales sugerencias sobre seguridad que todo desarrollador debe conocer.
Security Brief: Beware of Fully Trusted Code.
Programmatically check for canonicalization issues with ASP.NET.
Información general sobre la seguridad en formularios Windows Forms
Escribir controles administrados seguros
Vea también
Conceptos
Guía de programación de C#
Referencia del lenguaje C#

Referencia de C#
En esta sección se proporciona material de referencia sobre las palabras clave, operadores, y errores y advertencias del
compilador de C#.
En esta sección
Palabras clave de C#
Palabras clave y sintaxis de C#.
Operadores de C#
Operadores y sintaxis de C#.
Directivas de preprocesador de C#
Comandos del compilador para incrustar en código fuente de C#.
Opciones del compilador de C#
Opciones del compilador y forma de utilizarlas.
Terminología de C#
Glosario de palabras y frases de C#.
Secciones relacionadas
Especificación del lenguaje C#
Proporciona punteros a la última versión de las características técnicas del lenguaje C# en formato Microsoft Word.
P+F sobre C#
Proporciona una lista actualizada de las preguntas más frecuentes sobre C# en el Centro para desarrolladores de C#.
Artículos de Knowledge Base de C# en Microsoft Knowledge Base
Búsqueda en tiempo real de artículos de Knowledge Base relacionados con C# y almacenados en MSDN.
Visual C#
Proporciona un portal de documentación sobre Visual C#.
Ejemplos de Visual C#
Proporciona una lista de ejemplos de Visual C# y vínculos a los mismos.
Características del editor de código de Visual C#
Proporciona vínculos a temas conceptuales y de tareas que describen el IDE y el Editor.
Escribir aplicaciones con Visual C#
Proporciona vínculos a temas que describen la forma de realizar algunas tareas de programación comunes.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Visual C#
Referencia del lenguaje C#

Palabras clave de C#
Las palabras clave son identificadores predefinidos reservados que tienen un significado especial para el compilador. No se
pueden utilizar como identificadores en un programa a menos que incluyan el carácter @ como prefijo. Por ejemplo, @if es un
identificador válido pero if no, por ser una palabra clave.

abstract event new struct

as explicit null switch

base extern object this

bool false operator throw

break finally out true

byte fixed override try

case float params typeof

catch for private uint

char foreach protected ulong

checked goto public unchecked

class if readonly unsafe

const implicit ref ushort

continue in return using

decimal int sbyte virtual

default interface sealed volatile

delegate internal short void

do is sizeof while

double lock stackalloc

else long static

enum namespace string


Palabras clave contextuales
get partial set

value where yield


Vea también
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tipos (Referencia de C#)


El sistema de tipos de C# contiene las siguientes categorías:
Tipos de valor
Tipos de referencia
Tipos de puntero
Las variables de los tipos de valor almacenan datos, mientras que los tipos de referencia almacenan referencias a los datos
reales. Los tipos de referencia también se denominan objetos. Los tipos de puntero sólo se pueden utilizar en modo unsafe.
Un tipo de valor se puede convertir en un tipo de referencia y de nuevo en un tipo de valor mediante boxing y unboxing. No se
puede convertir un tipo de referencia en un tipo de valor, excepto en tipos de valor a los que se les ha aplicado una conversión
boxing.
Esta sección también presenta void.
Los tipos de valor también aceptan valores null, por tanto pueden almacenar un estado sin valor de suma. Para obtener más
información, vea Tipos que aceptan valores NULL (Guía de programación de C#).
Vea también
Referencia
Palabras clave de C#
Conversión (Guía de programación de C#)
Tipos de datos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tipos de valores (Referencia de C#)


Los tipos de valor consisten en dos categorías principales:
Estructuras
Enumeraciones
Las estructuras se dividen en las siguientes categorías:
Tipos numéricos
Tipos integrales
Tipos de punto flotante
decimal
bool
Estructuras definidas por el usuario.
Características principales de los tipos de valor
Variable que está basada directamente en tipos de valor que contienen valores. La asignación de una variable de tipo de valor
a otra copia el valor contenido. Esto es diferente de la asignación de variables de tipo de referencia, que copia una referencia en
el objeto pero no el propio objeto.
Todos los tipos de valor se derivan implícitamente de la clase System.ValueType.
A diferencia de los tipos de referencia, no es posible obtener un nuevo tipo de un tipo de valor. No obstante, al igual que los
tipos de referencia, las estructuras pueden implementar interfaces.
A diferencia de los tipos de referencia, los tipos de valor no pueden incluir el valor null. Sin embargo, la característica
tipos que aceptan valores NULL permite asignar null a tipos de valores.
Cada tipo de valor tiene un constructor implícito predeterminado que inicializa el valor predeterminado de ese tipo. Para
obtener información sobre los valores predeterminados de los tipos de valor, vea Tabla de valores predeterminados.
Características principales de los tipos simples
Todos los tipos simples (aquellos que forman parte integral del lenguaje C#) son alias de los tipos del sistema .NET Framework.
Por ejemplo, int es un alias de System.Int32. Para una lista completa de alias, vea Tabla de tipos integrados (Referencia de C#).
Las expresiones constantes, cuyos operandos son todos constantes de tipos simples, se evalúan en tiempo de compilación.
Los tipos simples se pueden inicializar mediante literales. Por ejemplo, 'A' es un literal del tipo char y 2001 es un literal del tipo
int.
Inicializar tipos de valor
Las variables locales de C# se deben inicializar antes de utilizarlas. Por consiguiente, si se declara una variable local sin
inicialización como ésta:

int myInt;

no se podrá utilizar hasta que se inicialice. La inicialización se puede realizar mediante la siguiente instrucción:

myInt = new int(); // Invoke default constructor for int type.

que equivale a:

myInt = 0; // Assign an initial value, 0 in this example.

También se puede realizar la declaración y la inicialización en la misma instrucción:


int myInt = new int();

O bien

int myInt = 0;

Con el operador new, se realiza una llamada al constructor predeterminado del tipo específico y se asigna el valor
predeterminado a la variable. En el ejemplo anterior, el constructor predeterminado asigna a myInt el valor 0. Para obtener
más información sobre valores asignados mediante constructores predeterminados, vea Tabla de valores predeterminados.
Con los tipos definidos por el usuario, se utiliza new para invocar el constructor predeterminado. Por ejemplo, la siguiente
instrucción invoca el constructor predeterminado de la estructura Point:

Point p = new Point(); // Invoke default constructor for the struct.

Después de esta llamada, la estructura se considera definitivamente asignada; es decir, todos sus miembros se inicializan con
sus valores predeterminados.
Para obtener más información acerca del operador new, vea new.
Para obtener información sobre cómo dar formato a la presentación de tipos numéricos, vea
Tabla de formatos de presentación para valores numéricos.
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tipos (Referencia de C#)
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

bool (Referencia de C#)


La palabra clave bool es un alias de System.Boolean. Se utiliza para declarar variables que almacenan los valores booleanos,
true y false.
Nota
Si requiere una variable booleana que también puede tener un valor de null, utilice bool. Para obtener más información, vea
Tipos que aceptan valores NULL (Guía de programación de C#).

Literales
Puede asignar un valor booleano a una variable de tipo bool. También es posible asignar una expresión que se evalúa como
bool a una variable de tipo bool.

// keyword_bool.cs
using System;
public class MyClass
{
static void Main()
{
bool i = true;
char c = '0';
Console.WriteLine(i);
i = false;
Console.WriteLine(i);

bool Alphabetic = (c > 64 && c < 123);


Console.WriteLine(Alphabetic);
}
}

Resultados
True
False
False

Conversiones
En C++, un valor de tipo bool se puede convertir a un valor de tipo int; es decir, false equivale a cero y true equivale a valores
distintos de cero. En C#, no es posible realizar la conversión del tipo bool a otros tipos o viceversa. Por ejemplo, la siguiente
instrucción if no es válida en C#, aunque sí lo es en C++:

int x = 123;
if (x) // Invalid in C#
{
printf_s("The value of x is nonzero.");
}

Para probar una variable de tipo int, hay que compararla explícitamente con un valor (por ejemplo, cero), como se indica a
continuación:

int x = 123;
if (x != 0) // The C# way
{
Console.Write("The value of x is nonzero.");
}

Ejemplo
En este ejemplo, se escribe un carácter desde el teclado y el programa comprueba si se trata de una letra. En ese caso,
comprueba si es minúscula o mayúscula. Estas comprobaciones se realizan con IsLetter y IsLower, que devuelven el tipo bool:

// keyword_bool_2.cs
using System;
public class BoolTest
{
static void Main()
{
Console.Write("Enter a character: ");
char c = (char)Console.Read();
if (Char.IsLetter(c))
{
if (Char.IsLower(c))
{
Console.WriteLine("The character is lowercase.");
}
else
{
Console.WriteLine("The character is uppercase.");
}
}
else
{
Console.WriteLine("Not an alphabetic character.");
}
}
}

Entrada
X
Resultados del ejemplo
Enter a character: X
The character is uppercase.
Additional sample runs might look as follow:
Enter a character: x
The character is lowercase.

Enter a character: 2
The character is not an alphabetic character.

Especificación del lenguaje C#


Para obtener más información sobre bool y los temas relacionados, consulte las secciones siguientes en
Especificación del lenguaje C#:
4.1.8 El tipo bool
7.9.4 Operadores de igualdad Boolean
7.11.1 Operadores lógicos condicionales Boolean
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

byte (Referencia de C#)


La palabra clave byte denota un tipo integral que almacena valores según se muestra en la tabla siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
byte 0 a 255 Entero de 8 bits sin signo System.Byte
Literales
Las variables de tipo byte se pueden declarar e inicializar como en el siguiente ejemplo:

byte myByte = 255;

En la declaración anterior, el literal entero 255 se convierte implícitamente del tipo int al tipo byte. Si el literal entero supera el
intervalo de valores del tipo byte, se producirá un error de compilación.
Conversiones
Hay una conversión implícita predefinida de byte a short, ushort, int, uint, longo, ulong, float, double o decimal.
No es posible convertir implícitamente a byte otros tipos numéricos no literales de mayor tamaño de almacenamiento. Para
obtener más información acerca de los tamaños de almacenamiento de tipos integrales, vea
Tabla de tipos integrales (Guía de programación de C#). Considere, por ejemplo, las dos variables siguientes de tipo byte, x e y:

byte x = 10, y = 20;

La instrucción de asignación siguiente producirá un error de compilación, ya que la expresión aritmética del lado derecho del
operador de asignación se evalúa de forma predeterminada como int.

// Error: conversion from int to byte:


byte z = x + y;

Para solucionar este problema, utilice una conversión explícita:

// OK: explicit conversion:


byte z = (byte)(x + y);

Sin embargo, es posible utilizar las instrucciones siguientes, donde la variable de destino tiene un tamaño de almacenamiento
igual o superior:

int x = 10, y = 20;


int m = x + y;
long n = x + y;

Sin embargo, no existe conversión implícita de tipos de punto flotante a tipo byte. Por ejemplo, la instrucción siguiente
generará un error de compilación, a menos que se utilice una conversión explícita:

// Error: no implicit conversion from double:


byte x = 3.0;
// OK: explicit conversion:
byte y = (byte)3.0;

Para llamar a métodos sobrecargados, debe utilizarse una conversión explícita de tipos. Considere, por ejemplo, los dos
métodos sobrecargados siguientes que utilizan parámetros de tipo byte e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(byte b) {}
Si se utiliza la conversión explícita al tipo byte, se garantiza la llamada al tipo correcto; por ejemplo:

// Calling the method with the int parameter:


SampleMethod(5);
// Calling the method with the byte parameter:
SampleMethod((byte)5);

Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Byte
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

char (Referencia de C#)


La palabra clave char se utiliza para declarar un carácter Unicode en el intervalo indicado en la siguiente tabla. Los caracteres
Unicode son caracteres de 16 bits que se utilizan para representar la mayoría de los lenguajes escritos de todo el mundo.
Tipo Intervalo Tamaño Tipo de .NET Framework
char U+0000 a U+ffff Carácter Unicode de 16 bits System.Char
Literales
Las constantes de tipo char se pueden escribir como literales de cadena, secuencias de escape hexadecimales o
representaciones Unicode. Los códigos de caracteres integrales se pueden convertir explícitamente al tipo char. En las
siguientes instrucciones se declara una variable de tipo char y se inicializa con el carácter X:

char char1 = 'Z'; // Character literal


char char2 = '\x0058'; // Hexadecimal
char char3 = (char)88; // Cast from integral type
char char4 = '\u0058'; // Unicode

Conversiones
Un tipo char se puede convertir implícitamente en ushort, int, uint, long, ulong, float, double o decimal. Sin embargo, no
existen conversiones implícitas desde otros tipo al tipo char.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
2.4.4.4 Literales de caracteres
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Char Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

decimal (Referencia de C#)


La palabra clave decimal denota un tipo de datos de 128 bits. Comparado con los tipos de punto flotante, el tipo decimal
tiene una mayor precisión y un intervalo más reducido, lo que lo hace adecuado para cálculos financieros y monetarios. El
intervalo aproximado y la precisión para el tipo decimal aparecen en la siguiente tabla.
Tipo Intervalo aproximado Precisión Tipo de .NET Framework
decimal ±1,0 × 10−28 a ±7,9 × 1028 28-29 dígitos significativos System.Decimal
Literales
Si desea tratar un literal numérico real como decimal, utilice el sufijo m o M; por ejemplo:

decimal myMoney = 300.5m;

Sin el sufijo m, el número se trata como double, lo cual genera un error del compilador.
Conversiones
Los tipos integrales se convierten implícitamente a decimal y el resultado se evalúa como decimal. Por consiguiente, es
posible inicializar una variable de tipo decimal mediante un literal entero sin el sufijo, de la manera siguiente:

decimal myMoney = 300;

No existe conversión implícita entre tipos de punto flotante y el tipo decimal; por lo tanto, se debe utilizar una conversión de
tipos para convertir estos dos tipos. Por ejemplo:

decimal myMoney = 99.9m;


double x = (double)myMoney;
myMoney = (decimal)x;

Además, se pueden combinar tipos integrales numéricos y decimal en la misma expresión. No obstante, si se combinan tipos
de punto flotante con el tipo decimal sin realizar una conversión de tipos, se producirá un error de compilación.
Para obtener más información sobre las conversiones numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Para obtener más información sobre las conversiones numéricas explícitas, vea
Tabla de conversiones numéricas explícitas (Referencia de C#).
Dar formato a la presentación de valores de tipo decimal
Se puede dar formato a los resultados mediante el método String.Format o a través del método System.Console.Write, el cual
llama a String.Format(). El formato de moneda se especifica mediante la cadena del formato de moneda estándar "C" o "c",
como se muestra en el ejemplo 2. Para obtener más información sobre el método String.Format, vea
System.String.Format(System.String,System.Object).
Ejemplo
En este ejemplo, se combina un tipo decimal y un tipo int en la misma expresión. El resultado se evalúa como tipo decimal.
Si intenta agregar las variables double y decimal mediante una instrucción como ésta:

double x = 9;
Console.WriteLine(d + x); // Error

obtendrá el siguiente mensaje de error:


Operator '+' cannot be applied to operands of type 'double' and 'decimal'
// keyword_decimal.cs
// decimal conversion
using System;
public class TestDecimal
{
static void Main ()
{
decimal d = 9.1m;
int y = 3;
Console.WriteLine(d + y); // Result converted to decimal
}
}

Resultados
12.1

En este ejemplo, se utiliza la cadena de formato de moneda para dar formato al resultado. Observe que x se redondea, ya que
los dígitos decimales superan $0,99. La variable y, que representa el número máximo de dígitos exactos, se muestra
exactamente en el formato adecuado.

// keyword_decimal2.cs
// Decimal type formatting
using System;
public class TestDecimalFormat
{
static void Main ()
{
decimal x = 0.999m;
decimal y = 9999999999999999999999999999m;
Console.WriteLine("My amount = {0:C}", x);
Console.WriteLine("Your amount = {0:C}", y);
}
}

Resultados
My amount = $1.00
Your amount = $9,999,999,999,999,999,999,999,999,999.00

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.7 El tipo decimal
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Decimal Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

double (Referencia de C#)


La palabra clave double denota un tipo simple que almacena valores de punto flotante de 64 bits. La siguiente tabla muestra
la precisión y el intervalo de valores aproximado para el tipo double.
Tipo Intervalo aproximado Precisión Tipo de .NET Framework
double ±5,0 × 10−324 a ±1,7 × 10308 15-16 dígitos System.Double
Literales
De forma predeterminada, un literal numérico real en el lado derecho del operador de asignación se trata como un valor de
tipo double. No obstante, si desea tratar un número entero como double, utilice el sufijo d o D, por ejemplo:

double x = 3D;

Conversiones
Es posible combinar tipos numéricos integral y tipos de punto flotante en una expresión. En este caso, los tipos integrales se
convierten en tipos de punto flotante. La evaluación de la expresión se realiza según las siguientes reglas:
Si uno de los tipos de punto flotante es double, la expresión se evalúa como double o bool en el caso de expresiones
relacionales o booleanas.
Si no existe ningún tipo double en la expresión, ésta se evalúa como float, o bool en el caso de expresiones relacionales
o booleanas.
Una expresión de punto flotante puede contener los siguientes conjuntos de valores:
Cero negativo y positivo.
Infinito positivo y negativo.
Valor NaN (no es un número).
El conjunto finito de valores distintos de cero.
Para obtener más información sobre estos valores, consulte el estándar IEEE para aritmética binaria de punto flotante,
disponible en el sitio Web http://www.ieee.org/portal/index.jsp.
Ejemplo
En el ejemplo siguiente, se suman valores int, short, float y double que dan un resultado double.

// keyword_double.cs
// Mixing types in expressions
using System;
class MixedTypes
{
static void Main()
{
int x = 3;
float y = 4.5f;
short z = 5;
double w = 1.7E+3;
// Result of the 2nd argument is a double:
Console.WriteLine("The sum is {0}", x + y + z + w);
}
}

Resultados
The sum is 1712.5

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de valores predeterminados (Referencia de C#)
Tabla de tipos de punto flotante (Referencia de C#)
Referencia del lenguaje C#

enum (Referencia de C#)


La palabra clave enum se utiliza para declarar una enumeración, un tipo distinto que consiste en un conjunto de constantes
con nombre denominado lista de enumeradores. Cada tipo de enumeración tiene un tipo subyacente, que puede ser cualquier
tipo integral excepto char. El tipo predeterminado subyacente de los elementos de la enumeración es int. De forma
predeterminada, el primer enumerador tiene el valor 0 y el valor de cada enumerador sucesivo se incrementa en 1. Por
ejemplo:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

En esta enumeración, Sat es 0, Sun es 1, Mon es 2 y así sucesivamente. Los enumeradores pueden tener inicializadores que
reemplazan a los valores predeterminados. Por ejemplo:

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

En esta enumeración, se obliga a que la secuencia de elementos empiece en 1 en vez de en 0.


A una variable de tipo Days se le puede asignar cualquier valor en el intervalo del tipo subyacente; los valores no se limitan a
las constantes con nombre.
El valor predeterminado de un enum E es el valor producido por la expresión (E)0.
Nota
Un enumerador no puede contener espacio en blanco en su nombre.

El tipo subyacente especifica el almacenamiento asignado para cada enumerador. No obstante, se necesita una conversión
explícita para convertir un tipo enum a un tipo integral. Por ejemplo, la siguiente instrucción asigna el enumerador Sun a una
variable de tipo int utilizando una conversión explícita para convertir de enum a int:

int x = (int)Days.Sun;

Cuando se aplica System.FlagsAttribute a una enumeración que contiene algunos elementos combinados con una operación
OR bit a bit, se observará que el atributo afecta el comportamiento de enum cuando se utiliza con algunas herramientas. Se
pueden observar estos cambios al utilizar herramientas tales como los métodos de la clase Console, el Evaluador de
expresiones, etc. (Vea el ejemplo 3).
Programación sólida
Asignar valores adicionales a nuevas versiones de enumeraciones o cambiar los valores de los miembros de enumeración en
una nueva versión, puede producir problemas para el código fuente dependiente. Es común que los valores enum se utilicen
en instrucciones switch y, si se han agregado elementos adicionales al tipo enum, la comprobación de los valores
predeterminados puede devolver true de forma inesperada.
Si otros desarrolladores van a utilizar su código, es importante proporcionar instrucciones sobre cómo su código debe
reaccionar si se agregan nuevos elementos a cualquier tipo enum.
Ejemplo
En este ejemplo, se declara la enumeración Days. Dos enumeradores se convierten explícitamente en un número entero y se
asignan a variables de número entero.

// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest
{
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}

Resultados
Sun = 2
Fri = 7

En este ejemplo, la opción de tipo base se utiliza para declarar un enum cuyos miembros son del tipo long. Observe que a
pesar de que el tipo subyacente de la enumeración es long, los miembros de la enumeración todavía deben convertirse
explícitamente al tipo long mediante una conversión de tipos.

// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest
{
enum Range :long {Max = 2147483648L, Min = 255L};
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}

Resultados
Max = 2147483648
Min = 255

El ejemplo de código siguiente ilustra el uso y efecto del atributo System.FlagsAttribute en una declaración enum.

// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;

[Flags]
public enum CarOptions
{
SunRoof = 0x01,
Spoiler = 0x02,
FogLights = 0x04,
TintedWindows = 0x08,
}

class FlagTest
{
static void Main()
{
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
Console.WriteLine(options);
Console.WriteLine((int)options);
}
}

Resultados
SunRoof, FogLights
5
Comentarios
Observe que si se quita el inicializador de Sat=1, el resultado será:

Sun = 1
Fri = 6

Comentarios
Observe que si elimina FlagsAttribute, el ejemplo generará lo siguiente:
5
5

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.10 Enumeraciones
6.2.2 Conversiones explícitas de enumeración
14 Enumeraciones
Vea también
Tareas
Ejemplo de atributos
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Diseño de enumeraciones
Otros recursos
Referencia de C#
Referencia del lenguaje C#

float (Referencia de C#)


La palabra clave float denota un tipo simple que almacena valores de punto flotante de 32 bits. La siguiente tabla muestra la
precisión y el intervalo de valores aproximado para el tipo float.
Tipo Intervalo aproximado Precisión Tipo de .NET Framework
float ±1,5 × 10−45 a ±3,4 × 1038 7 dígitos System.Single
Literales
De forma predeterminada, un literal numérico real en el lado derecho del operador de asignación se trata como double. Por
consiguiente, para inicializar una variable de tipo float, utilice el sufijo f o F de la manera siguiente:

float x = 3.5F;

Si no utiliza este sufijo en la declaración anterior, obtendrá un error de compilación, ya que está intentando almacenar un valor
de tipo double en una variable de tipo float.
Conversiones
Es posible combinar tipos numéricos integral y tipos de punto flotante en una expresión. En este caso, los tipos integrales se
convierten en tipos de punto flotante. La evaluación de la expresión se realiza según las siguientes reglas:
Si uno de los tipos de punto flotante es double, la expresión se evalúa como double o bool en el caso de expresiones
relacionales o booleanas.
Si no existe ningún tipo double en la expresión, ésta se evalúa como float o bool en el caso de expresiones relacionales o
booleanas.
Una expresión de punto flotante puede contener los siguientes conjuntos de valores:
Cero negativo y positivo
Infinito positivo y negativo
Valor NaN (no es un número)
El conjunto finito de valores distintos de cero
Para obtener más información sobre estos valores, consulte el estándar IEEE para aritmética binaria de punto flotante,
disponible en el sitio Web http://www.ieee.org/.
Ejemplo
En el siguiente ejemplo, una expresión matemática incluye valores de tipo int, short y float, y proporciona un resultado de tipo
float. Observe que la expresión no incluye ningún valor de tipo double.

// keyword_float.cs
// Mixing types in expressions
using System;
class MixedTypes
{
static void Main()
{
int x = 3;
float y = 4.5f;
short z = 5;
Console.WriteLine("The result is {0}", x * y / z);
}
}

Resultados
The result is 2.7
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
4.1.6 Tipos de punto flotante
6.2.1 Conversiones explícitas numéricas
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Single Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

int (Referencia de C#)


La palabra clave int denota un tipo integral que almacena valores según el tamaño y el intervalo que se indican en la tabla
siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
int -2.147.483.648 a 2.147.483.647 Entero de 32 bits con signo System.Int32
Literales
Las variables de tipo int se pueden declarar e inicializar como en el siguiente ejemplo:

int i = 123;

Cuando un literal entero no tiene sufijo, su tipo es el primero de estos tipos en el que se puede representar su valor: int, uint,
long, ulong. En este ejemplo, es del tipo int.
Conversiones
Existe una conversión implícita predefinida de int a long, float, double o decimal. Por ejemplo:

// '123' is an int, so an implicit conversion takes place here:


float f = 123;

Existe una conversión implícita predefinida de sbyte, byte, short, ushort o char a int. Por ejemplo, la instrucción de asignación
siguiente genera un error de compilación si no se emplea una conversión explícita:

long aLong = 22;


int i1 = aLong; // Error: no implicit conversion from long.
int i2 = (int)aLong; // OK: explicit conversion.

Observe que no existe conversión implícita de tipos de punto flotante a int. Por ejemplo, la instrucción siguiente generará un
error de compilación, a menos que se utilice una conversión explícita:

int x = 3.0; // Error: no implicit conversion from double.


int y = (int)3.0; // OK: explicit conversion.

Para obtener más información sobre las expresiones aritméticas con tipos de punto flotante y tipos integrales, vea
float (Referencia de C#) y double (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Int32 Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

long (Referencia de C#)


La palabra clave long denota un tipo integral que almacena valores según el tamaño y el intervalo que se indican en la tabla
siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
long –9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 Entero de 64 bits con signo System.Int64
Literales
Las variables de tipo long se pueden declarar e inicializar como en el siguiente ejemplo:

long long1 = 4294967296;

Cuando un literal entero no tiene sufijo, su tipo es el primero de estos tipos en el que se puede representar su valor: int, uint,
long, ulong. En el ejemplo anterior, es del tipo long, ya que supera el intervalo de uint (vea
Tabla de tipos integrales (Guía de programación de C#) para conocer los tamaños de almacenamiento de los tipos integrales).
También se puede utilizar el sufijo L con el tipo long de este modo:

long long2 = 4294967296L;

Cuando se utiliza el sufijo L, el tipo del entero literal será long o ulong, según su tamaño. En este caso, es long, ya que es
menor que el intervalo de ulong.
El sufijo se utiliza habitualmente en las llamadas a métodos sobrecargados. Considere, por ejemplo, los dos métodos
sobrecargados siguientes que utilizan parámetros de tipo long e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(long l) {}

Si se utiliza el sufijo L, se garantiza la llamada al tipo correcto; por ejemplo:

SampleMethod(5); // Calling the method with the int parameter


SampleMethod(5L); // Calling the method with the long parameter

El tipo long se puede utilizar con otros tipos integrales numéricos en la misma expresión, en cuyo caso la expresión se evalúa
como long (o bool en el caso de expresiones relacionales o booleanas). Por ejemplo, la siguiente expresión se evalúa como
long:

898L + 88

Nota
También se puede utilizar la letra minúscula "l" como sufijo. No obstante, el compilador generará una advertencia, ya que la l
etra "l" se confunde fácilmente con el dígito "1". Utilice "L" por motivos de claridad.

Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Conversiones
Existe una conversión implícita predefinida de long a float, double o decimal. En los demás casos, se debe utilizar una
conversión explícita. Por ejemplo, la instrucción siguiente genera un error de compilación si no se emplea una conversión
explícita:

int x = 8L; // Error: no implicit conversion from long to int


int x = (int)8L; // OK: explicit conversion to int
Existe una conversión implícita predefinida de sbyte, byte, short, ushort, int, uint o char a long.
Observe que no existe conversión implícita de tipos de punto flotante a long. Por ejemplo, la instrucción siguiente generará un
error de compilación, a menos que se utilice una conversión explícita:

long x = 3.0; // Error: no implicit conversion from double


long y = (long)3.0; // OK: explicit conversion

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Int64 Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

sbyte (Referencia de C#)


La palabra clave sbyte denota un tipo integral que almacena valores según el tamaño y el intervalo que se indican en la tabla
siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
sbyte –128 a 127 Entero de 8 bits con signo System.SByte
Literales
Las variables de tipo sbyte se pueden declarar e inicializar como en el siguiente ejemplo:

sbyte sByte1 = 127;

En la declaración anterior, el literal entero 127 se convierte implícitamente del tipo int al tipo sbyte. Si el literal entero supera el
intervalo de valores del tipo sbyte, se producirá un error de compilación.
Debe utilizarse una conversión de tipos al llamar a métodos sobrecargados. Considere, por ejemplo, los dos métodos
sobrecargados siguientes que utilizan parámetros de tipo sbyte e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(sbyte b) {}

Si se utiliza la conversión explícita al tipo sbyte, se garantiza la llamada al tipo correcto; por ejemplo:

// Calling the method with the int parameter:


SampleMethod(5);
// Calling the method with the sbyte parameter:
SampleMethod((sbyte)5);

Conversiones
Existe una conversión implícita predefinida de sbyte a short, int, long, float, double o decimal.
No se pueden convertir implícitamente tipos numéricos no literales cuyo tamaño de almacenamiento sea superior a sbyte
(vea Tabla de tipos integrales (Guía de programación de C#) para conocer los tamaños de almacenamiento de los tipos
integrales). Considere, por ejemplo, las dos variables siguientes de tipo sbyte, x e y:

sbyte x = 10, y = 20;

La instrucción de asignación siguiente producirá un error de compilación, ya que la expresión aritmética del lado derecho del
operador de asignación se evalúa como int de forma predeterminada.

sbyte z = x + y; // Error: conversion from int to sbyte

Para corregir este problema, convierta la expresión del modo siguiente:

sbyte z = (sbyte)(x + y); // OK: explicit conversion

Sin embargo, es posible utilizar las instrucciones siguientes, donde la variable de destino tiene un tamaño de almacenamiento
igual o superior:

sbyte x = 10, y = 20;


int m = x + y;
long n = x + y;

Observe que no existe conversión implícita de tipos de punto flotante a sbyte. Por ejemplo, la instrucción siguiente generará
un error de compilación, a menos que se utilice una conversión explícita:

sbyte x = 3.0; // Error: no implicit conversion from double


sbyte y = (sbyte)3.0; // OK: explicit conversion

Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
SByte Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

short (Referencia de C#)


La palabra clave short denota un tipo de datos integral que almacena valores según el tamaño y el intervalo que se indican en
la tabla siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
short –32.768 a 32.767 Entero de 16 bits con signo System.Int16
Literales
Las variables de tipo short se pueden declarar e inicializar como en el siguiente ejemplo:

short x = 32767;

En la declaración anterior, el literal entero 32767 se convierte implícitamente del tipo int al tipo short. Si el literal entero no
cabe en el espacio de almacenamiento reservado para un tipo short, se produce un error de compilación.
Debe utilizarse una conversión de tipos al llamar a métodos sobrecargados. Considere, por ejemplo, los dos métodos
sobrecargados siguientes que utilizan parámetros de tipo short e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(short s) {}

Si se utiliza la conversión explícita al tipo short, se garantiza la llamada al tipo correcto; por ejemplo:

SampleMethod(5); // Calling the method with the int parameter


SampleMethod((short)5); // Calling the method with the short parameter

Conversiones
Existe una conversión implícita predefinida de short a int, long, float, double o decimal.
No se pueden convertir implícitamente tipos numéricos no literales cuyo tamaño de almacenamiento sea superior a short (vea
Tabla de tipos integrales (Guía de programación de C#) para conocer los tamaños de almacenamiento de los tipos integrales).
Considere, por ejemplo, las dos variables siguientes de tipo short, x e y:

short x = 5, y = 12;

La instrucción de asignación siguiente producirá un error de compilación, ya que la expresión aritmética del lado derecho del
operador de asignación se evalúa como int de forma predeterminada.
short z = x + y; // Error: no conversion from int to short

Para solucionar este problema, utilice una conversión explícita:


short z = ( short )(x + y); // OK: explicit conversion

Sin embargo, es posible utilizar las instrucciones siguientes, donde la variable de destino tiene un tamaño de almacenamiento
igual o superior:

int m = x + y;
long n = x + y;

No existe conversión implícita de tipos de punto flotante a tipo short. Por ejemplo, la instrucción siguiente generará un error
de compilación, a menos que se utilice una conversión explícita:

short x = 3.0; // Error: no implicit conversion from double


short y = (short)3.0; // OK: explicit conversion
Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Int16
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

struct (Referencia de C#)


Un tipo struct es un tipo de valor que se suele utilizar para encapsular pequeños grupos de variables relacionadas, como las
coordenadas de un rectángulo o las características de un elemento de un inventario. En el ejemplo siguiente se muestra una
declaración de estructura sencilla.

public struct Book


{
public decimal price;
public string title;
public string author;
}

Comentarios
Las estructuras también pueden contener constructores, constantes, campos, métodos, propiedades, indizadores, operadores,
eventos y tipos anidados, aunque si se requieren estos miembros, se debe considerar la posibilidad de crear una clase en vez
de un tipo.
Las estructuras pueden implementar una interfaz, pero no pueden heredar de otra estructura. Por esa razón, los miembros de
estructura no se pueden declarar como protected.
Para obtener más información, vea Estructuras (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
11 Estructuras
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrados (Referencia de C#)
Tipos de valores (Referencia de C#)
class (Referencia de C#)
interface (Referencia de C#)
Objetos, clases y estructuras (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de valores predeterminados (Referencia de C#)
Tipos (Referencia de C#)
Referencia del lenguaje C#

uint (Referencia de C#)


La palabra clave uint denota un tipo integral que almacena valores según el tamaño y el intervalo que se indican en la tabla
siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
uint 0 a 4.294.967.295 Entero de 32 bits sin signo System.UInt32
Literales
Las variables de tipo uint se pueden declarar e inicializar como en el siguiente ejemplo:

uint myUint = 4294967290;

Cuando un literal entero no tiene sufijo, su tipo es el primero de estos tipos en el que se puede representar su valor: int, uint,
long, ulong. En este ejemplo, es uint:

uint uInt1 = 123;

También se puede utilizar el sufijo u o U:

uint uInt2 = 123U;

Cuando se utiliza el sufijo U o u, el tipo del literal puede ser uint o ulong según el valor numérico del literal. Por ejemplo:

Console.WriteLine(44U.GetType());
Console.WriteLine(323442434344U.GetType());

Este código muestra System.UInt32, seguido de System.UInt64 (los tipos subyacentes de uint y ulong, respectivamente),
porque el segundo literal es demasiado grande para que lo almacene el tipo uint.
Conversiones
Existe una conversión implícita predefinida de uint a long, ulong, float, double o decimal. Por ejemplo:

float myFloat = 4294967290; // OK: implicit conversion to float

Existe una conversión implícita predefinida de byte, ushort o char a uint. En cualquier otro caso, se debe utilizar una
conversión explícita. Por ejemplo, la instrucción de asignación siguiente genera un error de compilación si no se emplea una
conversión explícita:

long aLong = 22;


// Error -- no implicit conversion from long:
uint uInt1 = aLong;
// OK -- explicit conversion:
uint uInt2 = (uint)aLong;

Observe que no existe conversión implícita de tipos de punto flotante a uint. Por ejemplo, la instrucción siguiente generará un
error de compilación, a menos que se utilice una conversión explícita:

// Error -- no implicit conversion from double:


uint x = 3.0;
// OK -- explicit conversion:
uint y = (uint)3.0;
Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
UInt32 Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

ulong (Referencia de C#)


La palabra clave ulong denota un tipo integral que almacena valores según el tamaño y el intervalo que se indican en la tabla
siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
ulong 0 a 18.446.744.073.709.551.615 Entero de 64 bits sin signo System.UInt64
Literales
Las variables de tipo ulong se pueden declarar e inicializar como en el siguiente ejemplo:

ulong uLong = 9223372036854775808;

Cuando un literal entero no tiene sufijo, su tipo es el primero de estos tipos en el que se puede representar su valor: int, uint,
long, ulong. En el ejemplo anterior, es del tipo ulong.
También se pueden utilizar sufijos para especificar el tipo del literal, de acuerdo con las siguientes reglas:
Cuando se utiliza el sufijo L o l, el tipo del entero literal será long o ulong, según su tamaño.
Nota
Se puede utilizar la letra minúscula "l" como sufijo. No obstante, el compilador generará una advertencia, ya que la letr
a "l" se confunde fácilmente con el dígito "1". Utilice "L" por motivos de claridad.

Cuando se utiliza el sufijo U o u, el tipo del entero literal será uint o ulong, según su tamaño.
Si se utiliza UL, ul, Ul, uL, LU, lu, Lu o lU, el tipo del entero literal será ulong.
Por ejemplo, el resultado de las tres instrucciones siguientes será el tipo UInt64, que corresponde al alias ulong:

Console.WriteLine(9223372036854775808L.GetType());
Console.WriteLine(123UL.GetType());
Console.WriteLine((123UL + 456).GetType());

El sufijo se utiliza habitualmente en las llamadas a métodos sobrecargados. Considere, por ejemplo, los dos métodos
sobrecargados siguientes que utilizan parámetros de tipo ulong e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(ulong l) {}

Si se utiliza un sufijo con el parámetro ulong, se garantiza la llamada al tipo correcto; por ejemplo:

SampleMethod(5); // Calling the method with the int parameter


SampleMethod(5UL); // Calling the method with the ulong parameter

Conversiones
Existe una conversión implícita predefinida de ulong a float, double o decimal.
Sin embargo, no existe conversión implícita de ulong a cualquier tipo integral. Por ejemplo, la instrucción siguiente genera un
error de compilación si no se emplea una conversión explícita:

long long1 = 8UL; // Error: no implicit conversion from ulong

Existe una conversión implícita predefinida de byte, ushort, uint o char a ulong.
Sin embargo, no existe conversión implícita de tipos de punto flotante a tipo ulong. Por ejemplo, la instrucción siguiente
generará un error de compilación, a menos que se utilice una conversión explícita:

// Error -- no implicit conversion from double:


ulong x = 3.0;
// OK -- explicit conversion:
ulong y = (ulong)3.0;

Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
UInt64 Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

ushort (Referencia de C#)


La palabra clave ushort denota un tipo de datos integral que almacena valores según el tamaño y el intervalo que se indican
en la tabla siguiente.
Tipo Intervalo Tamaño Tipo de .NET Framework
ushort 0 a 65.535 Entero de 16 bits sin signo System.UInt16
Literales
Las variables de tipo ushort se pueden declarar e inicializar como en el siguiente ejemplo:

ushort myShort = 65535;

En la declaración anterior, el literal entero 65535 se convierte implícitamente del tipo int al tipo ushort. Si el literal entero
supera el intervalo de valores del tipo ushort, se producirá un error de compilación.
Debe utilizarse una conversión de tipos al llamar a métodos sobrecargados. Considere, por ejemplo, los dos métodos
sobrecargados siguientes que utilizan parámetros de tipo ushort e int:

public static void SampleMethod(int i) {}


public static void SampleMethod(ushort s) {}

Si se utiliza la conversión explícita al tipo ushort, se garantiza la llamada al tipo correcto; por ejemplo:

// Calls the method with the int parameter:


SampleMethod(5);
// Calls the method with the ushort parameter:
SampleMethod((ushort)5);

Conversiones
Existe una conversión implícita predefinida de ushort a int, uint, long, ulong, float, double o decimal.
Existe una conversión implícita predefinida de byte o char a ushort. En cualquier otro caso, se debe utilizar una conversión
explícita. Considere, por ejemplo, las dos variables siguientes de tipo ushort, x e y:

ushort x = 5, y = 12;

La instrucción de asignación siguiente producirá un error de compilación, ya que la expresión aritmética del lado derecho del
operador de asignación se evalúa de forma predeterminada como int.

ushort z = x + y; // Error: conversion from int to ushort

Para solucionar este problema, utilice una conversión explícita:

ushort z = (ushort)(x + y); // OK: explicit conversion

Sin embargo, es posible utilizar las instrucciones siguientes, donde la variable de destino tiene un tamaño de almacenamiento
igual o superior:

int m = x + y;
long n = x + y;
Observe que no existe conversión implícita de tipos de punto flotante a ushort. Por ejemplo, la instrucción siguiente generará
un error de compilación, a menos que se utilice una conversión explícita:

// Error -- no implicit conversion from double:


ushort x = 3.0;
// OK -- explicit conversion:
ushort y = (ushort)3.0;

Para obtener más información sobre expresiones aritméticas con tipos de punto flotante y tipos integrales, vea float y double.
Para obtener más información sobre reglas de conversión numéricas implícitas, vea
Tabla de conversiones numéricas implícitas (Referencia de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.3 Tipos y variables
4.1.5 Tipos integrales
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
UInt16 Structure
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tipos de referencia (Referencia de C#)


Las variables de tipos de referencia, conocidas como objetos, almacenan referencias a los datos reales. Esta sección presenta
las palabras clave siguientes utilizadas para declarar tipos de referencia:
class
interface
delegate
Esta sección también presenta los siguientes tipos de referencia integrados:
object
string
Vea también
Referencia
Palabras clave de C#
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tipos (Referencia de C#)
Referencia del lenguaje C#

class (Referencia de C#)


Las clases se declaran mediante la palabra clave class, como se muestra en el ejemplo siguiente:

class TestClass
{
// Methods, properties, fields, events, delegates
// and nested classes go here.
}

Comentarios
A diferencia de C++, en C# sólo se permite la herencia simple. En otras palabras, una clase puede heredar la implementación
de una sola clase base. Sin embargo, una clase puede implementar más de una interfaz. La siguiente tabla muestra ejemplos
de herencia de clases e implementación de interfaces:
Herencia Ejemplo
Ninguna class ClassA { }

Simple class DerivedClass: BaseClass { }

Ninguna, implementa dos interfaces class ImplClass: IFace1, IFace2 { }

Simple, implementa una interfaz class ImplDerivedClass: BaseClass, IFace1 { }

Los niveles de acceso protected y private sólo se permiten en clases anidadas.


También se pueden declarar clases genéricas que tengan parámetros de tipo; vea
Clases genéricas (Guía de programación de C#) para obtener más información.
Una clase puede contener declaraciones de los siguientes miembros:
Constructores
Destructores
Constantes
Campos
Métodos
Propiedades
Indizadores
Operadores
Eventos
Delegados
Clases
Interfaces
Estructuras
Ejemplo
En el siguiente ejemplo se muestra la declaración de campos de clase, constructores y métodos. También muestra la creación
de instancias de objetos y la impresión de datos de instancia. En este ejemplo, se declaran dos clases, la clase Kid, que contiene
dos campos privados (name y age) y dos métodos públicos. La segunda clase, MainClass, se utiliza para contener Main.
// keyword_class.cs
// class example
using System;
class Kid
{
private int age;
private string name;

// Default constructor:
public Kid()
{
name = "N/A";
}
// Constructor:
public Kid(string name, int age)
{
this.name = name;
this.age = age;
}
// Printing method:
public void PrintKid()
{
Console.WriteLine("{0}, {1} years old.", name, age);
}
}
class MainClass
{
static void Main()
{
// Create objects
// Objects must be created using the new operator:
Kid kid1 = new Kid("Craig", 11);
Kid kid2 = new Kid("Sally", 10);
// Create an object using the default constructor:
Kid kid3 = new Kid();

// Display results:
Console.Write("Kid #1: ");
kid1.PrintKid();
Console.Write("Kid #2: ");
kid2.PrintKid();
Console.Write("Kid #3: ");
kid3.PrintKid();
}
}

Resultados
Kid #1: Craig, 11 years old.
Kid #2: Sally, 10 years old.
Kid #3: N/A, 0 years old.

Comentarios
En el ejemplo anterior, observe que sólo se puede obtener acceso a los campos privados (name y age) a través de los métodos
públicos de la clase Kid. Por ejemplo, no es posible imprimir un valor name de la clase kid, desde el método Main, con una
instrucción como ésta:

Console.Write(kid1.name); // Error

El acceso a los miembros privados de Kid desde Main sólo sería posible si Main fuera un miembro de la clase.
Los tipos declarados en una clase sin un modificador de acceso tienen como valor predeterminado private, de modo que los
miembros de datos de este ejemplo seguirían siendo private aunque se quite la palabra clave.
Por último, observe que, para el objeto creado mediante el constructor predeterminado (kid3), el campo age se inicializó a cero
de forma predeterminada.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6 Clases y objetos
3.4.4 Miembros de clase
4.2.1 Tipos de clase
10 Clases
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

delegate (Referencia de C#)


La declaración de un tipo de delegado se presenta de la siguiente forma:

public delegate void TestDelegate(string message);

La palabra clave delegate se usa para declarar un tipo de referencia, que puede utilizarse para encapsular un método con
nombre o anónimo. Los delegados son similares a los punteros a funciones de C++, pero son más seguros y proporcionan
mayor seguridad de tipos. Para las aplicaciones de delegados, vea Delegados y Delegados genéricos.
Comentarios
Los delegados son la base de los eventos.
Se pueden crear instancias de un delegado asociándolo a un método con nombre o anónimo. Para obtener más información,
vea Métodos con nombre y Métodos anónimos.
Para el uso con métodos con nombre, se deben crear instancias del delegado con un método que tenga una firma aceptable.
Para obtener más información sobre el grado de variación permitida en la firma de método, vea
Covarianza y contravarianza en los delegados. Para el uso con métodos anónimos, el delegado y el código que se van a asociar
se declaran juntos. En esta sección se describen las dos formas de crear instancias de delegados.

using System;
// Declare delegate -- defines required signature:
delegate void SampleDelegate(string message);

class MainClass
{
// Regular method that matches signature:
static void SampleDelegateMethod(string message)
{
Console.WriteLine(message);
}

static void Main()


{
// Instantiate delegate with named method:
SampleDelegate d1 = SampleDelegateMethod;
// Instantiate delegate with anonymous method:
SampleDelegate d2 = delegate(string message)
{
Console.WriteLine(message);
};
// Invoke delegate d1:
d1("Hello");
// Invoke delegate d2:
d2(" World");
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.11 Delegados
15 Delegados
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Métodos anónimos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Delegados (Guía de programación de C#)
Eventos (Guía de programación de C#)
Métodos con nombre (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

interface (Referencia de C#)


Una interfaz contiene sólo las firmas de métodos, delegados o eventos. La implementación de los métodos se hace en la clase
que implementa la interfaz, como se muestra en el ejemplo siguiente:

interface ISampleInterface
{
void SampleMethod();
}

class ImplementationClass : ISampleInterface


{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}

static void Main()


{
// Declare an interface instance.
ISampleInterface obj = new ImplementationClass();

// Call the member.


obj.SampleMethod();
}
}

Comentarios
Una interfaz puede ser miembro de un espacio de nombres o de una clase, y puede contener firmas de los siguientes
miembros:
Métodos
Propiedades
Indizadores
Eventos
Una interfaz puede heredar de una o varias interfaces base.
Cuando una lista de tipos base contiene una clase base e interfaces, la clase base debe aparecer primero en la lista.
Una clase que implementa una interfaz puede implementar explícitamente miembros de esa interfaz. Sólo se puede tener
acceso a un miembro explícitamente implementado mediante una instancia de la interfaz, y no mediante una instancia de
clase, por ejemplo:
Para obtener información más detallada y ejemplos de código de la implementación de interfaces explícita, vea
Implementación explícita de interfaz (Guía de programación de C#).
Ejemplo
En el siguiente ejemplo, se muestra la implementación de una interfaz. En este ejemplo, la interfaz IPoint contiene la
declaración de propiedades, la cual es responsable de establecer y obtener los valores de los campos. La clase Point contiene
la implementación de las propiedades.

// keyword_interface_2.cs
// Interface implementation
using System;
interface IPoint
{
// Property signatures:
int x
{
get;
set;
}
int y
{
get;
set;
}
}

class Point : IPoint


{
// Fields:
private int _x;
private int _y;
// Constructor:
public Point(int x, int y)
{
_x = x;
_y = y;
}

// Property implementation:
public int x
{
get
{
return _x;
}

set
{
_x = value;
}
}

public int y
{
get
{
return _y;
}
set
{
_y = value;
}
}
}
class MainClass
{
static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.x, p.y);
}

static void Main()


{
Point p = new Point(2, 3);
Console.Write("My Point: ");
PrintPoint(p);
}
}

Resultados
My Point: x=2, y=3

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.9 Interfaces
3.4.5 Miembros de interfaz
4.2.4 Tipos de interfaz
10.1.2.2 Implementaciones de interfaz
11.2 Interfaces de estructura
13 Interfaces
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Utilizar propiedades (Guía de programación de C#)
Utilizar indizadores (Guía de programación de C#)
class (Referencia de C#)
struct (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

object (Referencia de C#)


El tipo object es un alias de Object en .NET Framework. En el sistema de tipos unificado de C#, todos los tipos (tipos de valor y
de referencia predefinidos y definidos por el usuario) se heredan directa o indirectamente de Object. Las variables de tipo
object pueden recibir valores de cualquier tipo. Cuando una variable de un tipo de valor se convierte en un objeto, se dice que
se le ha aplicado la conversión boxing. Cuando una variable de objeto de tipo se convierte en un tipo de valor, se dice que se le
ha aplicado la conversión unboxing. Para obtener más información, vea Boxing y Unboxing.
Ejemplo
En el siguiente ejemplo se muestra cómo las variables de tipo object pueden aceptar valores de cualquier tipo de datos y
cómo pueden utilizar métodos de Object procedentes de .NET Framework.

// keyword_object.cs
using System;
class SampleClass
{
public int i = 10;
}

class MainClass
{
static void Main()
{
object a;
a = 1; // an example of boxing
Console.WriteLine(a);
Console.WriteLine(a.GetType());
Console.WriteLine(a.ToString());

a = new SampleClass();
SampleClass classRef;
classRef = (SampleClass)a;
Console.WriteLine(classRef.i);
}
}

Resultados
1
System.Int32
1
10

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1 Introducción
4.2.2 El tipo object
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

string (Referencia de C#)


El tipo string representa una secuencia de cero o más caracteres Unicode. string es un alias de String en .NET Framework.
Aunque string es un tipo de referencia, los operadores de igualdad (== y !=) se definen para comparar los valores de objetos
string, no las referencias. De esta forma, es más intuitivo comprobar la igualdad entre cadenas. Por ejemplo:

string a = "hello";
string b = "h";
// Append to contents of 'b'
b += "ello";
Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);

Esto presenta "True" y, después, "False" porque el contenido de las cadenas es equivalente, pero a y b no hacen referencia a la
misma instancia de cadena.
El operador + concatena cadenas:

string a = "good " + "morning";

Esto crea un objeto de tipo string que contiene "good morning".


Las cadenas son inmutables: no se puede cambiar el contenido de un objeto de tipo string una vez creado el objeto, aunque
pudiera parecer por la sintaxis utilizada que es posible realizar esta operación. Por ejemplo, al escribir este código, el
compilador crea en realidad un nuevo objeto de tipo string para almacenar la nueva secuencia de caracteres, y la variable b
sigue conteniendo "h".

string b = "h";
b += "ello";

El operador [] se puede utilizar para tener acceso a caracteres individuales de un objeto string:

string str = "test";


char x = str[2]; // x = 's';

Los literales de cadena son objetos de tipo string que se pueden escribir de dos formas: entre comillas o entre comillas y
precedidos de @. Los literales de cadena se deben encerrar entre comillas ("):

"good morning" // a string literal

Los literales de cadena pueden contener cualquier literal de carácter, incluidas las secuencias de escape:

string a = "\\\u0066\n";

Esta cadena contiene una barra diagonal inversa, la letra f y el carácter de nueva línea.
Nota
El código de escape \udddd (donde dddd es un número de cuatro dígitos) representa el carácter Unicode U+dddd. También
se reconocen los códigos de escape Unicode de 8 dígitos: \udddd\udddd.

Los literales de cadena entrecomillados y precedidos por @ empiezan con este símbolo y se encierran entre comillas. Por
ejemplo:

@"good morning" // a string literal

La ventaja de utilizar la combinación del signo @ y el entrecomillado es que las secuencias de escape no se procesan, lo que
facilita la escritura, por ejemplo, de un nombre de archivo completo:

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"

Para incluir comillas tipográficas en una cadena precedida del símbolo @, escriba las comillas dos veces:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

Otro uso del símbolo @ consiste en utilizar identificadores de referencia (/reference) que resulten ser palabras clave de C#.
Ejemplo
// keyword_string.cs
using System;
class TestClass
{
static void Main()
{
string a = "\u0068ello ";
string b = "world";
Console.WriteLine( a + b );
Console.WriteLine( a + b == "hello world" );
}
}

Resultados
hello world
True

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
2.4.2 identificadores
2.4.4.5 Literales de cadena
4.2.3 El tipo string
7.9.7 Operadores de igualdad de cadenas
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Guía de programación de C#
Otros recursos
Referencia de C#
Aplicar formato a la tabla de resultados numéricos (Referencia de C#)
Referencia del lenguaje C#

void (Referencia de C#)


Cuando se utiliza como tipo de valor devuelto por un método, void especifica que el método no devuelve ningún valor.
No se permite utilizar void en una lista de parámetros de un método. Un método que no utiliza parámetros y que no devuelve
ningún valor se declara del siguiente modo:

void SampleMethod();

void también se utiliza en un contexto no seguro para declarar un puntero a un tipo desconocido. Para obtener más
información, vea Tipos de puntero (Guía de programación de C#).
void es un alias para el tipo System.Void de .NET Framework.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5 Métodos
Vea también
Referencia
Palabras clave de C#
Tipos de referencia (Referencia de C#)
Tipos de valores (Referencia de C#)
Métodos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tablas de referencia de tipos (Referencia de C#)


Las siguientes tablas de referencia de tipos resumen los tipos de C#:
Tabla de tipos integrados
Tipos integrales
Tipos de punto flotante
Valores predeterminados
Tipos de valor
Conversiones numéricas implícitas
Tabla de conversiones numéricas explícitas
Para obtener información sobre cómo dar formato a la presentación de tipos numéricos, vea
Tabla de formatos de presentación para valores numéricos.
Vea también
Referencia
Tipos de referencia (Referencia de C#)
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tabla de tipos integrados (Referencia de C#)


La siguiente tabla muestra las palabras clave para los tipos integrados de C#, las cuales son alias de tipos predefinidos en el
espacio de nombres System.
Tipo de C# Tipo de .NET Framework
bool System.Boolean

byte System.Byte

sbyte System.SByte

char System.Char

decimal System.Decimal

double System.Double

float System.Single

int System.Int32

uint System.UInt32

long System.Int64

ulong System.UInt64

object System.Object

short System.Int16

ushort System.UInt16

string System.String
Comentarios
Todos los tipos de la tabla, excepto object y string, se conocen como tipos simples.
Las palabras clave de tipos de C# y sus alias son intercambiables. Por ejemplo, se puede declarar una variable entera de
cualquiera de estas dos formas:

int x = 123;
System.Int32 x = 123;

Para mostrar el tipo real de cualquier tipo de C#, utilice el método del sistema GetType(). Por ejemplo, la siguiente instrucción
muestra el alias de sistema que representa el tipo de myVariable:

Console.WriteLine(myVariable.GetType());

También se puede utilizar el operador typeof.


Vea también
Referencia
Palabras clave de C#
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de valores predeterminados (Referencia de C#)
Aplicar formato a la tabla de resultados numéricos (Referencia de C#)
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tabla de tipos integrales (Guía de programación de C#)


La siguiente tabla muestra los tamaños e intervalos de los tipos integrales, que constituyen un subconjunto de los tipos
simples.
Tipo Intervalo Tamaño
sbyte -128 a 127 Entero de 8 bits con signo

byte 0 a 255 Entero de 8 bits sin signo

char U+0000 a U+ffff Carácter Unicode de 16 bits

short -32.768 a 32.767 Entero de 16 bits con signo

ushort 0 a 65.535 Entero de 16 bits sin signo

int -2.147.483.648 a 2.147.483.647 Entero de 32 bits con signo

uint 0 a 4.294.967.295 Entero de 32 bits sin signo

long -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 Entero de 64 bits con signo

ulong 0 a 18.446.744.073.709.551.615 Entero de 64 bits sin signo

Si el valor representado por un literal entero supera el intervalo de valores del tipo ulong, se producirá un error de
compilación.
Vea también
Referencia
Palabras clave de C#
Tabla de tipos integrados (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de tipos de punto flotante (Referencia de C#)
Tabla de valores predeterminados (Referencia de C#)
Aplicar formato a la tabla de resultados numéricos (Referencia de C#)
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tabla de tipos de punto flotante (Referencia de C#)


La siguiente tabla muestra la precisión y el intervalo aproximado para los tipos de punto flotante.
Tipo Intervalo aproximado Precisión
float ±1,5e−45 a ±3,4e38 7 dígitos

double ±5,0e−324 a ±1,7e308 15-16 dígitos

Vea también
Referencia
Tabla de tipos integrados (Referencia de C#)
Tabla de tipos integrales (Guía de programación de C#)
decimal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de valores predeterminados (Referencia de C#)
Aplicar formato a la tabla de resultados numéricos (Referencia de C#)
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tabla de valores predeterminados (Referencia de C#)


La siguiente tabla muestra los valores predeterminados de los tipos de valor devueltos por los constructores predeterminados.
Los constructores predeterminados se invocan mediante el operador new, de la manera siguiente:

int myInt = new int();

La instrucción anterior tiene el mismo efecto que la instrucción siguiente:

int myInt = 0;

Recuerde que el uso de variables no inicializadas no está permitido en C#.


Tipo de va Valor predeterminado
lor
bool false

byte 0

char '\0'

decimal 0,0M

double 0,0D

enum El valor producido por la expresión (E)0, donde E es el identificador de la enumeración.

float 0,0F

int 0

long 0L

sbyte 0

short 0

struct El valor obtenido al asignar los valores predeterminados a los campos de tipo de valor y el valor null a los campo
s de tipo de referencia.

uint 0

ulong 0

ushort 0

Vea también
Referencia
Tipos de valores (Referencia de C#)
Tabla de tipos integrados (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tabla de tipos de valores (Referencia de C#)


En la tabla siguiente, se enumeran los tipos de valor de C# por categorías.
Tipo de valor Categoría
bool Booleano

byte Sin signo, numérica, integral

char Sin signo, numérica, integral

decimal Numérica, decimal

double Numérica, de punto flotante

enum Enumeración

float Numérica, de punto flotante

int Con signo, numérica, integral

long Con signo, numérica, integral

sbyte Con signo, numérica, integral

short Con signo, numérica, integral

struct Estructura definida por el usuario

uint Sin signo, numérica, integral

ulong Sin signo, numérica, integral

ushort Sin signo, numérica, integral

Vea también
Referencia
Tipos de valores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Aplicar formato a la tabla de resultados numéricos (Referencia de C#)
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Tabla de conversiones numéricas implícitas (Referencia de C#)


La tabla siguiente muestra las conversiones numéricas implícitas predefinidas. Las conversiones implícitas se pueden dar en
muchas ocasiones, incluidas la invocación a métodos y las instrucciones de asignación.
De A
sbyte short, int, long, float, double o decimal

byte short, ushort, int, uint, long, ulong, float, double o decimal

short int, long, float, double o decimal

ushort int, uint, long, ulong, float, double o decimal

int long, float, double o decimal

uint long, ulong, float, double o decimal

long float, double o decimal

char ushort, int, uint, long, ulong, float, double o decimal

float double

ulong float, double o decimal


Comentarios
Las conversiones de int, uint o long a float y de long a double pueden causar una pérdida de precisión, pero no una
pérdida de magnitud.
No existen conversiones implícitas al tipo char.
No hay ninguna conversión implícita entre los tipos de punto flotante y el tipo decimal.
Una expresión constante de tipo int se puede convertir a sbyte, byte, short, ushort, uint o ulong, siempre que el valor
de la expresión constante quede dentro del intervalo del tipo de destino.
Especificación del lenguaje C#
Para obtener más información, vea la especificación del lenguaje C# (Especificación del lenguaje C#):
6.1 Conversiones implícitas
7.15 Expresiones constantes
Vea también
Referencia
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tabla de conversiones numéricas explícitas (Referencia de C#)


Las conversiones numéricas explícitas se utilizan para convertir cualquier tipo numérico a cualquier otro tipo numérico, para el
que no existe conversión implícita, mediante una expresión que utilice el operador de conversión explícita. La siguiente tabla
muestra estas conversiones.
De Para
sbyte byte, ushort, uint, ulong o char

byte Sbyte o char

short sbyte, byte, ushort, uint, ulong o char

ushort sbyte, byte, short o char

int sbyte, byte, short, ushort, uint, ulong o char

uint sbyte, byte, short, ushort, int o char

long sbyte, byte, short, ushort, int, uint, ulong o char

ulong sbyte, byte, short, ushort, int, uint, long o char

char sbyte, byte o short

float sbyte, byte, short, ushort, int, uint, long, ulong, char o decimal

double sbyte, byte, short, ushort, int, uint, long, ulong, char, float o decimal

decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double
Comentarios
Las conversiones numéricas explícitas pueden producir pérdida de precisión o provocar excepciones.
Cuando se convierte un valor decimal en un tipo integral, este valor se redondea hacia cero al valor entero más
próximo. Si el valor entero resultante queda fuera del intervalo del tipo de destino, se produce una excepción
OverflowException.
Cuando se convierte un valor double o float en un tipo integral, el valor se trunca. Si el valor entero resultante queda
fuera del intervalo del valor de destino, el resultado depende del contexto de comprobación de desbordamiento. En un
contexto comprobado, se produce una excepción OverflowException, mientras que en un contexto no comprobado, el
resultado es un valor no especificado del tipo de destino.
Cuando se convierte double en float, el valor double se redondea al valor float más próximo. Si el valor de tipo
double es demasiado pequeño o demasiado grande para ajustarse al tipo de destino, el resultado será cero o infinito.
Cuando se convierte float o double en decimal, el valor de origen se convierte en una representación decimal y se
redondea al número más próximo después de la vigésimo octava posición decimal si es necesario. Según el valor de
origen, se puede producir uno de los siguientes resultados:
Si el valor de origen es demasiado pequeño para representarlo como decimal, el resultado se convierte en cero.
Si el valor de origen es NaN (no es un número), infinito o demasiado grande para ser representado como
decimal, se produce una excepción OverflowException.
Cuando se convierte decimal en float o double, el valor decimal se redondea al valor double o float más próximo.
Para obtener más información sobre conversión explícita, vea 6.2 Explícita en la Especificación del lenguaje C#. Para obtener
información sobre cómo tener acceso a la especificación, vea Especificación del lenguaje C#.
Vea también
Referencia
Tabla de tipos integrales (Guía de programación de C#)
Tabla de tipos integrados (Referencia de C#)
Tabla de conversiones numéricas implícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Aplicar formato a la tabla de resultados numéricos (Referencia


de C#)
Se puede dar formato a los resultados numéricos mediante el método String.Format o a través del método Console.Write, el
cual llama a String.Format. El formato se determina mediante las cadenas de formato. La tabla siguiente contiene las cadenas
de formato estándar admitidas. La cadena de formato tiene la forma siguiente: Axx,, donde A es el especificador de formato y
xx es el especificador de precisión. El especificador de formato controla el tipo de formato aplicado al valor numérico, mientras
que el especificador de precisión controla el número de dígitos significativos o posiciones decimales del resultado.
Para obtener más información sobre cadenas de formato estándar y personalizadas, vea Información general sobre el formato.
Para obtener más información sobre el método String.Format, vea System.String.Format.
Carácter Descripción Ejemplos Resultados
Coc Moneda Console.Write("{0:C}", 2,5); $2.50
Console.Write("{0:C}", -2,5); ($2.50)

Dod Decimal Console.Write("{0:D5}", 25); 00025

Eoe Científico Console.Write("{0:E}", 250000); 2,500000E+005

Fof Punto fijo Console.Write("{0:F2}", 25); 25.00


Console.Write("{0:F0}", 25); 25

Gog General Console.Write("{0:G}", 2,5); 2.5

Non Número Console.Write("{0:N}", 2500000); 2.500.000,00

Xox Hexadecimal Console.Write("{0:X}", 250); FA


Console.Write("{0:X}", 0xffff); FFFF

Vea también
Referencia
string (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tablas de referencia de tipos (Referencia de C#)
Referencia del lenguaje C#

Modificadores (Referencia de C#)


Los modificadores se utilizan para modificar declaraciones de tipos y miembros de tipos. Esta sección presenta los siguientes
modificadores de C#:
Modificador Finalidad
Modificadores de acceso Especificar la accesibilidad declarada de tipos y miembros de tipos.
public
private
internal
protected

abstract Indica que una clase está definida sólo como clase base de otras clases.

const Especifica que el valor del campo o de la variable local no se pueden modificar.

event Declara un evento.

extern Indica que el método está implementado externamente.

new Oculta un miembro heredado de un miembro de clase base.

override Proporciona una nueva implementación de un miembro virtual heredado de una clase base.

partial Define clases y estructuras parciales a lo largo del mismo ensamblado.

readonly Declara un campo al cual sólo se pueden asignar valores como parte de la declaración o en un constr
uctor de la misma clase.

sealed Especifica que una clase no se puede heredar.

static Declara un miembro que pertenece al propio tipo en vez de a un objeto específico.

unsafe Declara un contexto no seguro.

virtual Declara un método o un descriptor de acceso cuya implementación se puede cambiar mediante un m
iembro de reemplazo perteneciente a una clase derivada.

volatile Indica que un campo puede ser modificado en el programa por el sistema operativo, el hardware o u
n subproceso en ejecución de forma simultánea.
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Modificadores de acceso (Referencia de C#)


Los modificadores de acceso son palabras clave que especifican la accesibilidad declarada de un miembro o un tipo. Esta
sección presenta los cuatro modificadores de acceso:
public
protected
internal
private
Mediante los modificadores de acceso se pueden especificar los siguientes cinco niveles de accesibilidad:
public: acceso no restringido.
protected: acceso limitado a la clase contenedora o a los tipos derivados de esta clase.
Internal: acceso limitado al ensamblado actual.
protected internal: acceso limitado al ensamblado actual o los tipos derivados de la clase contenedora.
private: acceso limitado al tipo contenedor.
Esta sección también presenta los siguientes temas:
Niveles de accesibilidad: utilizar los cuatro modificadores de acceso para declarar cinco niveles de accesibilidad.
Dominio de accesibilidad: especifica dónde se puede hacer referencia a un miembro en las secciones de programa.
Restricciones en el uso de los niveles de accesibilidad: resumen de las restricciones en el uso de los niveles de
accesibilidad declarados.
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Niveles de accesibilidad (Referencia de C#)


Utilice los modificadores de acceso public, protected, internal o private para especificar una de las siguientes accesibilidades
declaradas para miembros.
Accesibilidad declarada Significado
public Acceso no restringido.

protected Acceso limitado a la clase contenedora o a los tipos derivados de esta clase.

internal Acceso limitado al proyecto actual.

protected internal Acceso limitado al proyecto actual o a los tipos derivados de la clase contenedora.

private Acceso limitado al tipo contenedor.

Sólo se permite un modificador de acceso para un miembro o tipo, excepto cuando se utiliza la combinación protected
internal.
Los modificadores de acceso no se pueden utilizar en espacios de nombres. Los espacios de nombres no presentan
restricciones de acceso.
Según el contexto en el que se produce una declaración de miembro, sólo se permite declarar ciertos tipos de acceso. Si no se
especifica ningún modificador de acceso en una declaración de miembro, se utiliza el tipo de acceso predeterminado.
Los tipos de nivel superior, que no están anidados en otros tipos, sólo pueden tener accesibilidad internal o public. La
accesibilidad predeterminada para estos tipos es internal.
Los tipos anidados, que son miembros de otros tipos, pueden tener un tipo de acceso declarado como el que se indica en la
siguiente tabla.
Miembros de Accesibilidad predeterminada Accesibilidades declaradas permitidas
enum public Ninguna

class private public


protected
internal
private
protected internal

interface public Ninguna

struct private public


internal
private

La accesibilidad de un tipo anidado depende de su dominio de accesibilidad, el cual se determina mediante la accesibilidad
declarada para el miembro y el dominio de accesibilidad del tipo inmediato que lo contiene. Sin embargo, el dominio de
accesibilidad de un tipo anidado no puede exceder al del tipo contenedor.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.3 Acceso protegido para miembros de instancia
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Dominio de accesibilidad (Referencia de C#)
Restricciones en el uso de los niveles de accesibilidad (Referencia de C#)
Modificadores de acceso (Guía de programación de C#)
public (Referencia de C#)
private (Referencia de C#)
protected (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Dominio de accesibilidad (Referencia de C#)


El dominio de accesibilidad de un miembro especifica en qué secciones del programa se puede hacer referencia a un miembro.
Si el miembro está anidado dentro de otro tipo, su dominio de accesibilidad viene determinado por el nivel de accesibilidad del
miembro y por el dominio de accesibilidad del tipo contenedor inmediato.
El dominio de accesibilidad de un tipo de nivel superior es, al menos, el texto del programa del proyecto en el que aparece
declarado. Es decir, todos los archivos de código fuente del proyecto. El dominio de accesibilidad de un tipo anidado es, al
menos, el texto del programa en el que el tipo aparece declarado. Es decir, el cuerpo del tipo, incluidos los tipos anidados. El
dominio de accesibilidad de un tipo anidado no puede superar al del tipo contenedor. Estos conceptos se muestran en el
siguiente ejemplo.
Ejemplo
Este ejemplo contiene un tipo de nivel superior, T1, y dos clases anidadas, M1 y M2. Las clases contienen campos con diferentes
accesibilidades declaradas. En el método Main, a cada instrucción le sigue un comentario que indica el dominio de accesibilidad
de cada miembro. Observe que las instrucciones que intentan hacer referencia a los miembros inaccesibles están desactivadas
mediante signos de comentario. Si desea ver los errores generados por el compilador cuando se intenta hacer referencia a un
miembro inaccesible, quite los comentarios de uno en uno.

// cs_Accessibility_Domain.cs
using System;
namespace AccessibilityDomainNamespace
{
public class T1
{
public static int publicInt;
internal static int internalInt;
private static int privateInt = 0; // CS0414

public class M1
{
public static int publicInt;
internal static int internalInt;
private static int privateInt = 0; // CS0414
}

private class M2
{
public static int publicInt = 0;
internal static int internalInt = 0;
private static int privateInt = 0; // CS0414
}
}

class MainClass
{
static void Main()
{
// Access is unlimited:
T1.publicInt = 1;
// Accessible only in current assembly:
T1.internalInt = 2;
// Error: inaccessible outside T1:
// T1.myPrivateInt = 3;
// Access is unlimited:
T1.M1.publicInt = 1;
// Accessible only in current assembly:
T1.M1.internalInt = 2;
// Error: inaccessible outside M1:
// T1.M1.myPrivateInt = 3;
// Error: inaccessible outside T1:
// T1.M2.myPublicInt = 1;
// Error: inaccessible outside T1:
// T1.M2.myInternalInt = 2;
// Error: inaccessible outside M2:
// T1.M2.myPrivateInt = 3;
}
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.2 Dominios de accesibilidad
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Restricciones en el uso de los niveles de accesibilidad (Referencia de C#)
Modificadores de acceso (Guía de programación de C#)
public (Referencia de C#)
private (Referencia de C#)
protected (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Restricciones en el uso de los niveles de accesibilidad


(Referencia de C#)
Cuando se declara un tipo, es esencial determinar si ese tipo tiene que ser al menos tan accesible como otro miembro o tipo.
Por ejemplo, la clase base directa debe ser al menos tan accesible como la clase derivada. Las siguientes declaraciones
producirán un error del compilador, ya que la clase base BaseClass es menos accesible que MyClass:

class BaseClass {...}


public class MyClass: BaseClass {...} // Error

La siguiente tabla resume las restricciones de uso de los niveles de accesibilidad declarados.
Contexto Comentarios
Clases La clase base directa de un tipo de clase debe ser al menos tan accesible como el propio tipo de clase.

Interfaces Las interfaces base explícitas de un tipo de interfaz deben ser al menos tan accesibles como el propio tipo de int
erfaz.

Delegados El tipo de valor devuelto y los tipos de los parámetros de un tipo delegado deben ser al menos tan accesibles co
mo el propio tipo delegado.

Constantes El tipo de una constante debe ser al menos tan accesible como la propia constante.

Campos El tipo de un campo debe ser al menos tan accesible como el propio campo.

Métodos El tipo de valor devuelto y los tipos de parámetros de un método deben ser al menos tan accesibles como el pro
pio método.

Propiedades El tipo de una propiedad debe ser al menos tan accesible como la misma propiedad.

Eventos El tipo de un evento debe ser al menos tan accesible como el propio evento.

Indizadores El tipo y los tipos de parámetros de un indizador deben ser al menos tan accesibles como el propio indizador.

Operadores El tipo de valor devuelto y los tipos de parámetros de un operador deben ser al menos tan accesibles como el p
ropio operador.

Constructores Los tipos de parámetros de un constructor deben ser al menos tan accesibles como el propio constructor.
Ejemplo
El siguiente ejemplo contiene declaraciones erróneas de diferentes tipos. El comentario que sigue a cada declaración indica el
error esperado del compilador.

// Restrictions_on_Using_Accessibility_Levels.cs
// CS0052 expected as well as CS0053, CS0056, and CS0057
// To make the program work, change access level of both class B
// and MyPrivateMethod() to public.
using System;

// A delegate:
delegate int MyDelegate();

class B
{
// A private method:
static int MyPrivateMethod()
{
return 0;
}
}
public class A
{
// Error: The type B is less accessible than the field A.myField.
public B myField = new B();

// Error: The type B is less accessible


// than the constant A.myConst.
public readonly B myConst = new B();

public B MyMethod()
{
// Error: The type B is less accessible
// than the method A.MyMethod.
return new B();
}
// Error: The type B is less accessible than the property A.MyProp
public B MyProp
{
set
{
}
}

MyDelegate d = new MyDelegate(B.MyPrivateMethod);


// Even when B is declared public, you still get the error:
// "The parameter B.MyPrivateMethod is not accessible due to
// protection level."

public static B operator +(A m1, B m2)


{
// Error: The type B is less accessible
// than the operator A.operator +(A,B)
return new B();
}

static void Main()


{
Console.Write("Compiled successfully");
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
10.2.6.5 Acceso a miembros privados y protegidos del tipo contenedor
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Dominio de accesibilidad (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores de acceso (Guía de programación de C#)
public (Referencia de C#)
private (Referencia de C#)
protected (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

internal (Referencia de C#)


La palabra clave internal es un modificador de acceso para tipos y miembros de tipos. Los tipos o miembros internos sólo son
accesibles dentro de los archivos del mismo ensamblado, como en este ejemplo:

public class BaseClass


{
// Only accessible within the same assembly
internal static int x = 0;
}

Encontrará una comparación de internal con los otros modificadores de acceso en Niveles de accesibilidad y
Modificadores de acceso (Guía de programación de C#).
Para obtener más información sobre los ensamblados, vea
Ensamblados y Caché de ensamblados global (Guía de programación de C#).
Un uso habitual del acceso de tipo interno se da en el desarrollo basado en componentes, ya que permite a un grupo de
componentes cooperar de manera privada sin estar expuesto al resto del código de la aplicación. Por ejemplo, una estructura
para crear interfaces gráficas de usuario podría proporcionar clases Control y Form que cooperan mediante miembros con
acceso de tipo internal. Como estos miembros son internos, no están expuestos al código que utiliza la estructura.
Si se hace referencia a un tipo o miembro con acceso interno fuera del ensamblado en el que se definió, produce un error.
Nota
El método internal virtual puede reemplazarse en algunos lenguajes, como en el Lenguaje intermedio de Microsoft (MSIL) t
extual mediante Ilasm.exe, aunque no se pueda reemplazar utilizando C#.

Ejemplo
Este ejemplo contiene dos archivos, Assembly1.cs y Assembly2.cs. El primer archivo contiene una clase base interna,
BaseClass. En el segundo archivo, un intento de crear instancias BaseClass generará un error.

// Assembly1.cs
// compile with: /target:library
internal class BaseClass
{
public static int intM = 0;
}

// Assembly1_a.cs
// compile with: /reference:Assembly1.dll
class TestAccess
{
static void Main()
{
BaseClass myBase = new BaseClass(); // CS0122
}
}

En este ejemplo, utilice los mismos archivos que utilizó en el primer ejemplo y cambie el nivel de accesibilidad de BaseClass a
public. Además cambie el nivel de accesibilidad del miembro IntM a internal. En este caso, puede crear instancias de la clase,
pero no puede tener acceso al miembro interno.

// Assembly2.cs
// compile with: /target:library
public class BaseClass
{
internal static int intM = 0;
}
// Assembly2_a.cs
// compile with: /reference:Assembly1.dll
public class TestAccess
{
static void Main()
{
BaseClass myBase = new BaseClass(); // Ok.
BaseClass.intM = 444; // CS0117
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores (Referencia de C#)
public (Referencia de C#)
private (Referencia de C#)
protected (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

private (Referencia de C#)


La palabra clave private es un modificador de acceso de miembros. El acceso de tipo private corresponde al nivel de acceso
más restrictivo. Los miembros privados sólo son accesibles dentro del cuerpo de la clase o estructura en la que se declaran,
como en el siguiente ejemplo.

class Employee
{
private int i;
double d; // private access by default
}

Los tipos anidados del mismo cuerpo también pueden tener acceso a esos miembros privados.
Hacer referencia a un miembro privado fuera de la clase o estructura en la que se declara produce un error de compilación.
Encontrará una comparación de private con los otros modificadores de acceso en Niveles de accesibilidad (Referencia de C#)
y Modificadores de acceso (Guía de programación de C#).
Ejemplo
En este ejemplo, la clase Employee contiene dos miembros de datos privados, name y salary. Como miembros privados, sólo
pueden tener acceso a ellos los métodos miembro; por tanto, hay que agregar los métodos públicos denominados GetName y
Salary para permitir el acceso controlado a los miembros privados. Se tiene acceso al miembro name a través del método
público y se tiene acceso al miembro salary a través de una propiedad pública de sólo lectura. (Vea
Propiedades (Guía de programación de C#) para obtener más información.)

// private_keyword.cs
using System;
class Employee
{
private string name = "FirstName, LastName";
private double salary = 100.0;

public string GetName()


{
return name;
}

public double Salary


{
get { return salary; }
}
}

class MainClass
{
static void Main()
{
Employee e = new Employee();
// The data members are inaccessible (private), so
// then can't be accessed like this:
// string n = e.name;
// double s = e.salary;

// 'name' is indirectly accessed via method:


string n = e.GetName();
// 'salary' is indirectly accessed via property
double s = e.Salary;
}
}
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
10.2.6.5 Acceso a miembros privados y protegidos del tipo contenedor
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores (Referencia de C#)
public (Referencia de C#)
protected (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

protected (Referencia de C#)


La palabra clave protected es un modificador de acceso a miembros. Un miembro protegido es accesible dentro de su clase y
por clases derivadas. Encontrará una comparación de protected con los otros modificadores de acceso en
Niveles de accesibilidad.
Un miembro protegido de una clase base es accesible en una clase derivada sólo si el acceso se realiza a través del tipo de la
clase derivada. Por ejemplo, considere el siguiente segmento de código:

// protected_keyword.cs
using System;
class A
{
protected int x = 123;
}

class B : A
{
static void Main()
{
A a = new A();
B b = new B();

// Error CS1540, because x can only be accessed by


// classes derived from A.
// a.x = 10;

// OK, because this class derives from A.


b.x = 10;
}
}

La instrucción a.x =10 genera un error, ya que A no se deriva de B.

Los miembros de una estructura no se pueden proteger, ya que la estructura no se puede heredar.
Ejemplo
En este ejemplo, la clase DerivedPoint se deriva de Point; por lo tanto, puede obtener acceso a los miembros protegidos de la
clase base directamente desde la clase derivada.

// protected_keyword_2.cs
using System;
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
DerivedPoint dp = new DerivedPoint();

// Direct access to protected members:


dp.x = 10;
dp.y = 15;
Console.WriteLine("x = {0}, y = {1}", dp.x, dp.y);
}
}

Resultados
x = 10, y = 15
Comentarios
Si se cambian los niveles de acceso de x e y a private, el compilador producirá los siguientes mensajes de error:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.3 Acceso protegido para miembros de instancia
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores (Referencia de C#)
public (Referencia de C#)
private (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

public (Referencia de C#)


La palabra clave public es un modificador de acceso para tipos y miembros de tipos. El acceso de tipo public corresponde al
nivel de acceso menos restrictivo. No existen restricciones para obtener acceso a los miembros públicos, como en este
ejemplo:

class SampleClass
{
public int x; // No access restrictions.
}

Para obtener más información, vea Modificadores de acceso (Guía de programación de C#) y
Niveles de accesibilidad (Referencia de C#).
Ejemplo
En el siguiente ejemplo, se declaran dos clases, Point y MainClass. El acceso a los miembros públicos x e y de Point se realiza
directamente desde MainClass.

// protected_public.cs
// Public access
using System;
class Point
{
public int x;
public int y;
}

class MainClass
{
static void Main()
{
Point p = new Point();
// Direct access to public members:
p.x = 10;
p.y = 15;
Console.WriteLine("x = {0}, y = {1}", p.x, p.y);
}
}

Resultado
x = 10, y = 15

Si se cambia el nivel de acceso de public a private o protected, se aparecerá el siguiente mensaje de error:
'Point.y' is inaccessible due to its protection level.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.5.1 Accesibilidad declarada
3.5.4 Restricciones de accesibilidad
10.2.3 Modificadores de acceso
10.2.6.2 Accesibilidad declarada
Vea también
Referencia
Modificadores de acceso (Guía de programación de C#)
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores (Referencia de C#)
private (Referencia de C#)
protected (Referencia de C#)
internal (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

abstract (Referencia de C#)


El modificador abstract se puede utilizar con clases, métodos, propiedades, indizadores y eventos. Use el modificador abstract
en una declaración de clase para indicar que la clase sólo se puede utilizar como clase base de otras clases. Los miembros que
están marcados como abstractos o que se incluyen en una clase abstracta, deben ser implementados por clases derivadas de la
clase abstracta.
En este ejemplo, la clase Square debe proporcionar una implementación de Area porque deriva de ShapesClass:

abstract class ShapesClass


{
abstract public int Area();
}
class Square : ShapesClass
{
int x, y;
// Not providing an Area method results
// in a compile-time error.
public override int Area()
{
return x * y;
}
}

Para obtener más información sobre las clases abstractas, vea


Clases y miembros de clase abstractos y sellados (Guía de programación de C#).
Comentarios
Las clases de tipo abstract presentan las siguientes características:
No se pueden crear instancias de una clase abstracta.
Una clase abstracta puede contener descriptores de acceso y métodos abstractos.
No es posible modificar una clase abstracta con el modificador sealed (Referencia de C#), lo cual significa que la clase no
se puede heredar.
Una clase no abstracta derivada de una clase abstracta debe incluir implementaciones reales de todos los descriptores de
acceso y métodos abstractos heredados.
Utilice el modificador abstract en una declaración de método o propiedad para indicar que el método o la propiedad no
contienen implementación.
Los métodos abstractos presentan las siguientes características:
Un método abstracto es, implícitamente, un método virtual.
Las declaraciones de métodos abstractos sólo se permiten en clases abstractas.
Debido a que una declaración de método abstracto no proporciona una implementación, no existe cuerpo del método; la
declaración de método finaliza simplemente con un punto y coma y sin llaves ({ }) después de la firma. Por ejemplo:

public abstract void MyMethod();

La implementación la proporciona un método de reemplazooverride (Referencia de C#), que es miembro de una clase no
abstracta.
Utilizar los modificadores static o virtual en una declaración de método abstracto produce un error.
Las propiedades abstractas funcionan como los métodos abstractos, salvo las diferencias en la sintaxis de las declaraciones y
llamadas.
Es incorrecto utilizar el modificador abstract para una propiedad estática.
Una propiedad abstracta heredada se puede reemplazar en una clase derivada si se incluye una declaración de propiedad
que utilice el modificador override.
Una clase abstracta debe proporcionar implementaciones para todos los miembros de la interfaz.
Una clase abstracta que implementa una interfaz podría asignar los métodos de la interfaz a métodos abstractos. Por ejemplo:

interface I
{
void M();
}
abstract class C: I
{
public abstract void M();
}

Ejemplo
En este ejemplo, la clase DerivedClass se deriva de una clase abstracta BaseClass. La clase abstracta contiene un método
abstracto, AbstractMethod, y dos propiedades abstractas, X y Y.

// abstract_keyword.cs
// Abstract Classes
using System;
abstract class BaseClass // Abstract class
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod(); // Abstract method
public abstract int X { get; }
public abstract int Y { get; }
}
class DerivedClass : BaseClass
{
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}

Resultados
x = 111, y = 161

Comentarios
En el ejemplo anterior, si intenta crear una instancia de la clase abstracta mediante una instrucción como la siguiente:

BaseClass bc = new BaseClass(); // Error

se obtendrá un error que indica que el compilador no puede crear una instancia de la clase abstracta 'BaseClass'.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5.4 Métodos virtuales, abstractos y de reemplazo
10.1.1.1 Clases abstractas
Vea también
Referencia
Modificadores (Referencia de C#)
virtual (Referencia de C#)
override (Referencia de C#)
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

const (Referencia de C#)


La palabra clave const se utiliza para modificar una declaración de un campo o una variable local. Especifica que el valor del
campo o de la variable local es constante, o sea que no se puede modificar. Por ejemplo:

const int x = 0;
public const double gravitationalConstant = 6.673e-11;
private const string productName = "Visual C#";

Comentarios
El tipo de una declaración de constantes especifica el tipo de los miembros que se incluyen en la declaración. Una expresión
constante debe dar un valor del tipo destino o de un tipo que se pueda convertir implícitamente en el tipo destino.
Una expresión constante es una expresión que se puede evaluar completamente en tiempo de compilación. Por consiguiente,
los únicos valores posibles para constantes de tipos de referencia son string, y null.
La declaración de constante puede declarar varias constantes, por ejemplo:

public const double x = 1.0, y = 2.0, z = 3.0;

El modificador static no se puede utilizar en una declaración de constante.


Una constante puede participar en una expresión constante, por ejemplo:

public const int c1 = 5;


public const int c2 = c1 + 100;

Nota
La palabra clave readonly es diferente de la palabra clave const. Un campo const sólo puede inicializarse en la declaración d
el campo. Un campo readonly puede inicializarse en la declaración o en un constructor. Por lo tanto, los campos readonly p
ueden tener diferentes valores en función del constructor que se utilice. Asimismo, mientras que un campo const es una con
stante en tiempo de compilación, el campo readonly puede utilizarse para constantes en tiempo de ejecución, como se mue
stra en la línea siguiente: public static readonly uint l1 = (uint)DateTime.Now.Ticks;

Ejemplo
// const_keyword.cs
using System;
public class ConstTest
{
class SampleClass
{
public int x;
public int y;
public const int c1 = 5;
public const int c2 = c1 + 5;

public SampleClass(int p1, int p2)


{
x = p1;
y = p2;
}
}
static void Main()
{
SampleClass mC = new SampleClass(11, 22);
Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);
Console.WriteLine("c1 = {0}, c2 = {1}",
SampleClass.c1, SampleClass.c2 );
}
}

Resultados
x = 11, y = 22
c1 = 5, c2 = 10

Este ejemplo muestra el uso de constantes como variables locales.

// const_keyword_2.cs
using System;
public class MainClass
{
static void Main()
{
const int c = 707;
Console.WriteLine("My local constant = {0}", c);
}
}

Resultados
My local constant = 707

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
6.1.6 Conversiones implícitas de expresión constante
8.5.2 Declaraciones de constante local
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
readonly (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

event (Referencia de C#)


La palabra clave event se utiliza para declarar un evento en una clase de editor.
Comentarios
El ejemplo siguiente muestra cómo declarar y generar un evento que utiliza EventHandler como tipo de delegado subyacente.
Para obtener el ejemplo de código completo que muestra también cómo utilizar el tipo de delegado genérico
EventHandler<T> y cómo suscribirse a un evento y crear un método de controlador de eventos, vea
Cómo: Publicar eventos que cumplan las directrices de .NET Framework (Guía de programación de C#).

public class Publisher


{
// Declare the delegate (if using non-generic pattern).
public delegate void SampleEventHandler(object sender, SampleEventArgs e);

// Declare the event.


public event SampleEventHandler SampleEvent;

// Wrap the event in a protected virtual method


// to enable derived classes to raise the event.
protected virtual void RaiseSampleEvent()
{
// Raise the event by using the () operator.
SampleEvent(this, new SampleEventArgs("Hello"));
}
}

Los eventos son un tipo especial de delegado multidifusión que sólo se puede invocar desde dentro de la clase o estructura
donde se declaran (la clase de editor). Si otras clases o estructuras se suscriben al evento, se llamará a sus métodos de
controlador de eventos cuando la clase de editor genere el evento. Para obtener más información y ejemplos de código, vea
Eventos (Guía de programación de C#) y Delegados (Guía de programación de C#).
Los eventos se pueden marcar como public, private, protected, internal o protectedinternal. Estos modificadores de acceso
definen cómo los usuarios de la clase pueden tener acceso al evento. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Palabras clave y eventos
Las palabras clave siguientes se aplican a los eventos.
Palabr Descripción Para obtener más información
a clave
static Hace que el evento esté siempre disponible para los ll Clases estáticas y sus miembros (Guía de programación de C#)
amadores, aunque no exista ninguna instancia de la cl
ase.

virtual Permite que las clases derivadas reemplacen el compo Herencia (Guía de programación de C#)
rtamiento del evento mediante la palabra clave
override.

sealed Especifica que el evento ya no es virtual para las clases


derivadas.

abstract El compilador no generará los bloques de descriptor d


e acceso a eventos add y remove y, por tanto, las clas
es derivadas deben proporcionar su propia implement
ación.

Un evento puede declararse como evento estático mediante la palabra clave static. Esto hace que el evento esté siempre
disponible para los llamadores, aunque no exista ninguna instancia de la clase. Para obtener más información, vea
Clases estáticas y sus miembros (Guía de programación de C#).
Un evento puede marcarse como virtual mediante la palabra clave virtual. Esto permite que las clases derivadas reemplacen el
comportamiento del evento mediante la palabra clave override. Para obtener más información, vea
Herencia (Guía de programación de C#). Un evento que reemplaza un evento virtual también puede ser de tipo sealed, lo que
especifica que ya no es virtual para las clases derivadas. Por último, un evento se puede declarar como abstract, lo que significa
que el compilador no generará los bloques de descriptor de acceso a eventos add y remove y, por tanto, las clases derivadas
deben proporcionar su propia implementación.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.4 Eventos
7.13.3 Asignación de eventos
10.7 Eventos
13.2.3 Eventos de interfaz
Vea también
Tareas
Cómo: Combinar delegados (delegados de multidifusión) (Guía de programación de C#)
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

extern (Referencia de C#)


El modificador extern se utiliza para declarar un método que se implementa externamente. Un uso común del modificador
extern es con el atributo DllImport cuando se utilizan servicios de interoperabilidad para llamar en código no administrado;
en este caso, el método también debe declararse como static, tal como se muestra en el ejemplo siguiente:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

Nota
La palabra clave extern también puede definir un alias de ensamblado externo, lo que hace posible hacer referencia a difere
ntes versiones del mismo componente desde un único ensamblado. Para obtener más información, vea
alias externo (Referencia de C#).

Es incorrecto utilizar simultáneamente los modificadores abstract (Referencia de C#) y extern para modificar el mismo
miembro. El uso del modificador extern significa que el método se implementa fuera del código de C#, mientras que el uso
del modificador abstract significa que la clase no incluye la implementación del método.
Nota
El uso de la palabra clave extern es más limitado que en C++. Para compararla con la palabra clave de C++, vea
Using extern to Specify Linkage en la Referencia del lenguaje C++.

Ejemplo
En este ejemplo, el programa recibe una cadena del usuario y la muestra dentro de un cuadro de mensaje. El programa utiliza
el método MessageBox importado de la biblioteca User32.dll.

using System;
using System.Runtime.InteropServices;
class MainClass
{
[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);

static int Main()


{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox(0, myString, "My Message Box", 0);
}
}

En este ejemplo se crea un archivo DLL desde un programa de C invocado desde el programa de C# del siguiente ejemplo.

// cmdll.c
// compile with: /LD
int __declspec(dllexport) SampleMethod(int i)
{
return i*10;
}

Este ejemplo utiliza dos archivos, CM.cs y Cmdll.c, para demostrar el uso de extern. El archivo C es un archivo DLL externo
creado en el ejemplo 2 que se invoca desde el programa escrito en C#.

// cm.cs
using System;
using System.Runtime.InteropServices;
public class MainClass
{
[DllImport("Cmdll.dll")]
public static extern int SampleMethod(int x);
static void Main()
{
Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5));
}
}

Resultados
SampleMethod() returns 50.

Comentarios
Para generar el proyecto:
Compile Cmdll.c como una DLL mediante la línea de comandos de Visual C++:
cl /LD Cmdll.c

Compile CM.cs mediante la línea de comandos:


csc CM.cs

De esta forma, se creará el archivo ejecutable CM.exe. Cuando ejecute este programa, SampleMethod pasará el valor 5 al archivo
DLL, el cual devolverá el valor multiplicado por 10.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.5.7 Métodos externos
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
System.Runtime.InteropServices.DllImportAttribute
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

override (Referencia de C#)


El modificador override es necesario para ampliar o modificar la implementación abstracta o virtual de un método, propiedad,
indizador o evento heredado.
En este ejemplo, la clase Square debe proporcionar una implementación de reemplazo de Area porque ésta se hereda de la
clase abstracta ShapesClass:

abstract class ShapesClass


{
abstract public int Area();
}

class Square : ShapesClass


{
int x, y;
// Because ShapesClass.Area is abstract, failing to override
// the Area method would result in a compilation error.
public override int Area()
{
return x * y;
}
}

Para obtener más información sobre el uso de la palabra clave override, vea
Control de versiones con las palabras clave Override y New (Guía de programación de C#) y
Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#).
Comentarios
El método override proporciona una nueva implementación de un miembro heredado de una clase base. El método
reemplazado por una declaración override se conoce como método base reemplazado. El método base reemplazado debe
tener la misma firma que el método override. Para obtener información sobre herencias, vea Herencia (Visual C#).
No se puede reemplazar un método estático o no virtual. El método base reemplazado debe ser virtual, abstract u override.
Una declaración override no puede cambiar la accesibilidad del método virtual. El método override y el método virtual
deben tener el mismo modificador de nivel de acceso.
No se pueden utilizar los modificadores new, static, virtual o abstract para modificar un método override.
Una declaración de propiedad de reemplazo debe especificar el mismo modificador de acceso, tipo y nombre que la propiedad
heredada, y la propiedad reemplazada debe ser virtual, abstract u override.
Ejemplo
Este ejemplo define una clase base denominada Employee y una clase derivada denominada SalesEmployee. La clase
SalesEmployee incluye una propiedad adicional, salesbonus, y reemplaza al método CalculatePay para tenerlo en cuenta.

using System;
class TestOverride
{
public class Employee
{
public string name;
// Basepay is defined as protected, so that it may be
// accessed only by this class and derrived classes.
protected decimal basepay;
// Constructor to set the name and basepay values.
public Employee(string name, decimal basepay)
{
this.name = name;
this.basepay = basepay;
}
// Declared virtual so it can be overridden.
public virtual decimal CalculatePay()
{
return basepay;
}
}

// Derive a new class from Employee.


public class SalesEmployee : Employee
{
// New field that will affect the base pay.
private decimal salesbonus;
// The constructor calls the base-class version, and
// initializes the salesbonus field.
public SalesEmployee(string name, decimal basepay,
decimal salesbonus) : base(name, basepay)
{
this.salesbonus = salesbonus;
}
// Override the CalculatePay method
// to take bonus into account.
public override decimal CalculatePay()
{
return basepay + salesbonus;
}
}

static void Main()


{
// Create some new employees.
SalesEmployee employee1 = new SalesEmployee("Alice",
1000, 500);
Employee employee2 = new Employee("Bob", 1200);
Console.WriteLine("Employee " + employee1.name +
" earned: " + employee1.CalculatePay());
Console.WriteLine("Employee " + employee2.name +
" earned: " + employee2.CalculatePay());
}
}

Resultados
Employee Alice earned: 1500
Employee Bob earned: 1200

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5.4 Métodos virtuales, abstractos y de reemplazo
10.5.4 Métodos de reemplazo
Vea también
Referencia
Herencia (Guía de programación de C#)
Palabras clave de C#
Modificadores (Referencia de C#)
abstract (Referencia de C#)
virtual (Referencia de C#)
new (Referencia de C#)
Conceptos
Guía de programación de C#
Polimorfismo (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

readonly (Referencia de C#)


La palabra clave readonly corresponde a un modificador que se puede utilizar en campos. Cuando una declaración de campo
incluye un modificador readonly, las asignaciones a los campos que aparecen en la declaración sólo pueden tener lugar en la
propia declaración o en un constructor de la misma clase. En este ejemplo, el valor del campo year no se puede cambiar en el
método ChangeYear, aunque se asigne un valor en el constructor de clase:

class Age
{
readonly int _year;
Age(int year)
{
_year = year;
}
void ChangeYear()
{
_year = 1967; // Will not compile.
}
}

Comentarios
Sólo se puede asignar un valor a un campo readonly en los siguientes contextos:
Cuando la variable se inicializa en la declaración, por ejemplo:

public readonly int y = 5;

Para un campo de instancia, en los constructores de instancia de la clase que contiene la declaración de campo; para un
campo estático, en el constructor estático de la clase que contiene la declaración de campo. Éstos son también los únicos
contextos en los que es válido pasar un campo readonly como parámetro out o ref.
Nota
La palabra clave readonly es diferente de la palabra clave const. Un campo const sólo puede inicializarse en la declaración d
el campo. Un campo readonly puede inicializarse en la declaración o en un constructor. Por lo tanto, los campos readonly p
ueden tener diferentes valores en función del constructor que se utilice. Además, mientras que un campo const es una const
ante en tiempo de compilación, el campo readonly puede utilizarse para constantes en tiempo de ejecución, como muestra
el siguiente ejemplo:

Nota
public static readonly uint l1 = (uint)DateTime.Now.Ticks;

Ejemplo
// cs_readonly_keyword.cs
// Readonly fields
using System;
public class ReadOnlyTest
{
class SampleClass
{
public int x;
// Initialize a readonly field
public readonly int y = 25;
public readonly int z;

public SampleClass()
{
// Initialize a readonly instance field
z = 24;
}
public SampleClass(int p1, int p2, int p3)
{
x = p1;
y = p2;
z = p3;
}
}
static void Main()
{
SampleClass p1 = new SampleClass(11, 21, 32); // OK
Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z);
SampleClass p2 = new SampleClass();
p2.x = 55; // OK
Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z);
}
}

Resultados
p1: x=11, y=21, z=32
p2: x=55, y=25, z=24

Comentarios
En el ejemplo anterior, si se utiliza una instrucción como:
p2.y = 66; // Error

se obtendrá el siguiente mensaje de error del compilador:


The left-hand side of an assignment must be an l-value

que es el mismo error que se obtiene al intentar asignar un valor a una constante.
Especificación del lenguaje C#
Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.
10.4.2 Campos de sólo lectura
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
const (Referencia de C#)
Campos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

sealed (Referencia de C#)


El modificador sealed se puede aplicar a clases, métodos de instancia y propiedades. Una clase sealed no se puede heredar. Un
método sellado reemplaza un método en una clase base, pero no se puede reemplazar también en una clase derivada. Cuando
se aplica a un método o propiedad, el modificador sealed siempre se debe utilizar con override (Referencia de C#).
Utilice el modificador sealed en una declaración de clase para evitar que la clase se herede, como en este ejemplo:

sealed class SealedClass


{
public int x;
public int y;
}

Es un error utilizar una clase sellada como una clase base o utilizar el modificador abstract con una clase sellada.
Las estructuras son tipos sealed implícitamente; por consiguiente, no se pueden heredar.
Para obtener más información sobre herencias, consulte Herencia (Guía de programación de C#).
Ejemplo
// cs_sealed_keyword.cs
using System;
sealed class SealedClass
{
public int x;
public int y;
}

class MainClass
{
static void Main()
{
SealedClass sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
}
}

Resultados
x = 110, y = 150

En el ejemplo anterior, si intenta heredar de la clase sealed mediante una instrucción como la siguiente:
class MyDerivedC: SealedClass {} // Error

obtendrá el siguiente mensaje de error:


'MyDerivedC' cannot inherit from sealed class 'SealedClass'.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.1.1.2 Clases selladas
10.5.5 Métodos sellados
Vea también
Referencia
Palabras clave de C#
Clases estáticas y sus miembros (Guía de programación de C#)
Clases y miembros de clase abstractos y sellados (Guía de programación de C#)
Modificadores de acceso (Guía de programación de C#)
Modificadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

static (Referencia de C#)


Utilice el modificador static para declarar un miembro estático, que pertenece al propio tipo en vez de a un objeto específico.
El modificador static puede utilizarse con clases, campos, métodos, propiedades operadores y eventos, pero no puede
utilizarse con indizadores, destructores o tipos que no sean clases. Por ejemplo, la siguiente clase se declara como static y solo
contiene métodos static:

static class CompanyEmployee


{
public static string GetCompanyName(string name) { ... }
public static string GetCompanyAddress(string address) { ... }
}

Para obtener más información, vea Clases estáticas y sus miembros (Guía de programación de C#).
Comentarios
Una declaración de constante o tipo constituye, implícitamente, un miembro estático.
No se puede hacer referencia a un miembro estático por medio de una instancia. En vez de ello, se debe hacer referencia
por medio del nombre de tipo. Por ejemplo, considere la siguiente clase:

public class MyBaseC


{
public struct MyStruct
{
public static int x = 100;
}
}

Para referirse al miembro estático x, use el nombre completo (a menos que sea accesible desde el mismo ámbito):

MyBaseC.MyStruct.x

Mientras que una instancia de una clase contiene una copia independiente de todos los campos de instancia de la clase,
sólo existe una copia de cada campo estático.
No es posible utilizar this para hacer referencia a descriptores de acceso de propiedades o métodos static.
Si la palabra clave static se aplica a una clase, todos los miembros de la clase deben ser estáticos.
Las clases, incluidas las clases estáticas, pueden tener constructores estáticos. Se llama a los constructores estáticos en
algún momento comprendido entre el inicio del programa y la creación de instancias de la clase.
Nota
El uso de la palabra clave static es más limitado que en C++. Para comparar con la palabra clave de C++, vea static.

Para comprender el uso de miembros estáticos, considere una clase que representa al empleado de una compañía. Suponga
que la clase contiene un método que cuenta empleados y un campo que almacena el número de empleados. Ni el método ni el
campo pertenecen a ninguna instancia de empleado. En vez de ello, pertenecen a la clase compañía. Por tanto, se deberían
declarar como miembros estáticos de la clase.
Ejemplo
Este ejemplo lee el nombre y el identificador de un nuevo empleado, incrementa en uno el contador de empleados y muestra
la información del nuevo empleado, así como el nuevo número de empleados. Por motivos de simplicidad, el programa lee el
número actual de empleados desde el teclado. En una aplicación real, esta información se leería desde un archivo.
// cs_static_keyword.cs
using System;
public class Employee
{
public string id;
public string name;

public Employee()
{
}

public Employee(string name, string id)


{
this.name = name;
this.id = id;
}
public static int employeeCounter;
public static int AddEmployee()
{
return ++employeeCounter;
}
}

class MainClass : Employee


{
static void Main()
{
Console.Write("Enter the employee's name: ");
string name = Console.ReadLine();
Console.Write("Enter the employee's ID: ");
string id = Console.ReadLine();

// Create and configure the employee object:


Employee e = new Employee(name, id);
Console.Write("Enter the current number of employees: ");
string n = Console.ReadLine();
Employee.employeeCounter = Int32.Parse(n);
Employee.AddEmployee();

// Display the new information:


Console.WriteLine("Name: {0}", e.name);
Console.WriteLine("ID: {0}", e.id);
Console.WriteLine("New Number of Employees: {0}",
Employee.employeeCounter);
}
}

Entrada
Tara Strahan
AF643G
15
Resultados del ejemplo
Enter the employee's name: Tara Strahan
Enter the employee's ID: AF643G
Enter the current number of employees: 15
Name: Tara Strahan
ID: AF643G
New Number of Employees: 16

Este ejemplo muestra que aunque se puede inicializar un campo estático con otro campo estático aún sin declarar, el resultado
no estará definido hasta que no asigne explícitamente un valor al campo estático.
// cs_static_keyword_2.cs
using System;
class Test
{
static int x = y;
static int y = 5;

static void Main()


{
Console.WriteLine(Test.x);
Console.WriteLine(Test.y);

Test.x = 99;
Console.WriteLine(Test.x);
}
}

Resultados
0
5
99

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5.3 Métodos estáticos y de instancia
5.1.1 Variables estáticas
10.2.5 Miembros estáticos y de instancia
10.4.1 Campos estáticos y de instancia
10.4.5.1 Inicialización de campos estáticos
10.5.2 Métodos estáticos y de instancia
10.6.1 Propiedades estáticas y de instancia
10.7.3 Eventos estáticos y de instancia
10.11 Constructores estáticos
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
Clases estáticas y sus miembros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

unsafe (Referencia de C#)


La palabra clave unsafe denota un contexto no seguro, que es necesario para cualquier operación que involucre a punteros.
Para obtener más información, vea Código no seguro y punteros (Guía de programación de C#).
Se puede utilizar el modificador unsafe en la declaración de un tipo o un miembro. Toda la extensión textual del tipo o del
miembro se considera, por lo tanto, como contexto no seguro. Por ejemplo, el siguiente método se ha declarado con el
modificador unsafe:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)


{
// Unsafe context: can use pointers here.
}

El ámbito del contexto no seguro se extiende desde la lista de parámetros hasta el final del método, de modo que también se
pueden utilizar punteros en la lista de parámetros:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

También puede utilizar un bloque no seguro para habilitar el uso de código no seguro dentro del mismo. Por ejemplo:

unsafe
{
// Unsafe context: can use pointers here.
}

Para compilar código no seguro, se debe especificar la opción /unsafe del compilador. Common Language Runtime no puede
comprobar el código no seguro.
Ejemplo
// cs_unsafe_keyword.cs
// compile with: /unsafe
using System;
class UnsafeTest
{
// Unsafe method: takes pointer to int:
unsafe static void SquarePtrParam(int* p)
{
*p *= *p;
}

unsafe static void Main()


{
int i = 5;
// Unsafe method: uses address-of operator (&):
SquarePtrParam(&i);
Console.WriteLine(i);
}
}

Resultados
25

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
18 Código no seguro
Vea también
Referencia
Palabras clave de C#
fixed (Instrucción, Referencia de C#)
Búferes de tamaño fijo (Guía de programación de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

virtual (Referencia de C#)


La palabra clave virtual se utiliza para modificar un método, propiedad, indizador o declaración de evento y permite
reemplazar a cualquiera de estos en una clase derivada. En el siguiente ejemplo, cualquier clase que hereda este método puede
reemplazarlo:

public virtual double Area()


{
return x * y;
}

La implementación de un miembro virtual puede reemplazarse por un miembro de reemplazo de una clase derivada. Para
obtener más información sobre cómo utilizar la palabra clave virtual, vea
Control de versiones con las palabras clave Override y New (Guía de programación de C#) y
Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#).
Comentarios
Cuando se invoca un método virtual, el tipo en tiempo de ejecución del objeto se comprueba para ver si existe un miembro de
reemplazo. Se realiza una llamada al miembro de reemplazo que está en la clase de mayor derivación, el cual puede ser el
miembro original, si no existe ninguna clase derivada que haya reemplazado el miembro.
De forma predeterminada, los métodos son no virtuales. No se puede reemplazar un método no virtual.
No puede utilizar el modificador virtual con los modificadores static, abstract, private u override.
Las propiedades virtuales funcionan como los métodos abstractos, salvo en lo que se refiere a las diferencias en la sintaxis de
las declaraciones e invocaciones.
Es incorrecto utilizar el modificador virtual para una propiedad estática.
Una propiedad virtual heredada se puede reemplazar en una clase derivada si se incluye una declaración de propiedad
que use el modificador override.
Ejemplo
En este ejemplo, la clase Dimensions contiene las dos coordenadas x, y, y el método virtual Area(). Las clases de las diferentes
figuras, como Circle, Cylinder y Sphere, heredan la clase Dimensions, que permite calcular el área de la superficie de cada
figura. Cada clase derivada dispone de su propia implementación de Area() (método de reemplazo). El programa calcula y
muestra el área apropiada para cada implementación del método Area() según el objeto asociado al método.
Observe que todas las clases heredadas Circle, Sphere y Cylinder utilizan constructores que inicializan la clase base, por
ejemplo:

public Cylinder(double r, double h): base(r, h) {}

Esto es análogo a la lista de inicializaciones de C++.

// cs_virtual_keyword.cs
using System;
class TestClass
{
public class Dimensions
{
public const double PI = Math.PI;
protected double x, y;
public Dimensions()
{
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}

public class Circle : Dimensions


{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Dimensions
{
public Sphere(double r) : base(r, 0)
{
}

public override double Area()


{
return 4 * PI * x * x;
}
}

class Cylinder : Dimensions


{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}

static void Main()


{
double r = 3.0, h = 5.0;
Dimensions c = new Circle(r);
Dimensions s = new Sphere(r);
Dimensions l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}

Resultados
Area of Circle = 28.27
Area of Sphere = 113.10
Area of Cylinder = 150.80

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.5.4 Métodos virtuales, abstractos y de reemplazo
10.5.3 Métodos virtuales
10.6.3 Descriptores de acceso virtual, sellado, de reemplazo y abstracto
Vea también
Referencia
Modificadores (Referencia de C#)
Palabras clave de C#
abstract (Referencia de C#)
override (Referencia de C#)
new (Referencia de C#)
Conceptos
Guía de programación de C#
Polimorfismo (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

volatile (Referencia de C#)


La palabra clave volatile indica que varios subprocesos que se ejecutan a la vez pueden modificar un campo. Los campos que
se declaran como volatile no están sujetos a optimizaciones del compilador que suponen el acceso por un subproceso único.
Esto garantiza que el valor más actualizado está en todo momento presente en el campo.
El modificador volatile suele utilizarse para un campo al que tengan acceso varios subprocesos sin utilizar la instrucción
lock (Instrucción, Referencia de C#) para serializar el acceso. Vea
Cómo: Crear y terminar subprocesos (Guía de programación de C#) para obtener un ejemplo de volatile en un escenario de
multiproceso.
La palabra clave volatile se puede aplicar a los campos de estos tipos:
Tipos de referencia.
Tipos de puntero (en un contexto no seguro). Tenga en cuenta que aunque el propio puntero puede ser volátil, no ocurre
lo mismo con el objeto al que apunta. Es decir, no puede declarar un "puntero como volátil".
Tipos enteros como sbyte, byte, short, ushort, int, uint, char, float y bool.
Tipos de enumeración con un tipo base entero.
Parámetros de tipo genéricos que se sabe que son tipos de referencia.
IntPtr y UIntPtr.
La palabra clave volatile sólo se puede aplicar a los campos de una clase o estructura. Las variables locales no se pueden
declarar como volatile.
Ejemplo
El ejemplo siguiente muestra cómo declarar una variable de campo pública como volatile.

// csharp_volatile.cs
// compile with: /target:library
class Test
{
public volatile int i;

Test(int _i)
{
i = _i;
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.10 Orden de ejecución
10.4.3 Campos volátiles
Vea también
Referencia
Palabras clave de C#
Modificadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Tipos de instrucciones (Referencia de C#)


Este capítulo describe las instrucciones de C# que se pueden utilizar en un programa. Salvo que se indique otra cosa, las
instrucciones se ejecutan secuencialmente. C# dispone de las siguientes categorías de instrucciones:
Categoría Palabras clave de C#
Instrucciones de selección if, else, switch, case

Instrucciones de iteración do, for, foreach, in, while

Instrucciones de salto break, continue, default, goto, return, yield

Instrucciones de control de excepciones throw, try-catch, try-finally, try-catch-finally

Checked y unchecked checked, unchecked

Instrucción fixed fixed

Instrucción lock lock


Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Instrucciones de selección (Referencia de C#)


Una instrucción de selección hace que el control del programa se transfiera a un determinado punto del flujo de ejecución
dependiendo de que cierta condición sea true o no.
Las siguientes palabras clave se utilizan en instrucciones de selección:
if
else
switch
case
default
Vea también
Referencia
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

if-else (Referencia de C#)


La instrucción if selecciona una instrucción para ejecución en base al valor de una expresión Boolean. En el ejemplo siguiente
un indicador Boolean flagCheck se establece en true y, a continuación, se protege en la instrucción if. El resultado es: The
flag is set to true.

bool flagCheck = true;


if (flagCheck == true)
{
Console.WriteLine("The flag is set to true.");
}
else
{
Console.WriteLine("The flag is set to false.");
}

Comentarios
Si la expresión en el paréntesis se evalúa como true, a continuación se ejecuta la instrucción Console.WriteLine("The boolean
flag is set to ture."); . Después de ejecutar la instrucción if, el control se transfiere a la siguiente instrucción. Else no se
ejecuta en este ejemplo.
Si se desea ejecutar más de una instrucción, es posible ejecutar varias instrucciones en forma condicional al incluirlas en
bloques mediante {}, al igual que en el ejemplo anterior.
Las instrucciones que se van a ejecutar como resultado de comprobar la condición pueden ser de cualquier tipo, incluida otra
instrucción if anidada dentro de la instrucción if original. En las instrucciones if anidadas, la cláusula else pertenece a la última
instrucción if que no tiene una cláusula else correspondiente. Por ejemplo:

if (x > 10)
if (y > 20)
Console.Write("Statement_1");
else
Console.Write("Statement_2");

En este ejemplo, se mostrará Statement_2 si la condición (y > 20) se evalúa como false. No obstante, si desea asociar
Statement_2 a la condición (x >10), utilice llaves:

if (x > 10)
{
if (y > 20)
Console.Write("Statement_1");
}
else
Console.Write("Statement_2");

En este caso, se mostrará Statement_2 si la condición (x > 10) se evalúa como false.

Ejemplo 1
En este ejemplo, se escribe un carácter desde el teclado y el programa comprueba si se trata de un carácter alfabético. En ese
caso, comprueba si es minúscula o mayúscula. En cada caso, se muestra el mensaje apropiado.

// statements_if_else.cs
// if-else example
using System;
class IfTest
{
static void Main()
{
Console.Write("Enter a character: ");
char c = (char)Console.Read();
if (Char.IsLetter(c))
{
if (Char.IsLower(c))
{
Console.WriteLine("The character is lowercase.");
}
else
{
Console.WriteLine("The character is uppercase.");
}
}
else
{
Console.WriteLine("Not an alphabetic character.");
}
}
}

Resultado
2
Resultados del ejemplo
Enter a character: 2
The character is not an alphabetic character.

A continuación se ofrece otro ejemplo:


Ejecución Nº 2:
Enter a character: A
The character is uppercase.

Ejecución Nº 3:
Enter a character: h
The character is lowercase.

También es posible extender la instrucción if de modo que puedan controlarse varias condiciones, mediante la construcción
else-if siguiente:
if (Condition_1)
{
// Statement_1;
}
else if (Condition_2)
{
// Statement_2;
}
else if (Condition_3)
{
// Statement_3;
}
else
{
// Statement_n;
}

Ejemplo 2
Este ejemplo comprueba si el carácter especificado es una letra minúscula, mayúscula o un número. En cualquier otro caso, se
tratará de un carácter no alfanumérico. El programa utiliza la anterior estructura else-if en escalera.

// statements_if_else2.cs
// else-if
using System;
public class IfTest
{
static void Main()
{
Console.Write("Enter a character: ");
char c = (char)Console.Read();

if (Char.IsUpper(c))
{
Console.WriteLine("Character is uppercase.");
}
else if (Char.IsLower(c))
{
Console.WriteLine("Character is lowercase.");
}
else if (Char.IsDigit(c))
{
Console.WriteLine("Character is a number.");
}
else
{
Console.WriteLine("Character is not alphanumeric.");
}
}
}

Resultado
E
Resultados del ejemplo
Enter a character: E
The character is uppercase.

A continuación se ofrecen otros ejemplos de ejecuciones:


Ejecución Nº 2:
Enter a character: e
The character is lowercase.

Ejecución Nº 3:
Enter a character: 4
The character is a number.

Ejecución Nº 4:
Enter a character: $
The character is not alphanumeric.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.5 Instrucciones if
8.7.1 La instrucción if
Vea también
Referencia
Palabras clave de C#
Operador ?: (Referencia de C#)
The if-else Statement
switch (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

switch (Referencia de C#)


La instrucción switch es una instrucción de control que controla múltiples selecciones y enumeraciones pasando el control a
una de las instrucciones case de su cuerpo, como se muestra en el ejemplo siguiente:

int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}

Comentarios
El control se transfiere a la instrucción case que coincide con el valor del modificador. La instrucción switch puede incluir
cualquier número de instancias case, sin embargo dos instrucciones case nunca pueden tener el mismo valor. La ejecución del
cuerpo de la instrucción empieza en la instrucción seleccionada y continúa hasta que la instrucción break transfiere el control
fuera del cuerpo case. Es necesario introducir una instrucción de salto como break después de cada bloque case, incluido el
último bloque, se trate de una instrucción case o de una instrucción default. Con una excepción, (a diferencia de la instrucción
switch de C++), C# no admite el paso implícito de una etiqueta case a otra. Esta excepción se produce si una instrucción case
no tiene ningún código.
Si ninguna expresión case coincide con el valor de la instrucción switch, entonces el control se transfiere a las instrucciones que
siguen la etiqueta default opcional. Si no existe ninguna etiqueta default, el control se transfiere fuera de la instrucción
switch.
Ejemplo
// statements_switch.cs
using System;
class SwitchTest
{
static void Main()
{
Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large");
Console.Write("Please enter your selection: ");
string s = Console.ReadLine();
int n = int.Parse(s);
int cost = 0;
switch(n)
{
case 1:
cost += 25;
break;
case 2:
cost += 25;
goto case 1;
case 3:
cost += 50;
goto case 1;
default:
Console.WriteLine("Invalid selection. Please select 1, 2, or 3.");
break;
}
if (cost != 0)
{
Console.WriteLine("Please insert {0} cents.", cost);
}
Console.WriteLine("Thank you for your business.");
}
}

Entrada
2
Resultados del ejemplo
Coffee sizes: 1=Small 2=Medium 3=Large
Please enter your selection: 2
Please insert 50 cents.
Thank you for your business.

El siguiente ejemplo muestra que se permite el paso de una etiqueta case a otra para etiquetas case vacías.

// statements_switch2.cs
using System;
class SwitchTest
{
static void Main()
{
int n = 2;
switch(n)
{
case 1:
case 2:
case 3:
Console.WriteLine("It's 1, 2, or 3.");
break;
default:
Console.WriteLine("Not sure what it is.");
break;
}
}
}

Resultados
It's 1, 2, or 3.

Descripción del código


En el ejemplo anterior, se utilizó una variable de tipo integral, n, para los casos de la instrucción switch. Observe que
también se puede utilizar la variable de cadena, s, directamente. En ese caso, la estructura switch puede presentar la
siguiente forma:

switch(s)
{
case "1":
// ...
case "2":
// ...
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.6 Instrucción switch
8.7.2 La instrucción switch
Vea también
Referencia
Palabras clave de C#
The switch Statement
if-else (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Instrucciones de iteración (Referencia de C#)


Las instrucciones de iteración permiten crear bucles. En un bucle, las instrucciones internas se ejecutan un determinado
número de veces, según el criterio de terminación del bucle. Estas instrucciones se ejecutan en orden, salvo cuando se
encuentra una instrucción de salto.
Las siguientes palabras clave se utilizan en instrucciones de iteración:
do
for
foreach
in
while
Vea también
Referencia
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

do (Referencia de C#)
La instrucción do ejecuta una instrucción o un bloque de instrucciones entre {} repetidamente hasta que una expresión
especificada se evalúe como false. En el ejemplo siguiente las instrucciones de bucle do-while se ejecutan con la condición de
que la variable y sea menor que 5.
Ejemplo
// statements_do.cs
using System;
public class TestDoWhile
{
public static void Main ()
{
int x = 0;
do
{
Console.WriteLine(x);
x++;
} while (x < 5);
}
}

Resultados
0
1
2
3
4

Comentarios
A diferencia de la instrucción while, un bucle do-while se ejecuta una vez antes de que se evalúe la expresión condicional.
En cualquier punto dentro del bloque do-while, puede salir del bucle utilizando la instrucción break. Puede pasar directamente
a la instrucción de evaluación de expresión while utilizando la instrucción continue; si la expresión se evalúa como true, la
ejecución continúa en la primera instrucción del bucle. Si la expresión se evalúa como false, la ejecución continúa en la primera
instrucción detrás del bucle do-while.
También se puede salir de un bucle do-while mediante las instrucciones goto, return o throw.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.8 Instrucciones Do
8.8.2 La instrucción do
Vea también
Referencia
Palabras clave de C#
The do-while Statement (C++)
Instrucciones de iteración (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

for (Referencia de C#)


El bucle for ejecuta una instrucción o un bloque de instrucciones repetidamente hasta que una determinada expresión se
evalúa como false. El bucle for es útil para recorrer en iteración matrices y para procesar secuencialmente. En el ejemplo
siguiente el valor de int i se escribe en la consola y el valor de i se va incrementando en 1 en el bucle.
Ejemplo
// statements_for.cs
// for loop
using System;
class ForLoopTest
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
}
}

Resultados
1
2
3
4
5

Comentarios
La instrucción for ejecuta la instrucción o instrucciones internas repetidamente del siguiente modo:
Primero, se evalúa el valor inicial de la variable i.
A continuación, mientras el valor de i sea menor o igual que 5, la condición se evalúa como true, se ejecuta la
instrucción Console.WriteLine y se vuelve a evaluar i.
Cuando i es mayor que 5, la condición se convierte en false y el control se transfiere fuera del bucle.
Puesto que la comprobación de la expresión condicional tiene lugar antes de la ejecución del bucle, las instrucciones internas
de un bucle for pueden no llegar a ejecutarse.
Todas las expresiones de la instrucción for son opcionales; por ejemplo, la siguiente instrucción se utiliza para crear un bucle
infinito:

for (;;)
{
// ...
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.9 Instrucciones for
8.8.3 La instrucción for
Vea también
Referencia
Palabras clave de C#
foreach, in (Referencia de C#)
The for Statement
Instrucciones de iteración (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

foreach, in (Referencia de C#)


La instrucción foreach repite un grupo de instrucciones incluidas en el bucle para cada elemento de una matriz o de un objeto
collection. La instrucción foreach se utiliza para recorrer en iteración una colección de elementos y obtener la información
deseada, pero no se debe utilizar para cambiar el contenido de la colección, ya que se pueden producir efectos secundarios
imprevisibles.
Comentarios
Las instrucciones del bucle siguen ejecutándose para cada elemento de la matriz o la colección. Cuando ya se han recorrido
todos los elementos de la colección, el control se transfiere a la siguiente instrucción fuera del bloque foreach.
En cualquier punto dentro del bloque foreach, puede salir del bucle utilizando la palabra clave break o pasando directamente
la iteración siguiente del bucle mediante la palabra clave continue.
También se puede salir de un bucle foreach mediante las instrucciones goto, return o throw.
Para obtener más información acerca de la palabra clave foreach, incluidos ejemplos de código, vea los temas siguientes:
Utilizar foreach son matrices (Guía de programación de C#)
Cómo: Obtener acceso a una clase de colección mediante Foreach (Guía de programación de C#)
Ejemplo
En este ejemplo, foreach se utiliza para mostrar el contenido de una matriz de enteros.

// cs_foreach.cs
class ForEachTest
{
static void Main(string[] args)
{
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{
System.Console.WriteLine(i);
}
}
}

Resultados
0
1
2
3
5
8
13

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.16 Instrucciones Foreach
8.8.4 La instrucción foreach
Vea también
Referencia
Palabras clave de C#
Instrucciones de iteración (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

while (Referencia de C#)


La instrucción while ejecuta una instrucción o un bloque de instrucciones repetidamente hasta que una expresión especificada
se evalúa como false.
Ejemplo
// statements_while.cs
using System;
class WhileTest
{
static void Main()
{
int n = 1;
while (n < 6)
{
Console.WriteLine("Current value of n is {0}", n);
n++;
}
}
}

Resultados
Current value of n is 1
Current value of n is 2
Current value of n is 3
Current value of n is 4
Current value of n is 5

// statements_while_2.cs
using System;
class WhileTest
{
static void Main()
{
int n = 1;
while (n++ < 6)
{
Console.WriteLine("Current value of n is {0}", n);
}
}
}

Resultados
Current value of n is 2
Current value of n is 3
Current value of n is 4
Current value of n is 5
Current value of n is 6

Como la comprobación de la expresión while tiene lugar antes de la ejecución del bucle, las instrucciones internas de un bucle
while pueden no llegar a ejecutarse. Esto es diferente del bucle do que se ejecuta una o varias veces.
Un bucle while se puede terminar cuando una instrucción break, goto, return o throw transfiere el control fuera del bucle. Para
pasar el control a la siguiente iteración sin salir del bucle, use la instrucción continue. Observe la diferencia en los resultados de
los tres ejemplos anteriores con relación a dónde se incrementa int n. En el ejemplo siguiente no se genera ningún resultado.

// statements_while_3.cs
// no output is generated
using System;
class WhileTest
{
static void Main()
{
int n = 5;
while (++n < 6)
{
Console.WriteLine("Current value of n is {0}", n);
}
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.7 Instrucciones while
8.8.1 La instrucción while
Vea también
Referencia
Palabras clave de C#
The while Statement
Instrucciones de iteración (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Instrucciones de salto (Referencia de C#)


La alteración del flujo secuencial normal de un programa se consigue mediante instrucciones de salto, las cuales producen una
transferencia inmediata del control del programa. Las siguientes palabras clave se utilizan en instrucciones de salto:
break
continue
goto
return
throw
Vea también
Referencia
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

break (Referencia de C#)


La instrucción break permite terminar el bucle envolvente más cercano o la instrucción switch en la cual aparece. El control se
transfiere a la instrucción que sigue a la instrucción terminada, si existe alguna.
Ejemplo
En este ejemplo, la instrucción condicional contiene un contador que se supone que cuenta de 1 a 100; sin embargo, la
instrucción break termina el bucle tras 4 iteraciones.

// statements_break.cs
using System;
class BreakTest
{
static void Main()
{
for (int i = 1; i <= 100; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
}
}

Resultados
1
2
3
4

Este ejemplo muestra el uso de break en una instrucción switch.

// statements_break2.cs
// break and switch
using System;
class Switch
{
static void Main()
{
Console.Write("Enter your selection (1, 2, or 3): ");
string s = Console.ReadLine();
int n = Int32.Parse(s);
switch (n)
{
case 1:
Console.WriteLine("Current value is {0}", 1);
break;
case 2:
Console.WriteLine("Current value is {0}", 2);
break;
case 3:
Console.WriteLine("Current value is {0}", 3);
break;
default:
Console.WriteLine("Sorry, invalid selection.");
break;
}
}
}
Entrada
1
Resultados del ejemplo
Enter your selection (1, 2, or 3): 1
Current value is 1

Comentarios
Si se escribió 4, el resultado sería:

Enter your selection (1, 2, or 3): 4


Sorry, invalid selection.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.10 Instrucciones break, continue y goto
8.9.1 La instrucción break
Vea también
Referencia
Palabras clave de C#
The break Statement
switch (Referencia de C#)
Instrucciones de salto (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

continue (Referencia de C#)


La instrucción continue transfiere el control a la siguiente iteración de la instrucción de iteración envolvente donde aparece.
Ejemplo
En este ejemplo, se inicializa un contador que cuenta de 1 a 10. Utilizando la instrucción continue con la expresión (i < 9), se
omiten las instrucciones situadas entre continue y el final del cuerpo del bucle for.

// statements_continue.cs
using System;
class ContinueTest
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
if (i < 9)
{
continue;
}
Console.WriteLine(i);
}
}
}

Resultados
9
10

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.10 Instrucciones break, continue y goto
8.9.2 La instrucción continue
Vea también
Referencia
Palabras clave de C#
The break Statement
Instrucciones de salto (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

goto (Referencia de C#)


La instrucción goto transfiere el control del programa directamente a una instrucción identificada por una etiqueta.
Comentarios
Un uso habitual de goto consiste en transferir el control a una etiqueta switch-case específica o a la etiqueta predeterminada
de una instrucción switch.
La instrucción goto también es útil para salir de bucles de varios niveles de anidamiento.
Ejemplo
El ejemplo siguiente muestra cómo utilizar goto en una instrucción switch.

// statements_goto_switch.cs
using System;
class SwitchTest
{
static void Main()
{
Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large");
Console.Write("Please enter your selection: ");
string s = Console.ReadLine();
int n = int.Parse(s);
int cost = 0;
switch (n)
{
case 1:
cost += 25;
break;
case 2:
cost += 25;
goto case 1;
case 3:
cost += 50;
goto case 1;
default:
Console.WriteLine("Invalid selection.");
break;
}
if (cost != 0)
{
Console.WriteLine("Please insert {0} cents.", cost);
}
Console.WriteLine("Thank you for your business.");
}
}

Entrada
2
Resultados del ejemplo
Coffee sizes: 1=Small 2=Medium 3=Large
Please enter your selection: 2
Please insert 50 cents.
Thank you for your business.

El siguiente ejemplo muestra el uso de goto para salir de un conjunto de bucles anidados.

// statements_goto.cs
// Nested search loops
using System;
public class GotoTest1
{
static void Main()
{
int x = 200, y = 4;
int count = 0;
string[,] array = new string[x, y];

// Initialize the array:


for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
array[i, j] = (++count).ToString();
// Read input:
Console.Write("Enter the number to search for: ");

// Input a string:
string myNumber = Console.ReadLine();
// Search:
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
if (array[i, j].Equals(myNumber))
{
goto Found;
}
}
}

Console.WriteLine("The number {0} was not found.", myNumber);


goto Finish;

Found:
Console.WriteLine("The number {0} is found.", myNumber);
Finish:
Console.WriteLine("End of search.");
}
}

Entrada
44
Resultados del ejemplo
Enter the number to search for: 44
The number 44 is found.
End of search.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.10 Instrucciones break, continue y goto
8.9.3 La instrucción goto
Vea también
Referencia
Palabras clave de C#
The goto Statement
Instrucciones de salto (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

return (Referencia de C#)


La instrucción return termina la ejecución del método en el que aparece y devuelve el control al método que realizó la
llamada. También puede devolver un valor opcional. Si el método es del tipo void, la instrucción return se puede omitir.
Ejemplo
En el siguiente ejemplo, el método A() devuelve la variable Area como un valor de tipo double.

// statements_return.cs
using System;
class ReturnTest
{
static double CalculateArea(int r)
{
double area = r * r * Math.PI;
return area;
}

static void Main()


{
int radius = 5;
Console.WriteLine("The area is {0:0.00}", CalculateArea(radius));
}
}

Resultados
The area is 78.54

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.12 Instrucciones Return
8.9.4 La instrucción return
Vea también
Referencia
Palabras clave de C#
The return Statement
Instrucciones de salto (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Instrucciones para el control de excepciones (Referencia de C#)


C# incorpora mecanismos para el tratamiento de las situaciones anómalas, denominadas excepciones, que pueden producirse
durante la ejecución de un programa. Estas excepciones se controlan mediante código situado fuera del flujo normal de
control.
Esta sección describe los siguientes temas sobre el control de excepciones:
throw
try-catch
try-finally
try-catch-finally
Vea también
Referencia
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
Excepciones y control de excepciones (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

throw (Referencia de C#)


La instrucción throw se utiliza para señalizar la aparición de una situación anómala (excepción) durante la ejecución del
programa.
Comentarios
La excepción producida es un objeto cuya clase se deriva de System.Exception, por ejemplo:

class MyException : System.Exception {}


// ...
throw new MyException();

Normalmente, la instrucción throw se utiliza con las instrucciones try-catch o try-finally. Cuando se produce una excepción, el
programa busca la instrucción catch que controla esa excepción.
También se puede volver a producir una excepción detectada mediante la instrucción throw. Para obtener más información,
incluidos ejemplos, vea try-catch e Producir excepciones.
Ejemplo
Este ejemplo muestra cómo provocar una excepción mediante la instrucción throw.

// throw example
using System;
public class ThrowTest
{
static void Main()
{
string s = null;

if (s == null)
{
throw new ArgumentNullException();
}

Console.Write("The string s is null"); // not executed


}
}

Resultados
Se produce la excepción ArgumentNullException.
Ejemplo de código
Vea los ejemplos de try-catch, try-finally y try-catch-finally.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.11 Instrucciones throw
8.9.5 La instrucción throw
Vea también
Tareas
Cómo: Iniciar excepciones explícitamente
Referencia
The try, catch, and throw Statements
Palabras clave de C#
Instrucciones para el control de excepciones (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

try-catch (Referencia de C#)


La instrucción try-catch consta de un bloque try seguido de una o más cláusulas catch, las cuales especifican controladores
para diferentes excepciones.
Comentarios
El bloque try contiene el código protegido que puede causar la excepción. Este bloque se ejecuta hasta que se produce una
excepción o hasta completarse satisfactoriamente. Por ejemplo, el siguiente intento de convertir un objeto null provoca la
excepción NullReferenceException:

object o2 = null;
try
{
int i2 = (int)o2; // Error
}

La cláusula catch se puede utilizar sin argumentos, en cuyo caso captura cualquier tipo de excepción y se conoce como
cláusula catch general. También puede aceptar un argumento de objeto derivado de System.Exception, en cuyo caso trata
una excepción específica. Por ejemplo:

catch (InvalidCastException e)
{
}

Es posible utilizar más de una cláusula catch específica en la misma instrucción try-catch. En este caso, el orden de las
cláusulas catch es importante, ya que las cláusulas catch se examinan por orden. Las excepciones más específicas se capturan
antes que las menos específicas.
Se puede utilizar una instrucción throw en el bloque catch para volver a producir la excepción, la cual ha sido capturada por la
instrucción catch. Por ejemplo:

catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
}

Si desea volver a producir la excepción que está siendo actualmente controlada por una cláusula catch sin parámetros, use la
instrucción throw sin argumentos. Por ejemplo:

catch
{
throw;
}

Dentro de un bloque try, inicialice sólo variables declaradas en su interior; en caso contrario, puede producirse una excepción
antes de que se complete la ejecución del bloque. Por ejemplo, en el siguiente ejemplo de código, la variable x se inicializa
dentro del bloque try. Al intentar utilizar esta variable fuera del bloque try en la instrucción Write(x), se generará el siguiente
error del compilador: Uso de variable local no asignada.

static void Main()


{
int x;
try
{
// Don't initialize this variable here.
x = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'x'.
Console.Write(x);
}

Para obtener más información acerca de catch, vea try-catch-finally.


Ejemplo
En este ejemplo, el bloque try contiene una llamada al método MyMethod(), que puede producir una excepción. La cláusula
catch contiene el controlador de excepciones, el cual simplemente muestra un mensaje en la pantalla. Cuando se realiza la
llamada a la instrucción throw desde dentro de MyMethod, el sistema busca la instrucción catch y muestra el mensaje
Exception caught.

// try_catch_example.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}

static void Main()


{
try
{
string s = null;
ProcessString(s);
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}

Resultados del ejemplo


System.ArgumentNullException: Value cannot be null.
at MainClass.Main() Exception caught.

En este ejemplo, se utilizan dos instrucciones catch. La excepción más específica, que aparece en primer lugar, se captura
primero.

// try_catch_ordering_catch_clauses.cs
using System;
class MainClass
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}

static void Main()


{
try
{
string s = null;
ProcessString(s);
}
// Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
}
// Least specific:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
}
}
}

Resultados del ejemplo


System.ArgumentNullException: Value cannot be null.
at MainClass.Main() First exception caught.

Comentarios
En el ejemplo anterior, si empieza con la cláusula catch menos específica, aparecerá el mensaje de error: A previous catch
clause already catches all exceptions of this or a super type ('System.Exception')

No obstante, para capturar la excepción menos específica, debe reemplazar la instrucción throw por la siguiente:
throw new Exception();

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.13 Instrucciones Try-catch
8.10 La instrucción try
16 Excepciones
Vea también
Tareas
Cómo: Iniciar excepciones explícitamente
Referencia
Palabras clave de C#
The try, catch, and throw Statements
Instrucciones para el control de excepciones (Referencia de C#)
throw (Referencia de C#)
try-finally (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

try-finally (Referencia de C#)


El bloque finally es útil para limpiar cualquier recurso asignado en el bloque try, así como también para ejecutar cualquier
código que deba ejecutarse incluso si hay una excepción. El control se transfiere siempre al bloque finally independientemente
de cómo finalice el bloque try.
Comentarios
Mientras que catch se utiliza para controlar las excepciones que se producen en un bloque de instrucciones, finally se emplea
para asegurar la ejecución de un bloque de instrucciones sin importar cómo finaliza el bloque try anterior.
Ejemplo
En este ejemplo, existe una instrucción de conversión no válida que produce una excepción. Cuando se ejecuta el programa, se
obtiene un mensaje de error en tiempo de ejecución, pero la cláusula finally se ejecuta de todas formas y muestra el
resultado.

// try-finally
using System;
public class MainClass
{
static void Main()
{
int i = 123;
string s = "Some string";
object o = s;

try
{
// Invalid conversion; o contains a string not an int
i = (int)o;
}
finally
{
Console.Write("i = {0}", i);
}
}
}

Comentarios
El ejemplo anterior hace que se produzca la excepción System.InvalidCastException.
A pesar de que se capturó una excepción, la instrucción de salida incluida en el bloque finally se ejecutará de todas formas, es
decir:
i = 123

Para obtener más información acerca de finally, vea try-catch-finally.


Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.14 Instrucciones Try-finally
8,11 La instrucción try
16 Excepciones
Vea también
Tareas
Cómo: Iniciar excepciones explícitamente
Referencia
Palabras clave de C#
The try, catch, and throw Statements
Instrucciones para el control de excepciones (Referencia de C#)
throw (Referencia de C#)
try-catch (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

try-catch-finally (Referencia de C#)


Un uso común de catch y finally consiste en obtener y utilizar recursos en un bloque try, tratar circunstancias excepcionales
en el bloque catch y liberar los recursos en el bloque finally.
Para obtener más información y ejemplos sobre cómo volver a producir las excepciones, vea try-catch y Producir excepciones.
Ejemplo
// try_catch_finally.cs
using System;
public class EHClass
{
static void Main()
{
try
{
Console.WriteLine("Executing the try statement.");
throw new NullReferenceException();
}
catch (NullReferenceException e)
{
Console.WriteLine("{0} Caught exception #1.", e);
}
catch
{
Console.WriteLine("Caught exception #2.");
}
finally
{
Console.WriteLine("Executing finally block.");
}
}
}

Resultados del ejemplo


Executing the try statement.
System.NullReferenceException: Object reference not set to an instance of an object.
at EHClass.Main() Caught exception #1.
Executing finally block.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.15 Instrucciones Try-catch-finally
8.10 La instrucción try
16 Excepciones
Vea también
Tareas
Cómo: Iniciar excepciones explícitamente
Referencia
Palabras clave de C#
The try, catch, and throw Statements
Instrucciones para el control de excepciones (Referencia de C#)
throw (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Checked y Unchecked (Referencia de C#)


Las instrucciones de C# se pueden ejecutar en un contexto comprobado (checked) o no comprobado (unchecked). En un
contexto comprobado, el desbordamiento aritmético produce una excepción. En un contexto no comprobado, se hace caso
omiso del desbordamiento aritmético y el resultado se trunca.
checked Especifica un contexto comprobado.
unchecked Especifica un contexto no comprobado.
Si no se especifica checked ni unchecked, el contexto predeterminado depende de factores externos tales como las opciones
del compilador.
La comprobación del desbordamiento afecta a las siguientes operaciones:
Expresiones que utilizan los siguientes operadores predefinidos con tipos integrales:
++ — - (unario) + - * /
Conversiones numéricas explícitas entre tipos integrales.
La opción del compilador /checked permite especificar un contexto checked o unchecked para todas las instrucciones
aritméticas de enteros que no se encuentran explícitamente en el ámbito de una palabra clave checked o unchecked.
Vea también
Referencia
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

checked (Referencia de C#)


La palabra clave checked se utiliza con el fin de habilitar explícitamente la comprobación de desbordamiento para
operaciones aritméticas y conversiones de tipo integral.
Comentarios
De forma predeterminada, si una expresión genera un valor que está fuera del intervalo del tipo de destino, las expresiones
constantes producen errores en tiempo de compilación y las expresiones no constantes se evalúan en tiempo de ejecución y
producen excepciones. Sin embargo, la palabra clave checked se puede utilizar para habilitar la comprobación si las opciones
del compilador o configuración del entorno la suprimen globalmente.
Vea los ejemplos de unchecked en los ejemplos de uso de la palabra clave unchecked.
Ejemplo
Este ejemplo muestra cómo utilizar checked para una expresión no constante. El desbordamiento se notifica en tiempo de
ejecución.

// statements_checked.cs
using System;
class OverFlowTest
{
static short x = 32767; // Max short value
static short y = 32767;

// Using a checked expression


static int CheckedMethod()
{
int z = 0;
try
{
z = checked((short)(x + y));
}
catch (System.OverflowException e)
{
Console.WriteLine(e.ToString());
}
return z;
}

static void Main()


{
Console.WriteLine("Checked output value is: {0}",
CheckedMethod());
}
}

Resultados del ejemplo


System.OverflowException: Arithmetic operation resulted in an overflow.
at OverFlowTest.CheckedMethod()
Checked output value is: 0

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.2 Instrucciones de bloques e instrucciones checked y unchecked
7.5.12 Los operadores checked y unchecked
8.11 Las instrucciones checked y unchecked
Vea también
Referencia
Palabras clave de C#
Checked y Unchecked (Referencia de C#)
unchecked (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

unchecked (Referencia de C#)


La palabra clave unchecked se utiliza con el fin de suprimir la comprobación de desbordamiento para operaciones aritméticas
y conversiones de tipo integral.
Comentarios
En un contexto no comprobado (unchecked), si una expresión produce un valor fuera del intervalo del tipo de destino, el
resultado se trunca. Por ejemplo:

unchecked
{
int val = 2147483647 * 2;
}

Como el cálculo anterior se realiza en un bloque unchecked, se pasa por alto que el resultado es demasiado grande para un
valor entero y se asigna a val el valor -2. De forma predeterminada, se habilita la detección del desbordamiento, que tiene el
mismo efecto que utilizar checked.
En el ejemplo anterior, si se hubiera omitido unchecked, ocurriría un error de compilación porque la expresión utiliza
constantes y el resultado se conoce en tiempo de compilación. La palabra clave unchecked también suprime la detección del
desbordamiento para expresiones no constantes, que de lo contrario producen una excepción OverflowException en tiempo de
ejecución.
La palabra clave unchecked también se puede utilizar como operador, de la manera siguiente:

public int UncheckedAdd(int a, int b)


{
return unchecked(a + b);
}

Ejemplo
Este ejemplo muestra cómo utilizar la instrucción unchecked, utilizando unchecked con expresiones constantes.

// statements_unchecked.cs
using System;
class TestClass
{
const int x = 2147483647; // Max int
const int y = 2;
static void Main()
{
int z;
unchecked
{
z = x * y;
}
Console.WriteLine("Unchecked output value: {0}", z);
}
}

Resultados
Unchecked output value: -2

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.2 Instrucciones de bloques e instrucciones checked y unchecked
7.5.12 Los operadores checked y unchecked
8.11 Las instrucciones checked y unchecked
Vea también
Referencia
Palabras clave de C#
Checked y Unchecked (Referencia de C#)
checked (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

fixed (Instrucción, Referencia de C#)


La instrucción fixed evita que el recolector de elementos no utilizados vuelva a ubicar una variable móvil. La instrucción fixed
sólo se permite en un contexto unsafe. También se puede utilizar Fixed para crear búferes de tamaño fijo.
Comentarios
La instrucción fixed crea un puntero a una variable administrada y "fija" esa variable durante la ejecución de la
instrucciónstatement. Sin la instrucción fixed, los punteros a variables administradas móviles serían de poca utilidad, ya que el
proceso de recolección de elementos no utilizados podría cambiar la ubicación de las variables de forma impredecible. El
compilador de C# sólo permite asignar un puntero a una variable administrada en una instrucción fixed.

// assume class Point { public int x, y; }


// pt is a managed variable, subject to garbage collection.
Point pt = new Point();
// Using fixed allows the address of pt members to be
// taken, and "pins" pt so it isn't relocated.
fixed ( int* p = &pt.x )
{
*p = 1;
}

Un puntero se puede inicializar con la dirección de una matriz o de una cadena:

fixed (int* p = arr) ... // equivalent to p = &arr[0]


fixed (char* p = str) ... // equivalent to p = &str[0]

Se pueden inicializar varios punteros a la vez, siempre que sean del mismo tipo:

fixed (byte* ps = srcarray, pd = dstarray) {...}

Para inicializar punteros de diferente tipo, simplemente anide instrucciones fixed:

fixed (int* p1 = &p.x)


{
fixed (double* p2 = &array[5])
{
// Do something with p1 and p2.
}
}

Después de ejecutar el código de la instrucción, se libera cualquier variable anteriormente fijada y queda sujeta al proceso de
recolección de elementos no utilizados. Por lo tanto, no se debe apuntar a esas variables desde fuera de la instrucción fixed.
Nota
Los punteros inicializados en instrucciones fixed no se pueden modificar.

En el modo no seguro (unsafe), se puede asignar memoria a la pila, donde no está sometida a recolección de elementos no
utilizados y, por lo tanto, no necesita fijarse. Para obtener más información, vea stackalloc (Referencia de C#).
Ejemplo
// statements_fixed.cs
// compile with: /unsafe
using System;
class Point
{
public int x, y;
}

class FixedTest
{
// Unsafe method: takes a pointer to an int.
unsafe static void SquarePtrParam (int* p)
{
*p *= *p;
}

unsafe static void Main()


{
Point pt = new Point();
pt.x = 5;
pt.y = 6;
// Pin pt in place:
fixed (int* p = &pt.x)
{
SquarePtrParam (p);
}
// pt now unpinned
Console.WriteLine ("{0} {1}", pt.x, pt.y);
}
}

Resultados
25 6

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
18.3 Variables fijas y movibles
18.6 La instrucción fixed
Vea también
Referencia
Palabras clave de C#
unsafe (Referencia de C#)
Búferes de tamaño fijo (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

lock (Instrucción, Referencia de C#)


La palabra clave lock marca un bloque de instrucciones como una sección crucial, para lo cual utiliza el bloqueo de exclusión
mutua de un objeto, la ejecución de una instrucción y, posteriormente, la liberación del bloqueo. La instrucción presenta la
siguiente forma:

Object thisLock = new Object();


lock (thisLock)
{
// Critical code section
}

Para obtener más información, vea Sincronización de subprocesos (Guía de programación de C#).
Comentarios
La instrucción lock permite garantizar que un subproceso no va a entrar en una sección crucial de código mientras otro
subproceso ya se encuentre en ella. Si otro subproceso intenta entrar en un código bloqueado, esperará, o se bloqueará, hasta
que el objeto se libere.
En la sección Subprocesamiento (Guía de programación de C#) se describe el subprocesamiento.
La palabra clave lock llama a Enter al principio del bloque y a Exit al final del bloque.
En general evite bloquear un tipo public o instancias que estén fuera del control de su código. Las construcciones comunes
lock (this), lock (typeof (MyType)) y lock ("myLock") incumplen esta instrucción:

lock (this) se convierte en un problema si la instancia es accesible públicamente.

lock (typeof (MyType)) se convierte en un problema si MyType es accesible públicamente.

lock(“myLock”) se convierte en un problema puesto que cualquier otro código del proceso que utilice la misma cadena,
compartirá el mismo bloqueo.
El procedimiento recomendado es definir un objeto un objeto private para realizar el bloqueo o una variable de objeto
private static para proteger los datos comunes a todas las instancias.
Ejemplo
El siguiente ejemplo muestra un uso simple de subprocesos en C#.

// statements_lock.cs
using System;
using System.Threading;

class ThreadTest
{
public void RunMe()
{
Console.WriteLine("RunMe called");
}
static void Main()
{
ThreadTest b = new ThreadTest();
Thread t = new Thread(b.RunMe);
t.Start();
}
}

Resultados
RunMe called

El siguiente ejemplo utiliza subprocesos y lock. Con el uso de la instrucción lock, el bloque de instrucciones se convierte en
una sección crítica y balance nunca tomará un valor negativo.

// statements_lock2.cs
using System;
using System.Threading;
class Account
{
private Object thisLock = new Object();
int balance;

Random r = new Random();


public Account(int initial)
{
balance = initial;
}
int Withdraw(int amount)
{

// This condition will never be true unless the lock statement


// is commented out:
if (balance < 0)
{
throw new Exception("Negative Balance");
}

// Comment out the next line to see the effect of leaving out
// the lock keyword:
lock(thisLock)
{
if (balance >= amount)
{
Console.WriteLine("Balance before Withdrawal : " + balance);
Console.WriteLine("Amount to Withdraw : -" + amount);
balance = balance - amount;
Console.WriteLine("Balance after Withdrawal : " + balance);
return amount;
}
else
{
return 0; // transaction rejected
}
}
}
public void DoTransactions()
{
for (int i = 0; i < 100; i++)
{
Withdraw(r.Next(1, 100));
}
}
}
class Test
{
static void Main()
{
Thread[] threads = new Thread[10];
Account acc = new Account(1000);
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(new ThreadStart(acc.DoTransactions));
threads[i] = t;
}
for (int i = 0; i < 10; i++)
{
threads[i].Start();
}
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.18 Instrucciones Lock
8.12 La instrucción lock
Vea también
Tareas
Ejemplo Monitor Synchronization Technology
Ejemplo Wait Synchronization Technology
Referencia
Subprocesamiento (Guía de programación de C#)
Palabras clave de C#
Tipos de instrucciones (Referencia de C#)
MethodImplAttributes Enumeration
Sincronización de subprocesos (Guía de programación de C#)
Mutex
Conceptos
Guía de programación de C#
Monitores
Operaciones de bloqueo
AutoResetEvent
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Parámetros de métodos (Referencia de C#)


Si un parámetro se declara para un método sin ref u out, se le puede asociar un valor. Ese valor se puede cambiar en el
método, pero el cambio se perderá cuando se devuelva el control al procedimiento que realizó la llamada. Si utiliza palabras
clave de parámetros de método en la declaración del parámetro, puede modificar ese comportamiento.
Esta sección describe las palabras clave que puede utilizar para declarar parámetros de métodos:
params
ref
out
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

params (Referencia de C#)


La palabra clave params permite especificar un parámetro de método que acepta un número variable de argumentos.
No se permiten parámetros adicionales después de la palabra clave params, ni varias palabras clave params en una misma
declaración de método.
Ejemplo
// cs_params.cs
using System;
public class MyClass
{

public static void UseParams(params int[] list)


{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}

public static void UseParams2(params object[] list)


{
for (int i = 0 ; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}

static void Main()


{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");

// An array of objects can also be passed, as long as


// the array type matches the method being called.
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}

Resultados
1
2
3

1
a
test

10
11
12

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.5.1.4 Matrices de parámetros
Vea también
Referencia
Palabras clave de C#
Parámetros de métodos (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

ref (Referencia de C#)


La palabra clave ref produce argumentos que se van a pasar por referencia. El efecto es que cualquier cambio que se realice en
el parámetro dentro del método se reflejará en esa variable cuando se devuelva el control al método que realizó la llamada.
Para utilizar un parámetro ref, la definición de método y el método de llamada deben utilizar explícitamente la palabra clave
ref. Por ejemplo:

class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}

Para pasar un argumento a un parámetro ref, primero debe inicializarse. Esto es diferente de out, cuyo argumento no tiene
que inicializarse explícitamente antes de pasarlo. (Vea out (Referencia de C#).)
Aunque ref y out se tratan de manera diferente en tiempo de ejecución, se tratan de la misma manera en tiempo de
compilación. Por consiguiente no se pueden sobrecargar los métodos si un método toma un argumento ref y el otro toma un
argumento out. Por ejemplo, estos dos métodos son idénticos en lo referente a la compilación, por lo que este código no se
compilará:

class CS0663_Example
{
// compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out"
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
}

Sin embargo, se puede realizar la sobrecarga si un método toma un argumento ref u out y el otro no utiliza ninguno de los
dos, de la manera siguiente:

class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}

Comentarios
Las propiedades no son variables y, por consiguiente, no se pueden pasar como parámetros ref.
Para obtener información sobre el paso de matrices, vea Pasar matrices mediante Ref y Out (Guía de programación de C#).
Ejemplo
Como se mostró anteriormente, el paso de tipos de valor por referencia es útil, pero ref también es útil para pasar los tipos de
referencia. Esto permite a los métodos llamados modificar el objeto al que se refiere la referencia porque la propia referencia
se pasa por referencia. El ejemplo siguiente muestra que cuando un tipo de referencia se pasa como parámetro ref, se puede
cambiar el objeto mismo.

class RefRefExample
{
static void Method(ref string s)
{
s = "changed";
}
static void Main()
{
string str = "original";
Method(ref str);
// str is now "changed"
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.1.5 Parámetros de referencia
10.5.1.2 Parámetros de referencia
Vea también
Referencia
Pasar parámetros (Guía de programación de C#)
Parámetros de métodos (Referencia de C#)
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

out (Referencia de C#)


La palabra clave out produce argumentos que se van a pasar por referencia. Esto es similar a la palabra clave ref, excepto en
que ref requiere que se inicialice la variable antes de pasarla. Utilizar un parámetro out, la definición de método y el método de
llamada deben utilizar explícitamente la palabra clave out. Por ejemplo:

class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}

Aunque las variables pasadas como argumentos out no tienen que inicializarse antes de pasarlas, el método de llamada es
necesario para asignar un valor antes de que el método devuelva un valor.
Las palabras clave ref y out se tratan de manera diferente en tiempo de ejecución, pero se tratan del mismo modo en tiempo
de compilación. Por consiguiente no se pueden sobrecargar los métodos si un método toma un argumento ref y el otro toma
un argumento out. Por ejemplo, estos dos métodos son idénticos en lo referente a la compilación, por lo que este código no se
compilará:

class CS0663_Example
{
// compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out"
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}

Sin embargo, se puede realizar la sobrecarga si un método toma un argumento ref u out y el otro no utiliza ninguno de los
dos, de la manera siguiente:

class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { }
}

Comentarios
Las propiedades no son variables y, por consiguiente, no se pueden pasar como parámetros out.
Para obtener información sobre el paso de matrices, vea Pasar matrices mediante Ref y Out (Guía de programación de C#).
Ejemplo
Declarar un método como out es útil cuando se desea que devuelva varios valores. Un método que utiliza un parámetro out
puede utilizar una variable como tipo de datos devuelto (vea return) pero también puede devolver uno o más objetos a un
método de llamada como parámetros out. Este ejemplo utiliza out para devolver tres variables con una única llamada al
método. Observe que el tercer argumento se asigna a null. Esto permite que los métodos devuelvan valores opcionalmente.

class OutReturnExample
{
static void Method(out int i, out string s1, out string s2)
{
i = 44;
s1 = "I've been returned";
s2 = null;
}
static void Main()
{
int value;
string str1, str2;
Method(out value, out str1, out str2);
// value is now 44
// str1 is now "I've been returned"
// str2 is (still) null;
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.1.6 Parámetros de salida
10.5.1.3 Parámetros de salida
Vea también
Referencia
Palabras clave de C#
Parámetros de métodos (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave del espacio de nombres (Referencia de C#)


Esta sección describe las palabras clave y operadores relacionados con el uso de espacios de nombres:
namespace
using
Operador .
Operator ::
alias externo
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

namespace (Referencia de C#)


La palabra clave namespace se utiliza para declarar un ámbito. Este ámbito permite organizar el código y proporciona una
forma de crear tipos globalmente únicos.

namespace SampleNamespace
{
class SampleClass{}
interface SampleInterface{}
struct SampleStruct{}
enum SampleEnum{a,b}
delegate void SampleDelegate(int i);
namespace SampleNamespace.Nested
{
class SampleClass2{}
}
}

Comentarios
Dentro de un espacio de nombres, se pueden declarar uno o varios de los siguientes tipos:
otro espacio de nombres
clase (class)
interfaz
struct
enum
delegado (delegate)
Aunque declare explícitamente un espacio de nombres en un archivo de código fuente de C#, el compilador agrega un espacio
de nombres predeterminado. Este espacio de nombres sin denominación, a veces denominado espacio de nombres global,
está presente en todos los archivos. Cualquier identificador del espacio de nombres global puede utilizarse también en un
espacio de nombres declarado.
Los espacios de nombres disponen implícitamente de un acceso público que no puede modificarse. Para obtener una
descripción de los modificadores de acceso que se pueden asignar a los elementos de un espacio de nombres, consulte
Modificadores de acceso (Referencia de C#).
Un espacio de nombres se puede definir en dos o más declaraciones. Por ejemplo, en el siguiente ejemplo se definen dos
clases como parte del espacio de nombres MyCompany:

// cs_namespace_keyword.cs
// compile with: /target:library
namespace MyCompany.Proj1
{
class MyClass
{
}
}
namespace MyCompany.Proj1
{
class MyClass1
{
}
}

Ejemplo
El siguiente ejemplo muestra cómo realizar una llamada a un método estático en un espacio de nombres anidado.
// cs_namespace_keyword_2.cs
using System;
namespace SomeNameSpace
{
public class MyClass
{
static void Main()
{
Nested.NestedNameSpaceClass.SayHello();
}
}

// a nested namespace
namespace Nested
{
public class NestedNameSpaceClass
{
public static void SayHello()
{
Console.WriteLine("Hello");
}
}
}
}

Resultados
Hello

Para obtener más información


Para obtener más información acerca del uso de espacios de nombres, consulte los temas siguientes:
Espacios de nombres (Guía de programación de C#)
Utilizar espacios de nombres (Guía de programación de C#)
Cómo: Utilizar el calificador de alias del espacio de nombres (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
3.4.1 Miembros de espacios de nombres
3.8 Espacios de nombres y nombres de tipos
9 Espacios de nombres
Vea también
Referencia
Palabras clave de C#
Palabras clave del espacio de nombres (Referencia de C#)
using (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

using (Referencia de C#)


La palabra clave using tiene dos usos principales:
Como directiva, cuando se utiliza para crear un alias para un espacio de nombres o para importar tipos definidos en
otros espacios de nombres. Vea Directiva using.
Como instrucción, cuando define un ámbito al final del cual el objeto se destruye. Vea Instrucción using.
Vea también
Referencia
Palabras clave de C#
Palabras clave del espacio de nombres (Referencia de C#)
extern (Referencia de C#)
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

using (Directiva, Referencia de C#)


La directiva using se utiliza para:
Permitir el uso de tipos en un espacio de nombres, de modo que no sea necesario especificar el uso de un tipo en dicho
espacio de nombres:

using System.Text;

Crear un alias para un espacio de nombres o un tipo.

using Project = PC.MyCompany.Project;

La palabra clave using también se utiliza para crear instrucciones using que definen cuándo se eliminará un objeto. Vea
using (Instrucción, Referencia de C#) para obtener más información.
Comentarios
El ámbito de una directiva using se limita al archivo en el cual aparece.
Cree un alias using para que sea más fácil especificar un identificador de un espacio de nombres o tipo.
Cree una directiva using para utilizar los tipos de un espacio de nombres sin tener que especificar el espacio de nombres. Una
directiva using no proporciona acceso a ningún espacio de nombres anidado en el espacio de nombres especificado.
Los espacios de nombres se dividen en dos categorías: definidos por el usuario y definidos por el sistema. Los espacios de
nombres definidos por el usuario se definen en el código fuente. Para obtener una lista de los espacios de nombres definidos
por el sistema, vea Referencia de la biblioteca de clases de .NET Framework.
Para ver ejemplos sobre cómo hacer referencia a métodos en otros ensamblados, vea Crear y utilizar archivos DLL de C#.
Ejemplo 1
El siguiente ejemplo muestra cómo definir y utilizar un alias using para un espacio de nombres:

namespace PC
{
// Define an alias for the nested namespace.
using Project = PC.MyCompany.Project;
class A
{
void M()
{
// Use the alias
Project.MyClass mc = new Project.MyClass();
}
}
namespace MyCompany
{
namespace Project
{
public class MyClass{}
}
}
}

Ejemplo 2
El siguiente ejemplo muestra cómo definir una directiva using y un alias using para una clase:

// cs_using_directive2.cs
// Using directive.
using System;
// Using alias for a class.
using AliasToMyClass = NameSpace1.MyClass;

namespace NameSpace1
{
public class MyClass
{
public override string ToString()
{
return "You are in NameSpace1.MyClass";
}
}
}
namespace NameSpace2
{
class MyClass
{
}
}
namespace NameSpace3
{
// Using directive:
using NameSpace1;
// Using directive:
using NameSpace2;
class MainClass
{
static void Main()
{
AliasToMyClass somevar = new AliasToMyClass();
Console.WriteLine(somevar);
}
}
}

Resultados
You are in NameSpace1.MyClass

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
9.3 Directivas using
Vea también
Referencia
Palabras clave de C#
Palabras clave del espacio de nombres (Referencia de C#)
using (Instrucción, Referencia de C#)
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

using (Instrucción, Referencia de C#)


Define un ámbito fuera del cual se eliminará un objeto u objetos.
Sintaxis

using (Font font1 = new Font("Arial", 10.0f))


{
}

Comentarios
C#, a través de Common Language Runtime (CLR) de .NET Framework, libera automáticamente la memoria utilizada para
almacenar objetos que ya no son necesarios. La liberación de memoria no es determinista; se libera cuando CLR decide realizar
la recolección de elementos no utilizados. Sin embargo, normalmente es mejor liberar los recursos limitados, como
identificadores de archivos y conexiones de red, tan rápido como sea posible.
La instrucción using permite al programador especificar cuándo los objetos que utilizan recursos deben liberarlos. El objeto
proporcionado a la instrucción using debe implementar la interfaz IDisposable. Esta interfaz proporciona el método Dispose,
que debería liberar los recursos del objeto.
Es posible salir de una instrucción using cuando se alcanza el final de la instrucción using o cuando se produce una excepción
y el control abandona el bloque de la instrucción antes de llegar al final.
El objeto se puede declarar en la instrucción using, como se mostró anteriormente, a delante de ella, del modo siguiente:

Font font2 = new Font("Arial", 10.0f);


using (font2)
{
// use font2
}

Se pueden utilizar varios objetos con una instrucción using, pero se deben declarar dentro de la instrucción using, como
sigue:

using (Font font3 = new Font("Arial", 10.0f),


font4 = new Font("Arial", 10.0f))
{
// Use font3 and font4.
}

Ejemplo
El ejemplo siguiente muestra cómo una clase definida por el usuario puede implementar su propio comportamiento Dispose.
Observe que su tipo debe heredarse de IDisposable.

using System;
class C : IDisposable
{
public void UseLimitedResource()
{
Console.WriteLine("Using limited resource...");
}
void IDisposable.Dispose()
{
Console.WriteLine("Disposing limited resource.");
}
}

class Program
{
static void Main()
{
using (C c = new C())
{
c.UseLimitedResource();
}
Console.WriteLine("Now outside using statement.");
Console.ReadLine();
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
5.3.3.17 Instrucciones Using
8.13 La instrucción using
Vea también
Referencia
Palabras clave de C#
extern (Referencia de C#)
Palabras clave del espacio de nombres (Referencia de C#)
using (Directiva, Referencia de C#)
Implementar Finalize y Dispose para limpiar recursos no administrados
Conceptos
Guía de programación de C#
Espacios de nombres (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

alias externo (Referencia de C#)


A veces puede ser necesario hacer referencia a dos versiones de ensamblados que tienen los mismos nombres completos del
tipo, por ejemplo, cuando necesita utilizar dos o más versiones de un ensamblado en la misma aplicación. Al utilizar un alias de
ensamblado externo, los espacios de nombres de cada ensamblado se pueden ajustar dentro de espacios de nombres de nivel
de raíz denominados por el alias, lo que permite utilizarlos en el mismo archivo.
Nota
La palabra clave extern también se utiliza como un modificador de método, cuando se declara un método escrito en código n
o administrado.

Para hacer referencia a dos ensamblados con los mismos nombres completos del tipo, un alias se debe especificar en la línea
de comandos, del modo siguiente:
/r:GridV1=grid.dll
/r:GridV2=grid20.dll

Esto crea los alias externos GridV1 y GridV2. Para utilizar estos alias desde dentro de un programa, haga referencia a ellos
mediante la palabra clave extern. Por ejemplo:
extern alias GridV1;
extern alias GridV2;

Cada declaración de alias externo introduce un espacio de nombres de nivel de raíz adicional que crea un paralelo (pero no se
encuentra dentro de él) al espacio de nombres global. De este modo, es posible hacer referencia a los tipos de cada
ensamblado sin ambigüedades, mediante su nombre completo, arraigado en el alias de espacio de nombres adecuado
En el ejemplo anterior, GridV1::Grid sería el control de cuadrícula de grid.dll y GridV2::Grid sería el control de cuadrícula
de grid20.dll.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
25.4 Alias externos
Vea también
Referencia
Palabras clave de C#
Palabras clave del espacio de nombres (Referencia de C#)
Operador :: (Referencia de C#)
/reference (Importar metadatos) (Opciones del compilador de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave de operadores (Referencia de C#)


Se utiliza para realizar acciones misceláneas como crear objetos, comprobar el tipo en tiempo de ejecución de un objeto,
obtener el tamaño de un tipo, y así sucesivamente. Esta sección presenta las siguientes palabras clave:
as Convierte un objeto en un tipo compatible.
is Comprueba el tipo en tiempo de ejecución de un objeto.
new
Operador new Crea objetos.
Modificador new Oculta un miembro heredado.
Restricción new Califica un parámetro de tipo.
sizeof Obtiene el tamaño de un tipo.
typeof Obtiene el objeto System.Type para un tipo.
true
Operador true Devuelve el valor booleano true para indicar true y de lo contrario devuelve false.
Literal true Representa el valor booleano true.
false
Operador false Devuelve el valor booleano true para indicar false y de lo contrario devuelve false.
Literal false Representa el valor booleano false.
stackalloc Asigna un bloque de memoria en la pila.
Las siguientes palabras clave, que se pueden utilizar como operadores e instrucciones, se describen en la sección Instrucciones:
checked Especifica un contexto comprobado.
unchecked Especifica un contexto no comprobado.
Vea también
Referencia
Palabras clave de C#
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

as (Referencia de C#)
Se utiliza para realizar conversiones entre tipos de referencia compatibles. Por ejemplo:

string s = someObject as string;


if (s != null)
{
// someObject is a string.
}

Comentarios
El operador as es similar a una operación de conversión de tipos; sin embargo, si la conversión no es posible, as devuelve null
en lugar de producir una excepción. Más formalmente, una expresión de la forma,

expression as type

equivale a,

expression is type ? (type)expression : (type)null

salvo que expression sólo se evalúa una vez.


Debe tenerse en cuenta que el operador as solamente ejecuta conversiones de referencia y conversiones boxing. El operador
as no puede realizar otras conversiones, como las definidas por el usuario, que se deben realizar utilizando expresiones de
conversión explícitas.
Ejemplo
// cs_keyword_as.cs
// The as operator.
using System;
class Class1
{
}

class Class2
{
}
class MainClass
{
static void Main()
{
object[] objArray = new object[6];
objArray[0] = new Class1();
objArray[1] = new Class2();
objArray[2] = "hello";
objArray[3] = 123;
objArray[4] = 123.4;
objArray[5] = null;
for (int i = 0; i < objArray.Length; ++i)
{
string s = objArray[i] as string;
Console.Write("{0}:", i);
if (s != null)
{
Console.WriteLine("'" + s + "'");
}
else
{
Console.WriteLine("not a string");
}
}
}
}

Resultados
0:not a string
1:not a string
2:'hello'
3:not a string
4:not a string
5:not a string

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
6 Conversiones
7.9.10 El operador as
Vea también
Referencia
Palabras clave de C#
is (Referencia de C#)
Operador ?: (Referencia de C#)
Palabras clave de operadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

is (Referencia de C#)
Comprueba si un objeto es compatible con un tipo determinado. Por ejemplo, se puede determinar si un objeto es compatible
con el tipo string de la forma siguiente:

if (obj is string)
{
}

Comentarios
Una expresión is se evalúa como true si la expresión proporcionada no es NULL y el objeto proporcionado se puede convertir
al tipo proporcionado sin producir una excepción. Para obtener más información, vea 7.6.6 Cast expressions.
La palabra clave is tiene como resultado una advertencia en tiempo de compilación si se sabe que la expresión siempre será
true o siempre será false, pero normalmente evalúa la compatibilidad de tipos en tiempo de ejecución.
El operador is no se puede sobrecargar.
Observe que el operador is solamente tiene en cuenta las conversiones de referencia, las conversiones boxing y las
conversiones unboxing. No se tienen en cuenta otras conversiones, tales como las conversiones definidas por el usuario.
Ejemplo
// cs_keyword_is.cs
// The is operator.
using System;
class Class1
{
}
class Class2
{
}

class IsTest
{
static void Test(object o)
{
Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;
// Do something with "a."
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;
// Do something with "b."
}
else
{
Console.WriteLine("o is neither Class1 nor Class2.");
}
}
static void Main()
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Test(c1);
Test(c2);
Test("a string");
}
}

Resultados
o is Class1
o is Class2
o is neither Class1 nor Class2.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.9.9 El operador is
Vea también
Referencia
Palabras clave de C#
typeof (Referencia de C#)
as (Referencia de C#)
Palabras clave de operadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

new (Referencia de C#)


En C#, la palabra clave new se puede utilizar como operador, modificador o restricción.
new (Operador)
Se utiliza para crear objetos e invocar constructores.
new (Modificador)
Se utiliza para ocultar un miembro heredado de un miembro de clase base.
new (Restricción)
Se utiliza para restringir tipos que se podrían utilizar como argumentos para un parámetro de tipo en una declaración
genérica.
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

new (Operador, Referencia de C#)


Se utiliza para crear objetos e invocar constructores. Por ejemplo:

Class1 o = new Class1();

El operador new también se utiliza para invocar el constructor predeterminado de los tipos de valor. Por ejemplo:

int i = new int();

En la instrucción anterior se inicializa i con el valor 0, que es el predeterminado para el tipo int. Esa instrucción tiene el mismo
efecto que:

int i = 0;

Para obtener una lista completa de valores predeterminados, vea Tabla de valores predeterminados.
Recuerde que es un error declarar un constructor predeterminado para un tipo struct, ya que todos los tipos de valores poseen
implícitamente un constructor público predeterminado. Es posible declarar constructores parametrizados en un tipo struct
para establecer sus valores iniciales, pero sólo es necesario si se requieren valores distintos del predeterminado.
Los objetos de tipo valor, tales como las estructuras, se crean en la pila, mientras que los objetos de tipo referencia, tales como
las clases, se crean en el montón. Ambos tipos de objetos se destruyen automáticamente, pero los objetos basados en tipos de
valor se destruyen cuando salen del ámbito, mientras que los objetos basados en tipos de referencia se destruyen en un
momento no especificado después de quitar la última referencia a ellos. En los tipos de referencia que consumen ciertos
recursos, como grandes cantidades de memoria, identificadores de archivo o conexiones de red, a veces es conveniente
emplear la finalización determinista para asegurarse de que el objeto se destruirá lo antes posible. Para obtener más
información, vea using (Instrucción, Referencia de C#).
El operador new no se puede sobrecargar.
Si el operador new no puede asignar memoria, producirá la excepción OutOfMemoryException.
Ejemplo
En el siguiente ejemplo, se crean e inicializan, mediante el operador new, un objeto struct y un objeto class y, a continuación,
se les asignan valores. Se muestran los valores predeterminados y asignados.

// cs_operator_new.cs
// The new operator.
using System;
struct SampleStruct
{
public int x;
public int y;
public SampleStruct(int x, int y)
{
this.x = x;
this.y = y;
}
}
class SampleClass
{
public string name;
public int id;
public SampleClass() {}

public SampleClass(int id, string name)


{
this.id = id;
this.name = name;
}
}

class MainClass
{
static void Main()
{
// Create objects using default constructors:
SampleStruct Location1 = new SampleStruct();
SampleClass Employee1 = new SampleClass();

// Display values:
Console.WriteLine("Default values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location1.x, Location1.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee1.name, Employee1.id);
// Create objects using parameterized constructors:
SampleStruct Location2 = new SampleStruct(10, 20);
SampleClass Employee2 = new SampleClass(1234, "John Martin Smith");

// Display values:
Console.WriteLine("Assigned values:");
Console.WriteLine(" Struct members: {0}, {1}",
Location2.x, Location2.y);
Console.WriteLine(" Class members: {0}, {1}",
Employee2.name, Employee2.id);
}
}

Resultados
Default values:
Struct members: 0, 0
Class members: , 0
Assigned values:
Struct members: 10, 20
Class members: John Martin Smith, 1234

Comentarios
Observe en el ejemplo que el valor predeterminado de una cadena es null. Por lo tanto, no se muestra.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.5.10 El operador new
Vea también
Referencia
Palabras clave de C#
Palabras clave de operadores (Referencia de C#)
new (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

new (Modificador, Referencia de C#)


Cuando se utiliza como modificador, la palabra clave new oculta explícitamente un miembro heredado de una clase base.
Ocultar un miembro heredado significa que la versión derivada del miembro reemplaza la versión de la clase base. Aunque se
permite ocultar miembros sin utilizar el modificador new, se genera una advertencia. El uso de new para ocultar
explícitamente un miembro suprime esta advertencia y documenta el hecho de que la versión derivada está concebida como
un reemplazo.
Para ocultar un miembro heredado, declárelo en la clase derivada con el mismo nombre y modifíquelo con el modificador
new. Por ejemplo:

public class BaseC


{
public int x;
public void Invoke() {}
}
public class DerivedC : BaseC
{
new public void Invoke() {}
}

En este ejemplo, DerivedC.Invoke oculta BaseC.Invoke. El campo x no se ve afectado porque no lo oculta un nombre similar.
La ocultación de nombres por medio de la herencia toma una de las siguientes formas:
Constante, campo, propiedad o tipo introducido en una clase o estructura que oculta todos los miembros de la clase base
con el mismo nombre.
Método introducido en una clase o estructura que oculta propiedades, campos y tipos, con el mismo nombre, en la clase
base. También oculta todos los métodos de la clase base con la misma firma.
Indizador introducido en una clase o estructura que oculta todos los indizadores de la clase base con la misma firma.
Es un error utilizar new y override en el mismo miembro, ya que los dos modificadores tienen significados mutuamente
exclusivos. Al utilizar new, se crea un nuevo miembro con el mismo nombre y el miembro original queda oculto, mientras que
override amplía la implementación de un miembro heredado.
Si se utiliza el modificador new en una declaración que no oculta un miembro heredado, se genera una advertencia.
Ejemplo
En este ejemplo, una clase base, BaseC, y una clase derivada, DerivedC, utilizan el mismo nombre de campo x, lo que produce la
ocultación del valor del campo heredado. El ejemplo muestra el uso del modificador new. También muestra cómo obtener
acceso a los miembros ocultos de la clase base mediante sus nombres completos.

// cs_modifier_new.cs
// The new modifier.
using System;
public class BaseC
{
public static int x = 55;
public static int y = 22;
}
public class DerivedC : BaseC
{
// Hide field 'x'
new public static int x = 100;

static void Main()


{
// Display the new value of x:
Console.WriteLine(x);
// Display the hidden value of x:
Console.WriteLine(BaseC.x);
// Display the unhidden member y:
Console.WriteLine(y);
}
}

Resultados
100
55
22

En este ejemplo, una clase anidada oculta una clase con el mismo nombre en la clase base. El ejemplo muestra el uso del
modificador new para eliminar el mensaje de advertencia, así como el acceso a los miembros ocultos de la clase mediante sus
nombres completos.

// cs_modifer_new_nested.cs
// Using the new modifier with nested types.
using System;
public class BaseC
{
public class NestedC
{
public int x = 200;
public int y;
}
}

public class DerivedC : BaseC


{
// Nested type hiding the base type members.
new public class NestedC
{
public int x = 100;
public int y;
public int z;
}
static void Main()
{
// Creating an object from the overlapping class:
NestedC c1 = new NestedC();

// Creating an object from the hidden class:


BaseC.NestedC c2 = new BaseC.NestedC();
Console.WriteLine(c1.x);
Console.WriteLine(c2.x);
}
}

Resultados
100
200

Comentarios
Si quita el modificador new, el programa seguirá compilándose y ejecutándose, pero aparecerá la siguiente advertencia:

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'
.

También puede utilizar el modificador new para modificar un tipo anidado si éste está ocultando otro tipo, como se muestra
en el ejemplo siguiente.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.2.2 El modificador new
Vea también
Referencia
Palabras clave de C#
Palabras clave de operadores (Referencia de C#)
Modificadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Restricción new (Referencia de C#)


La restricción new especifica que, en una declaración de clase genérica, cualquier argumento de tipo debe tener un constructor
público sin parámetros. Aplique esta restricción a un parámetro de tipo cuando una clase genérica cree nuevas instancias del
tipo, como se muestra en el ejemplo siguiente:

class ItemFactory<T> where T : new()


{
public T GetNewItem()
{
return new T();
}
}

Cuando se utiliza la restricción new() con otras restricciones, se debe especificar en último lugar:

using System;
public class ItemFactory<T>
where T : IComparable, new()
{
}

Para obtener más información, vea Restricciones de tipos de parámetros (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
19.1.4 Restricciones
Vea también
Referencia
Palabras clave de C#
Palabras clave de operadores (Referencia de C#)
System.Collections.Generic
Conceptos
Guía de programación de C#
Genéricos (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

sizeof (Referencia de C#)


Se utiliza para obtener el tamaño en bytes para un tipo de valor. Por ejemplo, el tamaño del tipo int se puede recuperar de la
manera siguiente:

int intSize = sizeof(int);

Comentarios
El operador sizeof sólo se puede aplicar a tipos de valor, no a tipos de referencia.
Nota
A partir de la versión 2.0 de C# en adelante, la aplicación de sizeof a los tipos predefinidos, ya no requiere la utilización del
modo unsafe.

El operador sizeof no puede sobrecargarse. Los valores devueltos por el operador sizeof son del tipo int. La tabla siguiente
muestra los valores constantes que representan los tamaños de ciertos tipos predefinidos.

Expresión Resultado

sizeof(sbyte) 1

sizeof(byte) 1

sizeof(short) 2

sizeof(ushort) 2

sizeof(int) 4

sizeof(uint) 4

sizeof(long) 8

sizeof(ulong) 8

sizeof(char) 2 (Unicode)

sizeof(float) 4

sizeof(double) 8

sizeof(bool) 1

Para todos los otros tipos, entre ellos las estructuras, el operador sizeof se puede utilizar sólo en bloques de código no
seguros. Aunque se puede utilizar el método SizeOf, el valor devuelto por este método no siempre es igual al valor devuelto
por sizeof. Marshal.SizeOf devuelve el tamaño después de calcular las referencias del tipo, mientras que sizeof devuelve el
tamaño cuando éste ha sido asignado por Common Language Runtime, incluido cualquier valor de relleno.
Ejemplo
// cs_operator_sizeof.cs
// compile with: /unsafe
using System;
class MainClass
{
unsafe static void Main()
{
Console.WriteLine("The size of short is {0}.", sizeof(short));
Console.WriteLine("The size of int is {0}.", sizeof(int));
Console.WriteLine("The size of long is {0}.", sizeof(long));
}
}

Resultados
The size of short is 2.
The size of int is 4.
The size of long is 8.

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
18.5.8 El operador sizeof
Vea también
Referencia
Palabras clave de C#
Palabras clave de operadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

typeof (Referencia de C#)


Obtenga el objeto System.Type para un tipo. Una expresión typeof se presenta de la siguiente forma:

System.Type type = typeof(int);

Comentarios
Para obtener el tipo de una expresión en tiempo de ejecución, puede utilizar el método GetType de .NET Framework de la
manera siguiente.

int i = 0;
System.Type type = i.GetType();

El operador typeof también se puede utilizar en tipos de genéricos abiertos. Los tipos con más de un parámetro de tipo deben
tener el número adecuado de comas en la especificación. El operador typeof no se puede sobrecargar.
Ejemplo
// cs_operator_typeof.cs
using System;
using System.Reflection;

public class SampleClass


{
public int sampleMember;
public void SampleMethod() {}

static void Main()


{
Type t = typeof(SampleClass);
// Alternatively, you could use
// SampleClass obj = new SampleClass();
// Type t = obj.GetType();

Console.WriteLine("Methods:");
MethodInfo[] methodInfo = t.GetMethods();

foreach (MethodInfo mInfo in methodInfo)


Console.WriteLine(mInfo.ToString());

Console.WriteLine("Members:");
MemberInfo[] memberInfo = t.GetMembers();

foreach (MemberInfo mInfo in memberInfo)


Console.WriteLine(mInfo.ToString());
}
}

Resultados
Methods:
Void SampleMethod()
System.Type GetType()
System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
Members:
Void SampleMethod()
System.Type GetType()
System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
Void .ctor()
Int32 sampleMember
En este ejemplo se utiliza el método GetType para determinar el tipo utilizado para contener el resultado de un cálculo
numérico. Esto depende de los requisitos de almacenamiento del número resultante.

// cs_operator_typeof2.cs
using System;
class GetTypeTest
{
static void Main()
{
int radius = 3;
Console.WriteLine("Area = {0}", radius * radius * Math.PI);
Console.WriteLine("The type is {0}",
(radius * radius * Math.PI).GetType()
);
}
}

Resultados
Area = 28.2743338823081
The type is System.Double

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.5.11 El operador typeof
Vea también
Referencia
Palabras clave de C#
is (Referencia de C#)
Palabras clave de operadores (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

true (Referencia de C#)


Se utiliza como un operador sobrecargado o como un literal:
true (Operador)
true (Literal)
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

true (Operador, Referencia de C#)


Devuelve el valor booleano true para indicar que es verdadero; devuelve false cuando lo define un tipo definido por el usuario.
Esto resulta útil para tipos que representan valores true, false y null (ni true ni false), como los utilizados en bases de datos.
Esos tipos se pueden utilizar en las expresiones de control de las instrucciones if, do, while y for, así como en
expresiones condicionales.
Si un tipo define el operador true, también debe definir el operador false.
Un tipo no puede sobrecargar directamente los operadores lógicos condicionales (&& y ||), pero al sobrecargar los operadores
lógicos regulares y los operadores true y false se puede lograr un efecto equivalente.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.9.1 Operadores unarios
7.11.2 Operadores lógicos condicionales definidos por el usuario
7.16 Expresiones Boolean
Vea también
Referencia
Palabras clave de C#
Operadores de C#
false (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

true (Literal, Referencia de C#)


Representa el valor booleano true.
Ejemplo
// cs_keyword_true.cs
using System;
class TestClass
{
static void Main()
{
bool a = true;
Console.WriteLine( a ? "yes" : "no" );
}
}

Resultados
yes

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
2.4.4.1 Literales Boolean
Vea también
Referencia
Palabras clave de C#
false (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

false (Referencia de C#)


Se utiliza como un operador sobrecargado o como un literal:
false (Operador)
false (Literal)
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

false (Operador, Referencia de C#)


Devuelve el valor booleano true para indicar false y devuelve false de lo contrario. Esto resulta útil para tipos que representan
valores true, false y null (ni true ni false), como los utilizados en bases de datos.
Esos tipos se pueden utilizar en las expresiones de control de las instrucciones if, do, while y for, así como en
expresiones condicionales.
Si un tipo define el operador false, también debe definir el operador true.
Un tipo no puede sobrecargar directamente los operadores lógicos condicionales && y ||, pero al sobrecargar los operadores
lógicos regulares y los operadores true y false se puede lograr un efecto equivalente.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
10.9.1 Operadores unarios
7.11.2 Operadores lógicos condicionales definidos por el usuario
7.16 Expresiones booleanas
Vea también
Referencia
Palabras clave de C#
Operadores de C#
true (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

false (Literal, Referencia de C#)


Representa el valor booleano false.
Ejemplo
// cs_keyword_false.cs
using System;
class TestClass
{
static void Main()
{
bool a = false;
Console.WriteLine( a ? "yes" : "no" );
}
}

Resultados
no

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
2.4.4.1 Literales Boolean
Vea también
Referencia
Palabras clave de C#
true (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

stackalloc (Referencia de C#)


Se utiliza en un contexto de código no seguro para asignar un bloque de memoria en la pila.

int* fib = stackalloc int[100];

Comentarios
En el ejemplo anterior, un bloque de memoria de tamaño suficiente para contener 100 elementos de tipo int se reserva en la
pila y no en el montón; la dirección del bloque se almacena en el puntero fib. Esta memoria no está sometida a reciclaje y, por
lo tanto, no necesita fijarse (por medio de fixed). El período de duración del bloque de memoria se limita al período de
duración del método en el que está definido (no hay forma de liberar la memoria antes de la devolución del método).
El operador stackalloc sólo es válido en inicializadores de variables locales.
Dado que intervienen los tipos de puntero, stackalloc requiere el contexto unsafe. Vea
Código no seguro y punteros (Guía de programación de C#).
stackalloc es similar a _alloca de la biblioteca en tiempo de ejecución de C.
Seguridad
El código no seguro es inherentemente menos seguro que las alternativas seguras. Sin embargo, el uso de stackalloc habilita
automáticamente las características de detección de saturación del búfer en Common Language Runtime (CLR). Si se detecta
una saturación del búfer, el proceso se finaliza tan rápidamente como sea posible para reducir la oportunidad de que se
ejecute código malintencionado.
Ejemplo
// cs_keyword_stackalloc.cs
// compile with: /unsafe
using System;
class Test
{
static unsafe void Main()
{
int* fib = stackalloc int[100];
int* p = fib;
*p++ = *p++ = 1;
for (int i = 2; i < 100; ++i, ++p)
{
*p = p[-1] + p[-2];
}
for (int i = 0; i < 10; ++i)
{
Console.WriteLine(fib[i]);
}
}
}

Resultados
1
1
2
3
5
8
13
21
34
55

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
18.7 Asignación de la pila
Vea también
Referencia
Palabras clave de C#
Palabras clave de operadores (Referencia de C#)
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave para conversiones (Referencia de C#)


Esta sección describe palabras clave utilizadas para conversiones de tipos:
explicit
implicit
operator
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

explicit (Referencia de C#)


La palabra clave explicit declara un operador de conversión de tipos definido por el usuario que se debe invocar con una
conversión de tipos. Por ejemplo, este operador convierte una clase denominada Fahrenheit en una clase denominada Celsius:

// Must be defined inside a class called Farenheit:


public static explicit operator Celsius(Farenheit f)
{
return new Celsius((5.0f/9.0f)*(f.degrees-32));
}

El operador de conversión se puede invocar así:

Farenheit f = new Farenheit(100.0f);


Celsius c = (Celsius)f;

Comentarios
El operador de conversión convierte un tipo de origen en un tipo de destino. El tipo de origen proporciona el operador de
conversión. A diferencia de la conversión implícita, los operadores de conversión explícita deben invocarse mediante una
conversión de tipo (cast). Si una operación de conversión puede producir excepciones o pérdida de información, debe
marcarse como explicit. De esta forma, se evita que el compilador realice la conversión automáticamente y se produzcan
posibles consecuencias no deseadas.
Si no se utiliza esta conversión explícita, se produce el error de compilación Error del compilador CS0266.
Para obtener más información, vea Utilizar operadores de conversión (Guía de programación de C#).
Ejemplo
El ejemplo siguiente proporciona una clase Fahrenheit y una clase Celsius, cada una de las cuales proporciona un operador
de conversión explícito a la otra clase.

// cs_keyword_explicit_temp.cs
using System;
class Celsius
{
public Celsius(float temp)
{
degrees = temp;
}
public static explicit operator Fahrenheit(Celsius c)
{
return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class Fahrenheit
{
public Fahrenheit(float temp)
{
degrees = temp;
}
public static explicit operator Celsius(Fahrenheit f)
{
return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}
public float Degrees
{
get { return degrees; }
}
private float degrees;
}
class MainClass
{
static void Main()
{
Fahrenheit f = new Fahrenheit(100.0f);
Console.Write("{0} fahrenheit", f.Degrees);
Celsius c = (Celsius)f;
Console.Write(" = {0} celsius", c.Degrees);
Fahrenheit f2 = (Fahrenheit)c;
Console.WriteLine(" = {0} fahrenheit", f2.Degrees);
}
}

Resultados
100 fahrenheit = 37.77778 celsius = 100 fahrenheit

El siguiente ejemplo define una estructura, Digit, que representa un único dígito decimal. Se define un operador para
conversiones de byte a Digit, pero como no todos los bytes se pueden convertir en Digit, la conversión es explícita.

// cs_keyword_explicit_2.cs
using System;
struct Digit
{
byte value;
public Digit(byte value)
{
if (value > 9)
{
throw new ArgumentException();
}
this.value = value;
}

// Define explicit byte-to-Digit conversion operator:


public static explicit operator Digit(byte b)
{
Digit d = new Digit(b);
Console.WriteLine("conversion occurred");
return d;
}
}

class MainClass
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}

Resultados
conversion occurred
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
6.2 Conversiones explícitas
Vea también
Tareas
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Referencia
Palabras clave de C#
implicit (Referencia de C#)
operator (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

implicit (Referencia de C#)


La palabra clave implicit se utiliza para declarar un operador de conversión de tipo implícito definido por el usuario. Utilícela
para permitir conversiones implícitas entre un tipo definido por el usuario y otro tipo, si existen garantías de que la conversión
no dará lugar a la pérdida de datos.

class Digit
{
public Digit(double d) { val = d; }
public double val;
// ...other members

// User-defined conversion from Digit to double


public static implicit operator double(Digit d)
{
return d.val;
}
// User-defined conversion from double to Digit
public static implicit operator Digit(double d)
{
return new Digit(d);
}
}
class Program
{
static void Main(string[] args)
{
Digit dig = new Digit(7);
//This call invokes the implicit "double" operator
double num = dig;
//This call invokes the implicit "Digit" operator
Digit dig2 = 12;
Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
Console.ReadLine();
}
}

Comentarios
Si se eliminan las conversiones de tipo explícitas innecesarias y se utilizan conversiones implícitas, la legibilidad del código
mejora. Sin embargo, como las conversiones implícitas no requieren que los programadores conviertan explícitamente un tipo
en otro, deben tomarse las medidas adecuadas para impedir que se produzcan resultados imprevistos. En general, los
operadores de conversión implícita nunca deberían producir excepciones ni pérdida de información, de modo que puedan
utilizarse de forma segura sin intervención del programador. Si un operador de conversión no cumple esos criterios, debería
marcarse como explicit. Para obtener más información, vea Utilizar operadores de conversión (Guía de programación de C#).

Especificación del lenguaje C#


Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.
6.1 Conversiones implícitas
10.9.3 Operadores de conversión
Vea también
Tareas
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Referencia
Palabras clave de C#
explicit (Referencia de C#)
operator (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

operator (Referencia de C#)


Utilice la palabra clave operator para sobrecargar un operador integrado o proporcionar una conversión definida por el
usuario en una declaración de clase o estructura.
Ejemplo
A continuación, se muestra una clase muy simplificada para números fraccionarios. Sobrecarga los operadores + y * para
implementar la adición y multiplicación de números fraccionarios, y también proporciona un operador de conversión que
convierte un tipo Fraction en un tipo double.

// cs_keyword_operator.cs
using System;
class Fraction
{
int num, den;
public Fraction(int num, int den)
{
this.num = num;
this.den = den;
}

// overload operator +
public static Fraction operator +(Fraction a, Fraction b)
{
return new Fraction(a.num * b.den + b.num * a.den,
a.den * b.den);
}

// overload operator *
public static Fraction operator *(Fraction a, Fraction b)
{
return new Fraction(a.num * b.num, a.den * b.den);
}

// user-defined conversion from Fraction to double


public static implicit operator double(Fraction f)
{
return (double)f.num / f.den;
}
}

class Test
{
static void Main()
{
Fraction a = new Fraction(1, 2);
Fraction b = new Fraction(3, 7);
Fraction c = new Fraction(2, 3);
Console.WriteLine((double)(a * b + c));
}
}

Resultados
0.880952380952381

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.2.2 Sobrecarga de operadores
7.2.3 Resolución de sobrecarga de operador unario
7.2.4 Resolución de sobrecarga de operador binario
Vea también
Tareas
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Referencia
Palabras clave de C#
implicit (Referencia de C#)
explicit (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave de acceso (Referencia de C#)


Esta sección presenta las siguientes palabras clave de acceso:
base
Obtiene acceso a los miembros de la clase base.
this
Hace referencia a la instancia actual de la clase.
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

base (Referencia de C#)


La palabra clave base se utiliza para obtener acceso a los miembros de la clase base desde una clase derivada:
Realice una llamada a un método de la clase base reemplazado por otro método.
Especifique a qué constructor de la clase base se debe llamar para crear instancias de la clase derivada.
El acceso a una clase base sólo se permite en un constructor, en un método de instancia o en un descriptor de acceso a una
propiedad de instancia.
Es incorrecto utilizar la palabra clave base desde dentro de un método estático.
Ejemplo
En este ejemplo, tanto la clase base, Person, como la clase derivada, Employee, poseen un método denominado Getinfo.
Mediante la palabra clave base, se puede realizar una llamada al método Getinfo de la clase base desde la clase derivada.

// keywords_base.cs
// Accessing base class members
using System;
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";

public virtual void GetInfo()


{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}

Este ejemplo muestra cómo especificar el constructor de la clase base al que se realiza la llamada cuando se crean instancias
de una clase derivada.

// keywords_base2.cs
using System;
public class BaseClass
{
int num;

public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}

public int GetNum()


{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}

// This constructor will call BaseClass.BaseClass(int i)


public DerivedClass(int i) : base(i)
{
}

static void Main()


{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}

Resultados
Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG

Para obtener más ejemplos, vea new, virtual y override.


Resultados
in BaseClass()
in BaseClass(int i)

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.3 Clases base
7.5.8 Acceso base
Vea también
Referencia
Palabras clave de C#
this (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

this (Referencia de C#)


La palabra clave this hace referencia a la instancia actual de la clase.
A continuación, se indican algunos usos comunes de this:
Obtener acceso a miembros con el fin de evitar ambigüedades con nombres similares, por ejemplo:

public Employee(string name, string alias)


{
this.name = name;
this.alias = alias;
}

Pasar un objeto como parámetro a otros métodos, por ejemplo, para:

CalcTax(this);

Declarar indizadores, por ejemplo:

public int this [int param]


{
get { return array[param]; }
set { array[param] = value; }
}

Debido a que las funciones miembro estáticas existen en el nivel de clase y no como parte de un objeto, no tienen un puntero
this. Es un error hacer referencia a this en un método estático.
Ejemplo
En este ejemplo, this se utiliza para calificar los miembros de la clase Employee, name y alias, que presentan ambigüedad con
nombres similares. También se utiliza para pasar un objeto al método CalcTax, el cual pertenece a otra clase.

// keywords_this.cs
// this example
using System;
class Employee
{
private string name;
private string alias;
private decimal salary = 3000.00m;

// Constructor:
public Employee(string name, string alias)
{
// Use this to qualify the fields, name and alias:
this.name = name;
this.alias = alias;
}

// Printing method:
public void printEmployee()
{
Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);
// Passing the object to the CalcTax method by using this:
Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));
}

public decimal Salary


{
get { return salary; }
}
}
class Tax
{
public static decimal CalcTax(Employee E)
{
return 0.08m * E.Salary;
}
}

class MainClass
{
static void Main()
{
// Create objects:
Employee E1 = new Employee("John M. Trainer", "jtrainer");
// Display results:
E1.printEmployee();
}
}

Resultados
Name: John M. Trainer
Alias: jtrainer
Taxes: $240.00

Para obtener más ejemplos, vea class y struct.


Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.5.7 Acceso a this
10.2.6.4 Acceso a this
Vea también
Referencia
Palabras clave de C#
base (Referencia de C#)
Métodos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave de literales (Referencia de C#)


C# dispone de las siguientes palabras clave para literales:
null
true
false
default
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

null (Referencia de C#)


La palabra clave null es un literal que representa una referencia null, es decir, una referencia que no apunta a ningún objeto.
null es el valor predeterminado de las variables de tipo de referencia.
C# 2.0 introduce tipos que aceptan valores NULL, que son tipos de datos que se pueden establecer en un valor indefinido. Vea
Tipos que aceptan valores NULL (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
2.4.4.6 El literal null
Vea también
Referencia
Palabras clave de C#
Palabras clave de literales (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Tabla de valores predeterminados (Referencia de C#)
Referencia del lenguaje C#

true (Referencia de C#)


Se utiliza como un operador sobrecargado o como un literal:
true (Operador)
true (Literal)
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

false (Referencia de C#)


Se utiliza como un operador sobrecargado o como un literal:
false (Operador)
false (Literal)
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

default (Referencia de C#)


Palabra clave default.
La palabra clave default se puede utilizar en la instrucción switch o en código genérico:
Instrucción switch: Especifica la etiqueta predeterminada.
Código genérico: Especifica el valor predeterminado del parámetro de tipo. Éste será null para los tipos de referencia y
cero para los tipos de valor.
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Palabras clave contextuales (Referencia de C#)


Las palabras clave contextuales se utilizan para proporcionar un significado concreto en el código, sin embargo no son
palabras reservadas de C#. En esta sección se describen las siguientes palabras clave contextuales:
get Define un método de descriptor de acceso para una propiedad o un indizador.
partial Define clases parciales, estructuras e interfaces a lo largo de la misma unidad de compilación.
set Define un método de descriptor de acceso para una propiedad o un indizador.
where Agrega restricciones a una declaración genérica.
yield Se utiliza en un bloque de iteradores para devolver un valor al objeto de enumerador o también para señalar el final de
iteración.
value Se utiliza para establecer los descriptores de acceso y para agregar o quitar los controladores de eventos.
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

get (Referencia de C#)


Define un método de descriptor de acceso en una propiedad o indizador que recupera el valor de la propiedad o el elemento
del indizador. Vea Propiedades (Guía de programación de C#) e Indizadores (Guía de programación de C#) para obtener más
información.
Éste es un ejemplo de un descriptor de acceso get para una propiedad denominada Seconds:

class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.2 Propiedades
10.6.2 Descriptores de acceso
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

partial (Referencia de C#)


Las definiciones de tipo parcial permiten dividir la definición de una clase, estructura o interfaz en varios archivos.
En Archivo1.cs:

namespace PC
{
partial class A { }
}

En Archivo2.cs:

namespace PC
{
partial class A { }
}

Comentarios
Dividir una clase, estructura o tipo de interfaz en varios archivos puede ser útil al trabajar con proyectos grandes o código
generado automáticamente como el que proporciona el Diseñador de Windows Forms. Para obtener más información, vea
Definiciones de clase parciales (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
19.4 Tipos parciales
23 tipos parciales
Vea también
Referencia
Modificadores (Referencia de C#)
Introducción a los genéricos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

set (Referencia de C#)


Define un método de descriptor de acceso en una propiedad o indizador que estableció el valor de la propiedad o el elemento
del indizador. Vea Propiedades e Indizadores para obtener más información.
Éste es un ejemplo de un descriptor de acceso set para una propiedad denominada Seconds:

class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.2 Propiedades
10.6.2 Descriptores de acceso
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

value (Referencia de C#)


El parámetro implícito value se usa para configurar descriptores de acceso y para agregar o eliminar controladores de
eventos.
Para obtener más información acerca del uso de value, vea event (Referencia de C#) y
Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.2 Propiedades
10.6.2 Descriptores de acceso
Vea también
Referencia
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

where (Referencia de C#)


La cláusula where se utiliza para especificar restricciones sobre los tipos que se pueden utilizar como argumentos para un
parámetro de tipo definido en una declaración genérica. Por ejemplo, puede declarar una clase genérica, MyGenericClass, de
modo que el parámetro de tipo T implemente la interfaz IComparable<T>:

public class MyGenericClass<T> where T:IComparable { }

Además de las restricciones de interfaz, una cláusula where puede incluir una restricción de clase base, que establece que un
tipo debe tener la clase especificada como clase base (o ser la propia clase) para poder utilizarlo como argumento de tipo para
ese tipo genérico. Si se utiliza una restricción semejante, debe aparecer antes que cualquier otra restricción sobre ese
parámetro de tipo.

// cs_where.cs
// compile with: /target:library
using System;

class MyClassy<T, U>


where T : class
where U : struct
{
}

La cláusula where también puede incluir una restricción de constructor. Es posible crear una instancia de un parámetro de tipo
utilizando el operador new; sin embargo, para ello el parámetro de tipo debe estar restringido por la restricción de constructor,
new(). La restricción new() permite que el compilador sepa que cualquier argumento de tipo que se proporcione debe tener
un constructor sin parámetros accesible, o predeterminado. Por ejemplo:

// cs_where_2.cs
// compile with: /target:library
using System;
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}

La restricción new() aparece en último lugar en la cláusula where.


Con varios parámetros de tipo, utilice una cláusula where para cada parámetro de tipo, por ejemplo:

// cs_where_3.cs
// compile with: /target:library
using System;
using System.Collections;

interface MyI
{
}

class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
public void Add(TKey key, TVal val)
{
}
}

También puede adjuntar restricciones a parámetros de tipo de métodos genéricos, como el siguiente:
public bool MyMethod<T>(T t) where T : IMyInterface { }

Observe que la sintaxis para describir las restricciones de parámetros de tipo en delegados es igual que la sintaxis de métodos.

delegate T MyDelegate<T>() where T : new()

Para obtener información sobre delegados genéricos, vea Delegados genéricos (Guía de programación de C#).
Para obtener información detallada sobre la sintaxis y el uso de restricciones, vea
Restricciones de tipos de parámetros (Guía de programación de C#).
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
19.1.4 Restricciones
Vea también
Referencia
Introducción a los genéricos (Guía de programación de C#)
Restricción new (Referencia de C#)
Restricciones de tipos de parámetros (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

yield (Referencia de C#)


Se utiliza en un bloque iterator para proporcionar un valor al objeto enumerador o señalar el fin de la iteración. Presenta una
de las siguientes formas:

yield return <expression>;


yield break;

Comentarios
La expresión se evalúa y se devuelve como valor al objeto enumerador; expression se debe poder convertir implícitamente al
tipo yield del iterador.
La instrucción yield sólo puede aparecer dentro de un bloque iterator que podría utilizarse como cuerpo de un método,
operador o descriptor de acceso. El cuerpo de dicho método, operador o descriptor de acceso se controla mediante las
siguientes restricciones:
No se permiten bloques unsafe.
Los parámetros del método, operador o descriptor de acceso no pueden ser ref ni out.
Una instrucción yield no puede aparecer en un método anónimo. Para obtener más información, vea
Métodos anónimos (Guía de programación de C#).
Cuando se utiliza con expression, una instrucción yield return no puede aparecer en un bloque catch ni en un bloque try que
tengan una o más cláusulas catch. Para obtener más información, vea
Instrucciones para el control de excepciones (Referencia de C#).
Ejemplo
En el siguiente ejemplo, la instrucción yield se utiliza dentro de un bloque de iteradores, que es el método Power(int number,
int power). Cuando se invoca al método Power, este devuelve un objeto enumerable que contiene las potencias de un
número. Observe que el tipo de valor devuelto del método Power es IEnumerable, un tipo de interfaz de iteradores.

// yield-example.cs
using System;
using System.Collections;
public class List
{
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
}

Resultados
2 4 8 16 32 64 128 256

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
19.3 Iteradores
22 Iteradores
Vea también
Referencia
foreach, in (Referencia de C#)
Utilizar iteradores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operadores de C#
C# proporciona un amplio conjunto de operadores, que son símbolos que especifican las operaciones que se deben realizar en
una expresión. Generalmente se permiten en las enumeraciones las operaciones de tipos integrales como ==, !=, <, >, <=, >=,
binary +, binary -, ^, &, |, ~, ++, -- y sizeof(). Además, el usuario puede sobrecargar muchos de los operadores, es decir,
cambiar su significado al aplicarlos a un tipo definido por el usuario.
En la tabla siguiente se muestran los operadores de C# agrupados por orden de prioridad. Los operadores dentro de cada de
grupo tienen la misma prioridad.
Categorías Operadores
Principal x.y
f(x)
a[x]
x++
x--
new
typeof
checked
unchecked
->

Unario +
-
!
~
++x
--x
(T)x
true
false
&
sizeof

Multiplicativo *
/
%

Sumatorio +
-

Desplazamiento <<
>>
Comprobación de tipos y relacionales <
>
<=
>=
is
as

Igualdad ==
!=

AND lógico &

XOR lógico ^

OR lógico |

AND condicional &&

OR condicional ||

Condicional ?:

Asignación =
+=
-=
*=
/=
%=
&=
|=
^=
<<=
>>=
??
Desbordamiento aritmético
Los operadores aritméticos (+, -, *, /) pueden producir resultados fuera del intervalo de valores posibles para el tipo numérico
implicado. Aunque para encontrar información detallada, debe consultar la sección acerca del operador específico; en general,
podemos decir:
El desbordamiento aritmético de enteros produce una excepción de desbordamiento (OverflowException) o bien elimina
los bits más significativos del resultado. La división de enteros por cero siempre produce una excepción
DivideByZeroException.
El desbordamiento aritmético o la división por cero en punto flotante no producen una excepción, ya que los tipos de
punto flotante se basan en el estándar IEEE 754, que proporciona una representación para los valores infinito y NaN (Not
a Number, no es un número).
El desbordamiento aritmético de valores de tipo decimal siempre produce una excepción OverflowException. La
división de decimales por cero siempre produce una excepción DivideByZeroException.
Cuando se produce un desbordamiento de enteros, lo que ocurre depende del contexto de la ejecución, el cual puede ser
checked o unchecked. En un contexto checked (comprobado), se produce una excepción OverflowException. En un contexto
unchecked (no comprobado), los bits más significativos del resultado no se tienen en cuenta y la ejecución continúa. De esta
forma, C# permite elegir entre atender o desatender el desbordamiento.
Además de los operadores aritméticos, las conversiones entre tipos integrales también pueden producir desbordamiento; por
ejemplo, al convertir un tipo long en un tipo int, y están sometidas al tipo de ejecución checked o unchecked. Sin embargo, los
operadores bit a bit y los operadores de desplazamiento nunca producen desbordamiento.
Vea también
Tareas
Ejemplo Operator Overloading
Referencia
Operadores sobrecargables (Guía de programación de C#)
Palabras clave de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Visual C#
Referencia del lenguaje C#

Operador [] (Referencia de C#)


Los corchetes ([]) se utilizan para matrices, indizadores y atributos. También se pueden utilizar con punteros.
Comentarios
Un tipo de matriz es un tipo seguido de []:

int[] fib; // fib is of type int[], "array of int"


fib = new int[100]; // create a 100-element int array

Para obtener acceso a un elemento de la matriz, el índice del elemento deseado se encierra entre corchetes:

fib[0] = fib[1] = 1;
for( int i=2; i<100; ++i ) fib[i] = fib[i-1] + fib[i-2];

Se produce una excepción si el índice de la matriz está fuera del intervalo declarado.
El operador de indización de la matriz no se puede sobrecargar; no obstante, los tipos pueden definir indizadores y
propiedades que aceptan uno o varios parámetros. Los parámetros de un indizador van entre corchetes, como los índices de
una matriz, pero se pueden declarar de cualquier tipo, a diferencia de los índices de una matriz, que sólo pueden ser de tipo
integral.
Por ejemplo, .NET Framework define un tipo Hashtable que asocia claves y valores de tipo arbitrario:

Collections.Hashtable h = new Collections.Hashtable();


h["a"] = 123; // note: using a string as the index

Los corchetes también se utilizan para especificar Atributos (Guía de programación de C#):

[attribute(AllowMultiple=true)]
public class Attr
{
}

Puede utilizar los corchetes para indizar fuera de un puntero:

unsafe fixed ( int* p = fib ) // p points to fib from earlier example


{
p[0] = p[1] = 1;
for( int i=2; i<100; ++i ) p[i] = p[i-1] + p[i-2];
}

No obstante, tenga en cuenta que no se realiza una comprobación de los límites del índice.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.5 Operadores
7.2 Operadores
Vea también
Referencia
Operadores de C#
Indizadores (Guía de programación de C#)
unsafe (Referencia de C#)
fixed (Instrucción, Referencia de C#)
Conceptos
Guía de programación de C#
Matrices (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador () (Referencia de C#)


Además de su uso para especificar el orden de las operaciones en una expresión, los paréntesis se utilizan para especificar
conversiones de tipo explícitas:

double x = 1234.7;
int a;
a = (int)x; // cast double to int

Comentarios
Una conversión de tipos invoca explícitamente el operador de conversión de un tipo a otro; se producirá un error en la
conversión si no se ha definido ese operador. Para definir un operador de conversión, vea explicit (Referencia de C#) e
implicit (Referencia de C#).
El operador () no se puede sobrecargar.
Para obtener más información, vea Conversión (Guía de programación de C#).
Una expresión de conversión de tipos puede llevar a una sintaxis ambigua. Por ejemplo, la expresión (x)–y puede interpretarse
como una expresión de conversión de tipos (una conversión del tipo –y al tipo x) o como una expresión de suma combinada
con una expresión entre paréntesis, que calcula el valor de x – y.
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.5 Operadores
7.2 Operadores
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador . (Referencia de C#)


El operador de punto (.) se utiliza para el acceso a miembros. El operador de punto especifica un miembro de un tipo o espacio
de nombres. Por ejemplo, el operador de punto se utiliza para tener acceso a métodos específicos dentro de las bibliotecas de
clases de .NET Framework:

// The class Console in namespace System:


System.Console.WriteLine("hello");

Comentarios
Por ejemplo, considere la siguiente clase:

class Simple
{
public int a;
public void b()
{
}
}
Simple s = new Simple();

La variable s tiene dos miembros, a y b; para tener acceso a ellos, use el operador de punto:

s.a = 6; // assign to field a;


s.b(); // invoke member function b;

El punto también se utiliza para formar nombres completos, que son nombres que especifican el espacio de nombres o la
interfaz, por ejemplo, a la que pertenecen.

// The class Console in namespace System:


System.Console.WriteLine("hello");

La directiva using hace que la calificación de nombres sea opcional en algunos casos:

using System;
// ...
System.Console.WriteLine("hello");
Console.WriteLine("hello"); // same thing

Sin embargo, un identificador ambiguo debe calificarse:

using System;
// A namespace containing another Console class:
using OtherSystem;
// ...
// Must qualify Console:
System.Console.WriteLine( "hello" );

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.5.4 Acceso a miembros
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador :: (Referencia de C#)


Operador calificador de alias de espacio de nombres.
El calificador de alias de espacio de nombres (::) se utiliza para buscar identificadores. Siempre aparece entre dos
identificadores, como en este ejemplo:

global::System.Console.WriteLine("Hello World");

Comentarios
El calificador de alias de espacio de nombres puede ser global. Éste invoca una búsqueda del espacio de nombres global, en
lugar de un espacio de nombres con alias.
Para obtener más información
Para obtener un ejemplo de uso del operador ::, vea la siguiente sección:
Cómo: Utilizar el calificador de alias del espacio de nombres (Guía de programación de C#)
Especificación del lenguaje C#
Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
20.9.5 Nombres sencillos
25.3 Calificadores de alias del espacio de nombres
Vea también
Referencia
Operadores de C#
Palabras clave del espacio de nombres (Referencia de C#)
Operador . (Referencia de C#)
alias externo (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador + (Referencia de C#)


El operador + puede funcionar como operador unario o binario.
Comentarios
Los operadores unarios + se encuentran predefinidos para todos los tipos numéricos. El resultado de una operación unaria +
aplicada a un tipo numérico es simplemente el valor del operando.
Los operadores + binarios se encuentran predefinidos para los tipos numéricos y de cadena. Para tipos numéricos, + calcula la
suma de sus dos operandos. Cuando al menos uno de los operandos es de tipo string, + concatena las representaciones de
tipo string de los operandos.
Los tipos delegados también proporcionan un operador binario +, el cual realiza la concatenación de delegados.
Los tipos definidos por el usuario pueden sobrecargar los operadores unario y binario + (vea operator (Referencia de C#)). Las
operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_plus.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(+5); // unary plus
Console.WriteLine(5 + 5); // addition
Console.WriteLine(5 + .5); // addition
Console.WriteLine("5" + "5"); // string concatenation
Console.WriteLine(5.0 + "5"); // string concatenation
// note automatic conversion from double to string
}
}

Resultados
5
10
5.5
55
55

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.5 Operadores
7.2 Operadores
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador - (Referencia de C#)


El operador - puede funcionar como operador unario o binario.
Comentarios
Los operadores unarios - se encuentran predefinidos para todos los tipos numéricos. El resultado de una operación unaria -
aplicada a un tipo numérico es la negación numérica del operando.
Los operadores binarios - están predefinidos para todos los tipos numéricos y de enumeración de modo que restan el
segundo operando del primero.
Los tipos delegados también proporcionan un operador binario -, el cual realiza la eliminación de delegados.
Los tipos definidos por el usuario pueden sobrecargar los operadores unario y binario -. Para obtener más información, vea
operador.
Ejemplo
// cs_operator_minus.cs
using System;
class MainClass
{
static void Main()
{
int a = 5;
Console.WriteLine(-a);
Console.WriteLine(a - 1);
Console.WriteLine(a - .5);
}
}

Resultados
-5
4
4.5

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
1.6.6.5 Operadores
7.2 Operadores
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador * (Referencia de C#)


Operador de multiplicación (*) que calcula el producto de sus operandos. Además, operador de eliminación de referencias que
permite leer y escribir en un puntero.
Comentarios
Todos los tipos numéricos poseen operadores de multiplicación predefinidos.
El operador * también se utiliza para declarar los tipos de puntero y para eliminar referencias de los punteros. Este operador
sólo se puede utilizar en contextos no seguros, indicados por el uso de la palabra clave unsafe, y que requieren la opción del
compilador /unsafe. El operador de eliminación de referencias también se conoce como el operador de direccionamiento
indirecto.
Los tipos definidos por el usuario pueden sobrecargar el operador binario * (vea operator (Referencia de C#)). Cuando se
sobrecarga un operador binario, el operador de asignación correspondiente, si existe, también se sobrecarga de modo
implícito.
Ejemplo
// cs_operator_mult.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(5 * 2);
Console.WriteLine(-.5 * .2);
Console.WriteLine(-.5m * .2m); // decimal type
}
}

Resultados
10
-0.1
-0.10

// cs_operator_ptr.cs
// compile with: /unsafe
public class MainClass
{
unsafe static void Main()
{
int i = 5;
int* j = &i;
System.Console.WriteLine(*j);
}
}

Resultados
5

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Código no seguro y punteros (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador / (Referencia de C#)


El operador de división (/) permite dividir el primer operando por el segundo. Todos los tipos numéricos poseen operadores
de división predefinidos.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador / (vea operador). Si se sobrecarga el operador /, se
sobrecarga implícitamente el operador /=.
Ejemplo
// cs_operator_division.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(-5/2);
Console.WriteLine(-5.0/2);
}
}

Resultados
-2
-2.5

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador % (Referencia de C#)


El operador de módulo (%) calcula el resto de dividir su primer operando por el segundo. Todos los tipos numéricos poseen
operadores de módulo predefinidos.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador % (vea operador). Cuando se sobrecarga un operador
binario, el operador correspondiente de asignación (si existe) también se sobrecarga de modo implícito.
Ejemplo
// cs_operator_modulus.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(5 % 2); // int
Console.WriteLine(-5 % 2); // int
Console.WriteLine(5.0 % 2.2); // double
Console.WriteLine(5.0m % 2.2m); // decimal
Console.WriteLine(-5.2 % 2.0); // double
}
}

Resultados
1
-1
0.6
0.6
-1.2

Comentarios
Observe los errores de redondeo que presenta el tipo double.
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador & (Referencia de C#)


El operador & puede funcionar como operador unario o binario.
Comentarios
El operador & unario devuelve la dirección de memoria de su operando (requiere un contexto unsafe).
Los operadores & binarios están predefinidos para los tipos integrales y bool. Para tipos integrales, & calcula la operación
AND bit a bit lógica de sus operandos. Para operandos de tipo bool, & calcula la operación lógica AND de sus operandos; es
decir, el resultado es true si, y sólo si ambos operandos son true.
El operador & evalúa ambos operadores sin tener en cuenta el valor del primero. Por ejemplo:

int i = 0;
if (false & ++i == 1)
{
// i is incremented, but the conditional
// expression evaluates to false, so
// this block does not execute.
}

Los tipos definidos por el usuario pueden sobrecargar el operador binario & (vea operator (Referencia de C#)). Las
operaciones en tipos integrales se suelen permitir en enumeraciones. Cuando se sobrecarga un operador binario, el operador
de asignación correspondiente, si existe, también se sobrecarga de modo implícito.
Ejemplo
// cs_operator_ampersand.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(true & false); // logical and
Console.WriteLine(true & true); // logical and
Console.WriteLine("0x{0:x}", 0xf8 & 0x3f); // bitwise and
}
}

Resultados
False
True
0x38

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador | (Referencia de C#)


Los operadores binarios | están predefinidos para tipos integrales y bool. Para los tipos integrales, | calcula la operación OR bit
a bit de sus operandos. Para operandos de tipo bool, | calcula la operación lógica OR de sus operandos; es decir, el resultado
es false si, y sólo si, ambos operandos son false.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador | (vea operador).
Ejemplo
// cs_operator_OR.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(true | false); // logical or
Console.WriteLine(false | false); // logical or
Console.WriteLine("0x{0:x}", 0xf8 | 0x3f); // bitwise or
}
}

Resultados
True
False
0xff

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ^ (Referencia de C#)


Los operadores binarios ^ están predefinidos para tipos integrales y bool. Para los tipos integrales, ^ calcula la operación OR
exclusiva bit a bit de sus operandos. Para los operandos bool, ^ calcula la operación OR exclusiva lógica de sus operandos; es
decir, el resultado es true si, y sólo si, exactamente uno de sus operandos es true.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador ^ (vea operador). Las operaciones en tipos integrales se
suelen permitir en enumeraciones.
Ejemplo
// cs_operator_bitwise_OR.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(true ^ false); // logical exclusive-or
Console.WriteLine(false ^ false); // logical exclusive-or
// Bitwise exclusive-or:
Console.WriteLine("0x{0:x}", 0xf8 ^ 0x3f);
}
}

Resultados
True
False
0xc7

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ! (Referencia de C#)


El operador lógico de negación (!) es un operador unario que niega su operando. Está definido para el tipo bool y devuelve
true si, y sólo si, su operando es false.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador ! (vea operador).
Ejemplo
// cs_operator_negation.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(!true);
Console.WriteLine(!false);
}
}

Resultados
False
True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ~ (Referencia de C#)


El operador ~ realiza una operación de complemento bit a bit en su operando, lo que tiene el efecto de invertir cada bit. Los
operadores de complemento bit a bit están predefinidos para int, uint, long y ulong.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador ~ Para obtener más información, vea
operator (Referencia de C#)). Las operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_bitwise_compl.cs
using System;
class MainClass
{
static void Main()
{
int[] values = { 0, 0x111, 0xfffff, 0x8888, 0x22000022};
foreach (int v in values)
{
Console.WriteLine("~0x{0:x8} = 0x{1:x8}", v, ~v);
}
}
}

Resultados
~0x00000000 = 0xffffffff
~0x00000111 = 0xfffffeee
~0x000fffff = 0xfff00000
~0x00008888 = 0xffff7777
~0x22000022 = 0xddffffdd

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador = (Referencia de C#)


El operador de asignación (=) almacena el valor del operando situado a su derecha en la ubicación de almacenamiento,
propiedad o indizador indicados por el operando situado a su izquierda y devuelve el valor como resultado. Los operandos
deben ser del mismo tipo (o el operando de la derecha se debe poder convertir implícitamente al tipo del operando de la
izquierda).
Comentarios
El operador de asignación no se puede sobrecargar.
Ejemplo
// cs_operator_assignment.cs
using System;
class MainClass
{
static void Main()
{
double x;
int i;
i = 5; // int to int assignment
x = i; // implicit conversion from int to double
i = (int)x; // needs cast
Console.WriteLine("i is {0}, x is {1}", i, x);
object obj = i;
Console.WriteLine("boxed value = {0}, type is {1}",
obj, obj.GetType());
i = (int)obj;
Console.WriteLine("unboxed: {0}", i);
}
}

Resultados
i is 5, x is 5
boxed value = 5, type is System.Int32
unboxed: 5

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador < (Referencia de C#)


Todos los tipos numéricos y de enumeración definen un operador relacional "menor que" (<) que devuelve true si el primer
operando es menor que el segundo y false en caso contrario.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador < (vea operador). Si se sobrecarga <, también se debe
sobrecargar >. Cuando se sobrecarga un operador binario, el operador correspondiente de asignación (si existe) también se
sobrecarga de modo implícito.
Ejemplo
// cs_operator_less_than.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(1 < 1.1);
Console.WriteLine(1.1 < 1.1);
}
}

Resultados
True
False

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador > (Referencia de C#)


Todos los tipos numéricos y de enumeración definen un operador relacional "mayor que" (>) que devuelve true si el primer
operando es mayor que el segundo y false en caso contrario.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador > (vea operador). Si se sobrecarga >, también se debe
sobrecargar <. Cuando se sobrecarga un operador binario, el operador correspondiente de asignación (si existe) también se
sobrecarga de modo implícito.
Ejemplo
// cs_operator_greater_than.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(1.1 > 1);
Console.WriteLine(1.1 > 1.1);
}
}

Resultados
True
False

Vea también
Referencia
Operadores de C#
explicit (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ?: (Referencia de C#)


El operador condicional (?:) devuelve uno de dos valores según el valor de una expresión booleana. El operador condicional
tiene el formato

condition ? first_expression : second_expression;

Comentarios
Si la condición es true, se evalúa la primera expresión y se convierte en el resultado; si es false, se evalúa la segunda expresión
y se convierte en el resultado. Sólo se evalúa una de las dos expresiones.
Los cálculos que, en cualquier otro caso, podrían requerir un bloque de decisión if-else se pueden expresar más concisa y
elegantemente mediante el operador condicional. Por ejemplo, para evitar una división por cero en el cálculo de la función sin,
podría escribirse

if(x != 0.0) s = Math.Sin(x)/x; else s = 1.0;

o bien, con el operador condicional,

s = x != 0.0 ? Math.Sin(x)/x : 1.0;

El operador condicional es asociativo por la derecha, de modo que una expresión de la forma:

a ? b : c ? d : e

se evalúa como

a ? b : (c ? d : e)

y no como

(a ? b : c) ? d : e

El operador condicional no se puede sobrecargar.


Ejemplo
// cs_operator_conditional.cs
using System;
class MainClass
{
static double sinc(double x)
{
return x != 0.0 ? Math.Sin(x)/x : 1.0;
}

static void Main()


{
Console.WriteLine(sinc(0.2));
Console.WriteLine(sinc(0.1));
Console.WriteLine(sinc(0.0));
}
}

Resultados
0.993346653975306
0.998334166468282
1
Vea también
Referencia
Operadores de C#
if-else (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ++ (Referencia de C#)


El operador de incremento (++) incrementa su operando en 1. El operador de incremento puede aparecer antes o después de
su operando:
Comentarios
La primera forma es una operación de incremento prefijo. El resultado de la operación es el valor del operando después de
haber sido incrementado.
La segunda forma es una operación de incremento postfijo. El resultado de la operación es el valor del operando antes de
haber sido incrementado.
Los tipos numéricos y de enumeración poseen operadores de incremento predefinidos. Los tipos definidos por el usuario
pueden sobrecargar el operador ++ Las operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_increment.cs
using System;
class MainClass
{
static void Main()
{
double x;
x = 1.5;
Console.WriteLine(++x);
x = 1.5;
Console.WriteLine(x++);
Console.WriteLine(x);
}
}

Resultados
2.5
1.5
2.5

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador -- (Referencia de C#)


El operador de disminución (--) disminuye su operando en 1. El operador de disminución puede aparecer antes o después de
su operando: --variable y variable--. La primera forma es una operación de decremento prefijo. El resultado de la operación
es el valor del operando "después" de haber sido decrementado. La segunda forma es una operación de decremento postfijo.
El resultado de la operación es el valor del operando "antes" de haber sido decrementado.
Comentarios
Los tipos numéricos y de enumeración poseen operadores de decremento predefinidos.
Los tipos definidos por el usuario pueden sobrecargar el operador -- (vea operador). Las operaciones en tipos integrales se
suelen permitir en enumeraciones.
Ejemplo
// cs_operator_decrement.cs
using System;
class MainClass
{
static void Main()
{
double x;
x = 1.5;
Console.WriteLine(--x);
x = 1.5;
Console.WriteLine(x--);
Console.WriteLine(x);
}
}

Resultados
0.5
1.5
0.5

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador && (Referencia de C#)


El operador AND condicional (&&) realiza una operación lógica AND de sus operandos de tipo bool, pero sólo evalúa su
segundo operando si es necesario.
Comentarios
La operación

x && y

se corresponde con la operación

x & y

excepto que si x es false, y no se evalúa (ya que el resultado de la operación AND será false independientemente del valor de
y ). Esto se conoce como evaluación "cortocircuitada".

El operador AND condicional no se puede sobrecargar, pero las sobrecargas de los operadores lógicos normales y los
operadores true y false también se consideran, con ciertas restricciones, sobrecargas de los operadores lógicos condicionales.
Ejemplo
En el siguiente ejemplo, observe que la expresión que utiliza && sólo evalúa el primer operando.

// cs_operator_logical_and.cs
using System;
class MainClass
{
static bool Method1()
{
Console.WriteLine("Method1 called");
return false;
}

static bool Method2()


{
Console.WriteLine("Method2 called");
return true;
}
static void Main()
{
Console.WriteLine("regular AND:");
Console.WriteLine("result is {0}", Method1() & Method2());
Console.WriteLine("short-circuit AND:");
Console.WriteLine("result is {0}", Method1() && Method2());
}
}

Resultados
regular AND:
Method1 called
Method2 called
result is False
short-circuit AND:
Method1 called
result is False

Especificación del lenguaje C#


Para obtener más información, vea las secciones siguientes de Especificación del lenguaje C#.
7.11.2 Operadores lógicos condicionales definidos por el usuario
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador || (Referencia de C#)


El operador OR condicional (||) realiza una operación lógica OR de sus operandos de tipo bool, pero sólo evalúa su segundo
operando si es necesario.
Comentarios
La operación

x || y

se corresponde con la operación

x | y

salvo que si x es true, y no se evalúa (ya que el resultado de la operación OR será true independientemente del valor de y).
Esto se conoce como evaluación "cortocircuitada".
El operador OR condicional no se puede sobrecargar, pero las sobrecargas de los operadores lógicos normales y los
operadores true y false se consideran también, con ciertas restricciones, sobrecargas de los operadores lógicos condicionales.
Ejemplo
En el siguiente ejemplo, observe que la expresión que utiliza || sólo evalúa el primer operando.

// cs_operator_short_circuit_OR.cs
using System;
class MainClass
{
static bool Method1()
{
Console.WriteLine("Method1 called");
return true;
}

static bool Method2()


{
Console.WriteLine("Method2 called");
return false;
}
static void Main()
{
Console.WriteLine("regular OR:");
Console.WriteLine("result is {0}", Method1() | Method2());
Console.WriteLine("short-circuit OR:");
Console.WriteLine("result is {0}", Method1() || Method2());
}
}

Resultados
regular OR:
Method1 called
Method2 called
result is True
short-circuit OR:
Method1 called
result is True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador << (Referencia de C#)


El operador de desplazamiento a la izquierda (<<) desplaza su primer operando a la izquierda el número de bits especificado
por su segundo operando. El tipo del segundo operando debe ser int.
Comentarios
Si el primer operando es int o uint (cantidad de 32 bits), los cinco bits de orden inferior del segundo operando proporcionan el
valor de desplazamiento.
Si el primer operando es long o ulong (cantidad de 64 bits), los seis bits de orden inferior del segundo operando proporcionan
el valor de desplazamiento.
Los bits de orden superior del primer operando se descartan y los bits vacíos de orden inferior se rellenan con ceros. Las
operaciones de desplazamiento nunca producen desbordamientos.
Los tipos definidos por el usuario pueden sobrecargar el operador << (vea operator (Referencia de C#)); el tipo del primer
operando debe ser el tipo definido por el usuario, mientras que el tipo del segundo operando debe ser int. Cuando se
sobrecarga un operador binario, el operador correspondiente de asignación, si existe, también se sobrecarga de modo
implícito.
Ejemplo
// cs_operator_left_shift.cs
using System;
class MainClass
{
static void Main()
{
int i = 1;
long lg = 1;
Console.WriteLine("0x{0:x}", i << 1);
Console.WriteLine("0x{0:x}", i << 33);
Console.WriteLine("0x{0:x}", lg << 33);
}
}

Resultados
0x2
0x2
0x200000000

Comentarios
Observe que i<<1 e i<<33 dan el mismo resultado, ya que 1 y 33 tienen los mismos cinco bits de orden inferior.
Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador >> (Referencia de C#)


El operador de desplazamiento a la derecha (>>) desplaza su primer operando a la derecha el número de bits especificado por
su segundo operando.
Comentarios
Si el primer operando es int o uint (cantidad de 32 bits), los cinco bits de orden inferior del segundo operando proporcionan el
valor de desplazamiento (segundo operando & 0x1f).
Si el primer operando es long o ulong (cantidad de 64 bits), los seis bits de orden inferior del segundo operando proporcionan
el valor de desplazamiento (segundo operando & 0x3f).
Si el primer operando es un tipo int o long, el desplazamiento a la derecha es un desplazamiento aritmético (los bits vacíos de
orden superior toman el bit de signo). Si el primer operando es del tipo uint o ulong, el desplazamiento a la derecha es un
desplazamiento lógico (los bits de orden superior se rellenan con ceros).
Los tipos definidos por el usuario pueden sobrecargar el operador >>; el tipo del primer operando debe ser el tipo definido
por el usuario, mientras que el tipo del segundo operando debe ser int. Para obtener más información, vea
operator (Referencia de C#)). Cuando se sobrecarga un operador binario, el operador de asignación correspondiente, si existe,
también se sobrecarga de modo implícito.
Ejemplo
// cs_operator_right_shift.cs
using System;
class MainClass
{
static void Main()
{
int i = -1000;
Console.WriteLine(i >> 3);
}
}

Resultados
-125

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador == (Referencia de C#)


Para los tipos de valores predefinidos, el operador de igualdad (==) devuelve true si los valores de sus operandos son iguales
y false en caso contrario. Para los tipos de referencia, excepto string, == devuelve true si sus dos operandos se refieren al
mismo objeto. Para el tipo string, == compara los valores de las cadenas.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador == (vea operator (Referencia de C#)). También pueden
hacerlo los tipos de referencia definidos por el usuario, aunque, de forma predeterminada, == se comporta como se ha
descrito anteriormente tanto para los tipos de referencia predefinidos como para los definidos por el usuario. Si se sobrecarga
==, también se debe sobrecargar !=. Las operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_equality.cs
using System;
class MainClass
{
static void Main()
{
// Numeric equality: True
Console.WriteLine((2 + 2) == 4);

// Reference equality: different objects,


// same boxed value: False.
object s = 1;
object t = 1;
Console.WriteLine(s == t);

// Define some strings:


string a = "hello";
string b = String.Copy(a);
string c = "hello";

// Compare string values of a constant and an instance: True


Console.WriteLine(a == b);

// Compare string references;


// a is a constant but b is an instance: False.
Console.WriteLine((object)a == (object)b);
// Compare string references, both constants
// have the same value, so string interning
// points to same reference: True.
Console.WriteLine((object)a == (object)c);
}
}

Resultados
True
False
True
False
True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador != (Referencia de C#)


El operador de desigualdad (!=) devuelve false si sus dos operandos son iguales; en caso contrario, devuelve true. Los
operadores de desigualdad están predefinidos para todos los tipos, incluidos string y object. Los tipos definidos por el usuario
pueden sobrecargar el operador !=
Comentarios
Para los tipos de valores predefinidos, el operador de desigualdad (!=) devuelve true si los valores de sus operandos son
diferentes, y false en caso contrario. Para los tipos de referencia, excepto string, != devuelve true si sus dos operandos se
refieren a objetos diferentes. Para el tipo string, != compara los valores de las cadenas.
Los tipos definidos por el usuario pueden sobrecargar el operador != (vea operator (Referencia de C#)). También pueden
hacerlo los tipos de referencia definidos por el usuario, aunque, de forma predeterminada, != se comporta como se ha descrito
anteriormente tanto para los tipos de referencia predefinidos como para los definidos por el usuario. Si se sobrecarga !=,
también se debe sobrecargar ==. Las operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_inequality.cs
using System;
class MainClass
{
static void Main()
{
// Numeric inequality:
Console.WriteLine((2 + 2) != 4);

// Reference equality: two objects, same boxed value


object s = 1;
object t = 1;
Console.WriteLine(s != t);

// String equality: same string value, same string objects


string a = "hello";
string b = "hello";

// compare string values


Console.WriteLine(a != b);

// compare string references


Console.WriteLine((object)a != (object)b);
}
}

Resultados
False
True
False
False

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador <= (Referencia de C#)


Todos los tipos numéricos y de enumeración definen un operador relacional "menor o igual que" (<=) que devuelve true si el
primer operando es menor o igual que el segundo y devuelve false en caso contrario.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador <= Para obtener más información, vea
operator (Referencia de C#)). Si se sobrecarga <=, también se debe sobrecargar >=. Las operaciones en tipos integrales se
suelen permitir en enumeraciones.
Ejemplo
// cs_operator_less_than_or_equal.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(1 <= 1.1);
Console.WriteLine(1.1 <= 1.1);
}
}

Resultados
True
True

Vea también
Referencia
Operadores de C#
explicit (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador >= (Referencia de C#)


Todos los tipos numéricos y de enumeración definen un operador relacional "mayor o igual que" (>=) que devuelve true si el
primer operando es mayor o igual que el segundo, y devuelve false en caso contrario.
Comentarios
Los tipos definidos por el usuario pueden sobrecargar el operador >= Para obtener más información, vea operador. Si se
sobrecarga >=, también se debe sobrecargar <=. Las operaciones en tipos integrales se suelen permitir en enumeraciones.
Ejemplo
// cs_operator_greater_than_or_equal.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(1.1 >= 1);
Console.WriteLine(1.1 >= 1.1);
}
}

Resultados
True
True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador += (Referencia de C#)


El operador de asignación y suma.
Comentarios
Una expresión que utiliza el operador de asignación +=, por ejemplo

x += y

equivale a

x = x + y

salvo que x sólo se evalúa una vez. El significado del operador + depende de los tipos de x e y (suma para operandos
numéricos, concatenación para operandos de tipo cadena, etc.).
El operador += no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador + (vea operator (Referencia de C#)).
El operador + = se utiliza también para especificar un método al que se llama en respuesta a un evento; estos métodos se
denominan controladores de eventos. Como los controladores de eventos se encapsulan dentro de un tipo de delegado, el uso
del operador + = en este contexto se denomina concatenación de delegados. Para obtener más información, vea
event (Referencia de C#) y Delegados (Guía de programación de C#).
Ejemplo
// cs_operator_addition_assignment.cs
using System;
class MainClass
{
static void Main()
{
//addition
int a = 5;
a += 6;
Console.WriteLine(a);
//string concatenation
string s = "Micro";
s += "soft";
Console.WriteLine(s);
}
}

Resultados
11
Microsoft

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador -= (Referencia de C#)


El operador de asignación y resta.
Comentarios
Una expresión que utiliza el operador de asignación -=, por ejemplo

x -= y

equivale a

x = x - y

salvo que x sólo se evalúa una vez. El significado del operador - depende de los tipos de x e y (resta para operandos
numéricos, eliminación delegada para operandos delegados, etc.).
El operador -= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador - (vea operador).
Ejemplo
// cs_operator_subtraction_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 5;
a -= 6;
Console.WriteLine(a);
}
}

Resultado
-1

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador *= (Referencia de C#)


El operador de asignación y multiplicación binario.
Comentarios
Una expresión que utiliza el operador de asignación *=, por ejemplo

x *= y

equivale a

x = x * y

salvo que x sólo se evalúa una vez. El operador * está predefinido con la multiplicación para tipos numéricos.
El operador *= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador * (vea operador).
Ejemplo
// cs_operator_multiplication_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 5;
a *= 6;
Console.WriteLine(a);
}
}

Resultados
30

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador /= (Referencia de C#)


El operador de asignación y división.
Comentarios
Una expresión que utiliza el operador de asignación /=, por ejemplo

x /= y

equivale a

x = x / y

salvo que x sólo se evalúa una vez. El operador / está predefinido con la división para tipos numéricos.
El operador /= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador / (vea operator (Referencia de C#)). En todos los operadores de asignación compuesta, al sobrecargar el operador
binario implícitamente se sobrecarga la asignación compuesta equivalente.
Ejemplo
// cs_operator_division_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 5;
a /= 6;
Console.WriteLine(a);
double b = 5;
b /= 6;
Console.WriteLine(b);
}
}

Resultados
0
0.833333333333333

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador %= (Referencia de C#)


El operador de asignación de módulo.
Comentarios
Una expresión que utiliza el operador de asignación %=, por ejemplo

x %= y

equivale a

x = x % y

salvo que x sólo se evalúa una vez. El operador % está predefinido en tipos numéricos para calcular el resto de la división.
El operador %= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador % (vea operator (Referencia de C#)).
Ejemplo
// cs_operator_modulus_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 5;
a %= 3;
Console.WriteLine(a);
}
}

Resultados
2

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador &= (Referencia de C#)


El operador de asignación y AND.
Comentarios
Una expresión que utiliza el operador de asignación &=, por ejemplo

x &= y

equivale a

x = x & y

salvo que x sólo se evalúa una vez. El operador & realiza una operación AND bit a bit lógica sobre operandos integrales y una
operación AND lógica sobre operandos bool.
El operador &= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador & binario (vea operator (Referencia de C#).
Ejemplo
// cs_operator_and_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 0x0c;
a &= 0x06;
Console.WriteLine("0x{0:x8}", a);
bool b = true;
b &= false;
Console.WriteLine(b);
}
}

Resultados
0x00000004
False

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador |= (Referencia de C#)


El operador de asignación OR.
Comentarios
Una expresión que utiliza el operador de asignación |=, por ejemplo

x |= y

equivale a

x = x | y

salvo que x sólo se evalúa una vez. El operador | realiza una operación lógica OR bit a bit sobre operandos integrales y una
operación lógica OR sobre operandos de tipo bool.
El operador |= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador | (vea operator (Referencia de C#).
Ejemplo
// cs_operator_or_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 0x0c;
a |= 0x06;
Console.WriteLine("0x{0:x8}", a);
bool b = true;
b |= false;
Console.WriteLine(b);
}
}

Resultados
0x0000000e
True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ^= (Referencia de C#)


El operador de asignación y OR exclusivo.
Comentarios
Una expresión de la forma

x ^= y

se evalúa como

x = x ^ y

salvo que x sólo se evalúa una vez. El operador ^ realiza una operación OR exclusiva bit a bit sobre operandos integrales y una
operación OR exclusiva lógica sobre operandos de tipo bool.
El operador ^= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador ! (vea operator (Referencia de C#)).
Ejemplo
// cs_operator_xor_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 0x0c;
a ^= 0x06;
Console.WriteLine("0x{0:x8}", a);
bool b = true;
b ^= false;
Console.WriteLine(b);
}
}

Resultados
0x0000000a
True

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador <<= (Referencia de C#)


El operador de asignación y desplazamiento a la izquierda.
Comentarios
Una expresión de la forma

x <<= y

se evalúa como

x = x << y

salvo que x sólo se evalúa una vez. El operador << desplaza x a la izquierda el número de bits especificado por y.
El operador <<= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador << (vea operador).
Ejemplo
// cs_operator_left_shift_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 1000;
a <<= 4;
Console.WriteLine(a);
}
}

Resultados
16000

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador >>= (Referencia de C#)


El operador de asignación y desplazamiento a la derecha.
Comentarios
Una expresión de la forma

x >>= y

se evalúa como

x = x >> y

salvo que x sólo se evalúa una vez. El operador >> desplaza x a la derecha el número de bits especificado por y.
El operador >>= no se puede sobrecargar directamente, pero los tipos definidos por el usuario sí pueden sobrecargar el
operador >> (vea operator (Referencia de C#)).
Ejemplo
// cs_operator_right_shift_assignment.cs
using System;
class MainClass
{
static void Main()
{
int a = 1000;
a >>= 4;
Console.WriteLine(a);
}
}

Resultados
62

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador -> (Referencia de C#)


El operador -> combina la eliminación de referencias de un puntero y el acceso a un miembro.
Comentarios
Una expresión de la forma

x->y

(donde x es un puntero de tipo T* e y es un miembro de T) equivale a

(*x).y

El operador -> sólo se puede utilizar en código no administrado.


El operador -> no se puede sobrecargar.
Ejemplo
// cs_operator_dereferencing.cs
// compile with: /unsafe
using System;
struct Point
{
public int x, y;
}

class MainClass
{
unsafe static void Main()
{
Point pt = new Point();
Point* pp = &pt;
pp->x = 123;
pp->y = 456;
Console.WriteLine ( "{0} {1}", pt.x, pt.y );
}
}

Resultados
123 456

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Operador ?? (Referencia de C#)


El operador ?? devuelve el operando izquierdo si es not-null, en los demás casos devuelve el operando derecho.
Comentarios
Un tipo que acepta valores NULL puede contener un valor o puede ser indefinido. El operador ?? define el valor
predeterminado para devolver cuando un tipo que acepta valores NULL se asigna a un tipo que no acepta valores NULL. Si
intenta asignar un tipo que acepta valores NULL a un tipo que no acepta valores NULL sin utilizar el operador ??, se generará
un error en tiempo de compilación. Si utiliza una conversión de tipos, y el tipo que acepta valores NULL se encuentra en ese
momento indefinido, se producirá una excepción InvalidOperationException.
Para obtener más información, vea Tipos que aceptan valores NULL (Guía de programación de C#).
Ejemplo
// nullable_type_operator.cs
using System;
class MainClass
{
static int? GetNullableInt()
{
return null;
}

static string GetStringValue()


{
return null;
}

static void Main()


{
// ?? operator example.
int? x = null;

// y = x, unless x is null, in which case y = -1.


int y = x ?? -1;

// Assign i to return value of method, unless


// return value is null, in which case assign
// default value of int to i.
int i = GetNullableInt() ?? default(int);

string s = GetStringValue();
// ?? also works with reference types.
// Display contents of s, unless s is null,
// in which case display "Unspecified".
Console.WriteLine(s ?? "Unspecified");
}
}

Vea también
Referencia
Operadores de C#
Conceptos
Guía de programación de C#
Tipos que aceptan valores NULL (Guía de programación de C#)
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Directivas de preprocesador de C#
Esta sección describe las directivas de preprocesador del lenguaje de C#:
#if
#else
#elif
#endif
# define
#undef
#warning
#error
#line
#region
#endregion
#pragma
#pragma warning
#pragma checksum
Aunque el compilador no dispone de un preprocesador independiente, las directivas descritas en esta sección se procesan
como si hubiera uno; estas directivas se utilizan para facilitar la compilación condicional. A diferencia de las directivas de C y
C++, no es posible utilizar estas directivas para crear macros.
Una directiva de preprocesador debe ser la única instrucción de una línea.
Vea también
Tareas
Ejemplo de métodos condicionales
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#if (Referencia de C#)


#if permite iniciar una directiva condicional que compruebe si uno o varios símbolos se evalúan o no como true. Si se evalúan
como true (se cumple la condición), el compilador incluye en la compilación todo el código comprendido entre #if y la
directiva #endif más cercana. Por ejemplo,

#define DEBUG
// ...
#if DEBUG
Console.WriteLine("Debug version");
#endif

Se pueden utilizar los operadores == (igualdad), != (desigualdad), && (y) o || (o) para evaluar varios símbolos. Es posible
agrupar símbolos y operadores mediante paréntesis.
Comentarios
#if, junto con las directivas #else, #elif, #endif, #define y #undef, permite incluir o excluir código basándose en la condición de
uno o más símbolos. Esto puede ser de gran utilidad si se compila código para una versión de depuración o para una
configuración específica.
Una directiva condicional que empieza con una directiva #if debe terminarse explícitamente con una directiva #endif.
#define permite definir un símbolo tal que, si se utiliza como expresión de la directiva #if, la expresión se evaluará como true.
También se puede definir un símbolo con la opción /define del compilador. La definición de un símbolo se puede anular
mediante la directiva #undef.
Un símbolo definido mediante /define o #define no debe entrar en conflicto con una variable del mismo nombre. Es decir, no
se debería utilizar un nombre de variable en una directiva de preprocesador ni evaluar un símbolo (constante simbólica) fuera
de una directiva de preprocesador.
El ámbito de un símbolo creado mediante #define corresponde al archivo en el que se ha definido.
Ejemplo
// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !VC_V7)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
Console.WriteLine("DEBUG and VC_V7 are defined");
#else
Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
}
}

Resultados
DEBUG and VC_V7 are defined

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#else (Referencia de C#)


#else permite crear una directiva condicional compuesta tal que, si ninguna de las expresiones de las directivas #if o #elif
(opcional) anteriores se evalúan como true, el compilador incluirá todo el código comprendido entre #else y el siguiente
#endif.
Comentarios
#endif debe ser la siguiente directiva de preprocesador después de #else. Vea #if para obtener un ejemplo de cómo utilizar
#else.
Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#elif (Referencia de C#)


#elif permite crear una directiva condicional compuesta. La expresión #elif se evalúa si ninguna de las expresiones de las
directivas #if o #elif (opcional) precedentes se evalúan como true. Si una expresión #elif se evalúa como true, el compilador
incluye en la compilación todo el código comprendido entre #elif y la siguiente directiva condicional. Por ejemplo:

#define VC7
//...
#if debug
Console.Writeline("Debug build");
#elif VC7
Console.Writeline("Visual Studio 7");
#endif

Se pueden utilizar los operadores == (igualdad), != (desigualdad), && (y), así como || (o) para evaluar varios símbolos. Es
posible agrupar símbolos y operadores mediante paréntesis.
Comentarios
#elif equivale a utilizar:

#else
#if

El uso de #elif es más simple ya que cada #if requiere un #endif, mientras que un #elif se puede utilizar sin el #endif
correspondiente.
Vea #if (Referencia de C#) para obtener un ejemplo de cómo utilizar #elif.
Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#endif (Referencia de C#)


#endif especifica el final de una directiva condicional que empezó con la directiva #if. Por ejemplo,

#define DEBUG
// ...
#if DEBUG
Console.WriteLine("Debug version");
#endif

Comentarios
Una directiva condicional, que empieza con una directiva #if, debe terminarse explícitamente con una directiva #endif. Vea
#if (Referencia de C#) para obtener un ejemplo de cómo utilizar #endif.
Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#define (Referencia de C#)


#define permite definir un símbolo de modo que, si se utiliza como expresión que se pasa a la directiva #if, la expresión se
evaluará como true. Por ejemplo:
# define DEBUG

Comentarios
Los símbolos se pueden utilizar para especificar condiciones de compilación. Puede comprobar el símbolo tanto con #if como
con #elif. También se puede utilizar el atributo conditional para llevar a cabo una compilación condicional.
Es posible definir símbolos, pero no asignar valores a símbolos. La directiva #define debe aparecer en el archivo antes de
cualquier instrucción que no sea una directiva.
También se puede definir un símbolo con la opción /define del compilador. La definición de un símbolo se puede anular
mediante la directiva #undef.
Un símbolo definido mediante /define o #define no debe entrar en conflicto con una variable del mismo nombre. Es decir, no
se debería utilizar un nombre de variable en una directiva de preprocesador ni evaluar un símbolo (constante simbólica) fuera
de una directiva de preprocesador.
El ámbito de un símbolo creado mediante #define corresponde al archivo en el que se ha definido.
Vea #if para obtener un ejemplo de cómo utilizar #define.
Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#undef (Referencia de C#)


La directiva #undef permite anular la definición de un símbolo, de tal modo que si se utiliza como expresión de una directiva
#if, la expresión se evaluará como false.
Un símbolo se puede definir mediante la directiva #define o la opción /define del compilador. La directiva #undef debe
aparecer en el archivo antes de cualquier instrucción que no sea una directiva.
Ejemplo
// preprocessor_undef.cs
// compile with: /d:DEBUG
#undef DEBUG
using System;
class MyClass
{
static void Main()
{
#if DEBUG
Console.WriteLine("DEBUG is defined");
#else
Console.WriteLine("DEBUG is not defined");
#endif
}
}

Resultados
DEBUG is not defined

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#warning (Referencia de C#)


#warning permite generar una advertencia de nivel uno desde una ubicación específica del código. Por ejemplo:

#warning Deprecated code in this method.

Comentarios
#warning se utiliza normalmente en una directiva condicional. También es posible generar un error definido por el usuario
mediante #error (Referencia de C#).
Ejemplo
// preprocessor_warning.cs
// CS1030 expected
#define DEBUG
class MainClass
{
static void Main()
{
#if DEBUG
#warning DEBUG is defined
#endif
}
}

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#error (Referencia de C#)


#error permite generar un error desde una ubicación específica del código. Por ejemplo:

#error Deprecated code in this method.

Comentarios
#error se utiliza normalmente en una directiva condicional.
También es posible generar una advertencia definida por el usuario mediante #warning (Referencia de C#).
Ejemplo
// preprocessor_error.cs
// CS1029 expected
#define DEBUG
class MainClass
{
static void Main()
{
#if DEBUG
#error DEBUG is defined
#endif
}
}

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#line (Referencia de C#)


#line permite modificar el número de línea del compilador y (opcionalmente) el nombre del archivo que aparece en los
resultados de errores y advertencias del compilador. El ejemplo siguiente muestra cómo notificar dos advertencias asociadas a
números de líneas. La directiva #line 200 fuerza que el número de líneas sea 200 (aunque el predeterminado es #7). La otra
línea (#9) sigue la secuencia usual como resultado de la directiva #line predeterminada.

class MainClass
{
static void Main()
{
#line 200
int i; // CS0168 on line 200
#line default
char c; // CS0168 on line 9
}
}

Comentarios
La directiva #line podría utilizarse en un paso intermedio automatizado del proceso de generación. Por ejemplo, si se
eliminaron las líneas del archivo de código fuente original, pero aún se desea que el compilador genere unos resultados
basados en la numeración de líneas original del archivo, se pueden eliminar las líneas y, a continuación, simular la numeración
original mediante #line.
La directiva #line hidden oculta las sucesivas líneas del depurador, de manera que cuando el desarrollador avanza por el
código, evita cualquier línea que haya entre una directiva #line hidden y la siguiente directiva #line (suponiendo que no haya
otra directiva #line hidden). Esta opción también puede utilizarse para permitir a ASP.NET que diferencie entre el código
definido por el usuario y el generado por el equipo. Aunque ASP.NET es el primer usuario de esta característica, es probable
que más generadores de código fuente hagan uso de ella.
Una directiva #line hidden no afecta ni a los nombres de los archivos ni a los números de líneas en la generación de informes
de error. Es decir, si se encuentra un error en un bloque oculto, el compilador informará del nombre del archivo en uso y del
número de la línea en que se encuentra el error.
La directiva #line filename especifica el nombre del archivo que debe aparecer en los resultados del compilador. El nombre
predeterminado es el nombre real del archivo de código fuente. El nombre de archivo debe aparecer entre comillas dobles ("").
Un archivo de código fuente puede tener cualquier número de directivas #line.
Ejemplo 1
En el ejemplo siguiente se muestra cómo el depurador omite las líneas ocultas en el código. Cuando ejecute el ejemplo,
mostrará tres líneas de texto. Sin embargo, cuando establezca un punto de interrupción, como se muestra en el ejemplo, y
presione F10 para avanzar por el código, observará que el depurador omite la línea oculta. Observe también que incluso si
establece un punto de interrupción en la línea oculta, el depurador seguirá omitiéndola.

// preprocessor_linehidden.cs
using System;
class MainClass
{
static void Main()
{
Console.WriteLine("Normal line #1."); // Set break point here.
#line hidden
Console.WriteLine("Hidden line.");
#line default
Console.WriteLine("Normal line #2.");
}
}

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#region (Referencia de C#)


#region permite especificar un bloque de código que se puede expandir o contraer cuando se utiliza la característica de
esquematización del editor de código de Visual Studio. Por ejemplo:

#region MyClass definition


public class MyClass
{
static void Main()
{
}
}
#endregion

Comentarios
Un bloque #region debe terminarse con una directiva #endregion.
Un bloque #region no se puede solapar con un bloque #if. Sin embargo, un bloque #region puede estar anidado en un
bloque #if y un bloque #if puede estar anidado en un bloque #region.
Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#endregion (Referencia de C#)


#endregion marca el final de un bloque #region. Por ejemplo:

#region MyClass definition


class MyClass
{
static void Main()
{
}
}
#endregion

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#pragma (Referencia de C#)


Mediante la directiva #pragma se dan instrucciones especiales al compilador para la compilación del archivo en el que
aparece

#pragma pragma-name pragma-arguments

Parámetros
pragma-name
El nombre de una directiva pragma reconocida.
pragma-arguments
Argumentos específicos del pragma.
Vea también
Referencia
Directivas de preprocesador de C#
#pragma warning (Referencia de C#)
#pragma checksum (Referencia del programador de C#)
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#pragma warning (Referencia de C#)


Utilizando #pragma warning se pueden habilitar o deshabilitar ciertas advertencias.

#pragma warning disable warning-list


#pragma warning restore warning-list

Parámetros
warning-list
Es una lista de números de advertencia separados por coma. Escriba los números solos, sin el prefijo "CS".
Cuando no se especifica ningún número de advertencia, disable deshabilita todas las advertencias y restore las habilita
todas.
Ejemplo
// pragma_warning.cs
using System;

#pragma warning disable 414, 3021


[CLSCompliant(false)]
public class C
{
int i = 1;
static void Main()
{
}
}
#pragma warning restore 3021
[CLSCompliant(false)] // CS3021
public class D
{
int i = 1;
public static void F()
{
}
}

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

#pragma checksum (Referencia del programador de C#)


Se puede utilizar para generar sumas de comprobación de los archivos de código fuente con el fin de ayudar a depurar
páginas ASP.NET.

#pragma checksum "filename" "{guid}" "checksum bytes"

Parámetros
"filename"
Nombre del archivo al que hay que supervisar los cambios o actualizaciones.
"{guid}"
Identificador único global (GUID) del archivo.
"checksum_bytes"
La cadena de dígitos hexadecimales representa a los bytes de la suma de comprobación. Esta cadena debe tener un número
par de dígitos hexadecimales, ya que un número impar de dígitos produce una advertencia de error de compilación y, como
consecuencia, se omite la directiva.
Comentarios
El depurador de Visual Studio utiliza una suma de comprobación para asegurarse de que siempre encuentra el código de
fuente correcto. El compilador calcula la suma de comprobación del archivo de código fuente y, a continuación, emite el
resultado al archivo de base de datos de programa (PDB). El depurador utiliza el archivo PDB para comparar la suma de
comprobación calculada del archivo de código fuente.
Esta solución no funciona para proyectos ASP.NET, porque la suma de comprobación calculada es del archivo de código fuente
generado, en vez del archivo .aspx. Para solucionar este problema, #pragma checksum ofrece compatibilidad con la suma de
comprobación de páginas ASP.NET.
Al crear un proyecto ASP.NET en Visual C#, el archivo de código fuente generado contiene una suma de comprobación del
archivo .aspx, a partir del cual se genera el código fuente. Seguidamente, el compilador escribe esta información en el archivo
PDB.
Si el compilador no encuentra ninguna directiva #pragma checksum en el archivo, calcula la suma de comprobación y
escribe el valor en el archivo PDB.
Ejemplo
class TestClass
{
static int Main()
{
#pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}"
// New checksum
}
}

Vea también
Referencia
Directivas de preprocesador de C#
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Opciones del compilador de C#


El compilador genera archivos ejecutables (.exe), bibliotecas de vínculos dinámicos (.dll) o módulos de código (.netmodule).
Todas las opciones del compilador están disponibles de dos formas: -option y /option. En la documentación sólo se muestra
la forma /option.
En esta sección
Generar mediante la línea de comandos
Información sobre cómo generar una aplicación de Visual C# desde la línea de comandos.
Cómo: Generar desde la línea de comandos
Proporciona los pasos para ejecutar vsvars32.bat con el fin de habilitar la generación de archivos desde la línea de
comandos.
Implementación de aplicaciones de C#
Describe las opciones para implementar las aplicaciones de C#.
Opciones del compilador de C#, por categoría
Listado por categorías de las opciones del compilador.
Opciones del compilador de C#, por orden alfabético
Listado alfabético de las opciones del compilador.
Errores del compilador
Información de referencia de los diferentes errores generados por el compilador de C#.
Secciones relacionadas
Cómo: Especificar las propiedades del proyecto (C#, J#)
Propiedades que controlan cómo se compila, genera y depura un proyecto. Incluye información sobre los pasos para realizar
una generación personalizada en proyectos de Visual C#.
Generaciones predeterminadas y personalizadas
Información sobre los distintos tipos de generación y su configuración.
Preparar y administrar generaciones
Procedimientos para generar archivos en el entorno de desarrollo de Visual Studio.
Referencia del lenguaje C#

Generar mediante la línea de comandos


Puede invocar el compilador de C# escribiendo el nombre de su archivo ejecutable (csc.exe) en la línea de comandos. Si utiliza
el Símbolo del sistema de Visual Studio (disponible como acceso directo en el menú Inicio, Visual Studio Tools), todas las
variables de entorno necesarias se establecen automáticamente. De lo contrario, puede ser necesario ajustar la ruta de acceso
para ejecutar csc.exe desde cualquier subdirectorio del equipo. Si no se utiliza el Símbolo del sistema de Visual Studio, se
deberá ejecutar vsvars32.bat a fin de establecer las variables de entorno adecuadas para que se admitan generaciones desde la
línea de comandos. Para obtener más información sobre vsvars32.bat, vea Cómo: Generar desde la línea de comandos.
Cuando trabaje en un equipo que sólo tenga .NET Framework SDK, puede emplear el compilador de C# en la línea de
comandos si utiliza el Símbolo del sistema de SDK, que está disponible en la opción de menú Microsoft .NET Framework
SDK.
Para efectuar la generación desde el entorno de desarrollo, vea Preparar y administrar generaciones.
El archivo ejecutable csc.exe suele encontrarse en la carpeta Microsoft.NET\Framework\<versión> en el directorio del sistema.
Su ubicación puede variar, según la configuración exacta de cada equipo individual. En el equipo habrá varias versiones de este
archivo ejecutable si se ha instalado en él más de una versión de .NET Framework. Para obtener más información sobre estas
instalaciones, vea Installing Multiple Versions of the .NET Framework.
En este tema se tratan los siguientes temas:
Reglas para la sintaxis de la línea de comandos
Líneas de comandos de ejemplo
Diferencias entre los resultados del compilador de C# y el compilador de C++
Reglas para la sintaxis de la línea de comandos
El compilador de C# utiliza las siguientes reglas para interpretar los argumentos empleados en la línea de comandos del
sistema operativo:
Los argumentos van delimitados por espacio en blanco, que puede ser un carácter de espacio o una tabulación.
El carácter de intercalación (^) no se reconoce como carácter de escape ni como delimitador. El analizador de la línea de
comandos del sistema operativo procesa este carácter por completo antes de pasarlo a la matriz argv del programa.
Una cadena entre comillas ("cadena") se interpreta como un solo argumento, sin importar el espacio en blanco que
contenga. Se puede incrustar una cadena entre comillas dentro de un argumento.
Unas comillas precedidas por una barra diagonal inversa (\") se interpretan como un literal de cadena de comillas (").
Las barras diagonales inversas se interpretan literalmente, a menos que precedan inmediatamente a unas comillas.
Si a un número par de barras diagonales inversas le siguen unas comillas, se coloca una barra diagonal inversa en la
matriz argv por cada par de barras diagonales inversas y se interpretan las comillas como un delimitador de cadenas.
Si a un número impar de barras diagonales inversas le siguen unas comillas, se coloca una barra diagonal inversa en la
matriz argv por cada par de barras diagonales, y se interpretan las comillas como un carácter de escape gracias a la barra
diagonal restante, lo que hace que se coloque un literal de cadena de comillas (") en argv.
Líneas de comandos de ejemplo
Compila File.cs y genera File.exe:

csc File.cs

Compila File.cs y genera File.dll:

csc /target:library File.cs

Compila File.cs y crea My.exe:


csc /out:My.exe File.cs

Compila todos los archivos de C# del directorio actual, con optimizaciones activadas, y define el símbolo DEBUG. Como
resultado se genera el archivo File2.exe:

csc /define:DEBUG /optimize /out:File2.exe *.cs

Compila todos los archivos de C# del directorio actual, generando una versión de depuración de File2.dll. No se muestra
logotipo ni ningún tipo de advertencias:

csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs

Compila todos los archivos de C# del directorio actual, generando Something.xyz (una DLL):

csc /target:library /out:Something.xyz *.cs

Diferencias entre los resultados del compilador de C# y el compilador de C++


No se crean archivos de objeto (.obj) como resultado de ejecutar el compilador de C#; los archivos de resultados se crean
directamente. Como consecuencia de ello, el compilador de C# no requiere un vinculador.
Vea también
Referencia
Opciones del compilador de C#, por orden alfabético
Opciones del compilador de C#, por categoría
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

Cómo: Establecer variables de entorno


El archivo vsvars32.bat establece las variables de entorno apropiadas para habilitar generaciones desde la línea de comandos.
Para obtener más información acerca de vsvars32.bat, vea el siguiente artículo de Knowledge Base:
Q248802 : Vcvars32.bat Generates Out of Environment Message
Si se instala la versión actual de Visual Studio en un equipo que también tiene una versión anterior de Visual Studio, no se
deben ejecutar los archivos vsvars32.bat o vcvars32.bat de versiones diferentes en la misma ventana de comandos.
Para ejecutar VSVARS32.BAT
1. En el símbolo del sistema, vaya al subdirectorio Common7\Tools de la instalación de Visual Studio.
2. Escriba VSVARS32 para ejecutar VSVARS32.bat.
Precaución
VSVARS32.bat puede variar de un equipo a otro. No debe reemplazar un archivo VSVARS32.BAT dañado o inexistente
con el archivo VSVARS32.BAT de otro equipo. Vuelva a ejecutar el programa de instalación para reemplazar el archivo
que falta.

Vea también
Conceptos
Generar mediante la línea de comandos
Referencia del lenguaje C#

Implementación de aplicaciones de C#
Cuando se haya terminado de generar la aplicación de C#, el paso siguiente es distribuirla. C# es un lenguaje .NET; por
consiguiente, para distribuir archivos ejecutables de C# a otros equipos es necesario que .NET Framework esté instalado en
todos los equipos de ejecución (y, en su caso, en otras dependencias específicas de la aplicación de que se trate). Dispone de
varias opciones para distribuir .NET Framework. Para obtener información general, vea Redistribuir .NET Framework.
El traslado de aplicaciones completas a otros equipos se suele denominar implementación. El entorno de desarrollo de
Microsoft proporciona mecanismos para la implementación; para obtener más información, vea
Implementar aplicaciones y componentes.
Si la generación y distribución se realizan principalmente desde la línea de comandos, podría ser conveniente estudiar otros
métodos de implementación y redistribución de las dependencias.
Vea también
Conceptos
Generar mediante la línea de comandos
Referencia del lenguaje C#

Opciones del compilador de C#, por categoría


Las siguientes opciones del compilador están ordenadas por categoría. Para obtener una lista por orden alfabético, vea
Opciones del compilador de C#, por orden alfabético.
Optimización
Opción Propósito
/filealign Especifica el tamaño de las secciones del archivo de resultados.

/optimize Habilita o deshabilita las optimizaciones.


Archivos de resultados
Opción Propósito
/doc Especifica un archivo XML donde se deberán guardar los comentarios de la documentación procesada.

/out Especifica el archivo de resultados.

/pdb Especifica el nombre de archivo y ubicación del archivo .pdb.

/platform Especifica la plataforma de los resultados.

/target Especifica el formato del archivo de resultados mediante una de las cuatro opciones
siguientes:
/target:exe/target:library/target:module/target:winexe
Ensamblados de .NET Framework
Opción Propósito
/addmodule Especifica uno o varios módulos como parte del ensamblado.

/delaysign Indica al compilador que agregue la clave pública pero que deje el ensamblado sin firmar.

/keycontainer Especifica el nombre del contenedor de claves criptográficas.

/keyfile Especifica el nombre de archivo que contiene la clave criptográfica.

/lib Especifica la ubicación de los ensamblados a los que se hace referencia mediante /reference.

/nostdlib Indica al compilador que no importe la biblioteca estándar (mscorlib.dll).

/reference Importa metadatos de un archivo que contiene un ensamblado.


Depuración y comprobación de errores
Opción Propósito
/bugreport Crea un archivo que contiene información para notificar errores del programa.

/checked Especifica si, en caso de que la aritmética de enteros desborde los límites del tipo de datos, se producirá una exce
pción en tiempo de ejecución.

/debug Indica al compilador que emita información de depuración.

/errorreport Establece el comportamiento de notificación de errores.

/fullpaths Especifica la ruta de acceso absoluta al archivo en los resultados del compilador.
/nowarn Suprime la generación del compilador de advertencias especificadas.

/warn Establece el nivel de advertencia.

/warnaserror Promueve advertencias a errores.


Preprocesador
Opción Propósito
/define Define los símbolos de preprocesador.
Recursos
Opción Propósito
/linkresource Crea un vínculo a un recurso administrado.

/resource Incrusta un recurso de .NET Framework en el archivo de resultados.

/win32icon Especifica un archivo .ico para insertarlo en el archivo de resultados.

/win32res Especifica un recurso Win32 para insertarlo en el archivo de resultados.


Varios
Opción Propósito
@ Especifica un archivo de respuesta.

/? Muestra las opciones del compilador en stdout.

/baseaddress Especifica la dirección base preferente en la que se debe cargar un archivo DLL.

/codepage Especifica la página de códigos que debe utilizarse para todos los archivos de código fuente en la compilación.

/help Muestra las opciones del compilador en stdout.

/langversion Especifica qué versión del lenguaje se va a utilizar.

/main Especifica la ubicación del método Main.

/noconfig Indica al compilador que no compile con csc.rsp.

/nologo Suprime la pantalla de bienvenida del compilador.

/recurse Busca en los subdirectorios archivos de código fuente para compilar.

/unsafe Permite la compilación del código que utiliza la palabra clave unsafe.

/utf8output Muestra los resultados del compilador mediante la codificación UTF-8.


Opciones obsoletas
/incremental Habilita la compilación incremental.
Vea también
Tareas
Cómo: Establecer variables de entorno
Referencia
Opciones del compilador de C#, por orden alfabético
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

Opciones del compilador de C#, por orden alfabético


Las siguientes opciones del compilador están ordenadas alfabéticamente. Para obtener una lista por categoría, vea
Opciones del compilador de C#, por categoría.
Opción Finalidad
@ Lee un archivo de respuesta para comprobar si contiene más opciones.

/? Muestra un mensaje del uso en stdout.

/addmodule Vincula los módulos especificados en este ensamblado

/baseaddress Especifica la dirección base para la biblioteca que se va a generar.

/bugreport Crea un archivo 'Informe de errores'. Este archivo se enviará junto con la información de bloqueo si se utiliza co
n /errorreport:prompt o /errorreport:send.

/checked Hace que el compilador genere comprobaciones de desbordamiento.

/codepage Especifica la página de códigos que se utilizará al abrir los archivos de código fuente.

/debug Proporciona información de depuración.

/define Permite definir símbolos de compilación condicional.

/delaysign Retarda la firma del ensamblado utilizando sólo la parte pública de la clave de nombre seguro.

/doc Especifica el archivo de documentación XML que se va a generar.

/errorreport Especifica cómo controlar errores internos del compilador: prompt, send o none. El valor predeterminado es no
ne.

/filealign Especifica la alineación utilizada para las secciones del archivo de resultados.

/fullpaths Hace que el compilador genere las rutas de acceso completas.

/help Muestra un mensaje del uso en stdout.

/incrementa Habilita la compilación incremental [obsoleto].


l

/keycontainer Especifica un contenedor de claves de nombre seguro.

/keyfile Especifica un archivo de claves de nombre seguro.

/langversion Especifica modos de versión de idioma: ISO-1 o Default

/lib Especifica directorios adicionales donde buscar referencias.

/linkresource Vincula el recurso especificado a este ensamblado.

/main Especifica el tipo que contiene el punto de entrada (se pasa por alto los demás puntos de entrada posibles).
/noconfig Indica al compilador que no debe incluir automáticamente el archivo CSC.RSP.

/nologo Suprime el mensaje de copyright del compilador.

/nostdlib Indica al compilador que no haga referencia a la biblioteca estándar (mscorlib.dll).

/nowarn Deshabilita determinados mensajes de advertencia

/optimize Habilita o deshabilita las optimizaciones.

/out Especifica el nombre del archivo de resultados (nombre predeterminado: nombre base de archivo con la clase p
rincipal o del primer archivo).

/pdb Especifica el nombre de archivo y ubicación del archivo .pdb.

/platform Limita las plataformas en las que se puede ejecutar este código: x86, Itanium, x64 o Cualquier CPU. El valor pred
eterminado es Cualquier CPU.

/recurse Incluye todos los archivos del directorio y subdirectorios actuales de acuerdo con las especificaciones de los co
modines.

/reference Hace referencia a los metadatos de los archivos de ensamblado especificados.

/resource Incrusta el recurso especificado.

/target Especifica el formato del archivo de resultados mediante una de las cuatro opciones
siguientes:/target:exe/target:library/target:module/target:winexe

/unsafe Permite código no seguro.

/utf8output Genera los mensajes del compilador en codificación UTF-8.

/warn Establece el nivel de advertencia (0-4).

/warnaserror Informa de advertencias específicas como si se tratase de errores.

/win32icon Utiliza este icono para los resultados.

/win32res Especifica el archivo de recursos Win32 (.res).


Vea también
Tareas
Cómo: Establecer variables de entorno
Referencia
Opciones del compilador de C#, por categoría
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

@ (Especificar archivo de respuesta) (Opciones del compilador


de C#)
La opción @ permite especificar un archivo que contiene opciones del compilador y archivos de código fuente para compilar.

@response_file

Argumentos
response_file
Archivo que especifica opciones del compilador o archivos de código fuente para compilar.
Comentarios
El compilador procesará las opciones del compilador y los archivos de código fuente como si se hubiesen especificado en la
línea de comandos.
Para especificar varios archivos de respuesta en una compilación, hay que especificar varias opciones de archivo de respuesta.
Por ejemplo:

@file1.rsp @file2.rsp

En una misma línea de un archivo de respuesta, pueden aparecer varias opciones del compilador y archivos de código fuente.
Una especificación de opción del compilador debe aparecer en una única línea (no puede abarcar varias líneas). Los archivos
de respuesta pueden contener comentarios que empiezan con el símbolo #.
Especificar opciones del compilador desde un archivo de respuesta produce el mismo efecto que incluir esas opciones en la
línea de comandos. Para obtener más información, vea Generar desde la línea de comandos.
El compilador procesa las opciones de comandos según las encuentra. Por consiguiente, los argumentos de la línea de
comandos pueden reemplazar opciones enumeradas anteriormente en archivos de respuesta. A la inversa, las opciones de un
archivo de respuesta reemplazarán opciones incluidas previamente en la línea de comandos o en otros archivos de respuesta.
C# proporciona el archivo csc.rsp, que se encuentra en el mismo directorio que el archivo csc.exe. Para obtener más
información acerca de csc.rsp, vea /noconfig.
Esta opción del compilador no se puede establecer en el entorno de desarrollo de Visual Studio, ni se puede cambiar mediante
programación.
Ejemplo
A continuación, se muestran algunas líneas de un archivo de respuesta de ejemplo:

# build the first output file


/target:exe /out:MyExe.exe source1.cs source2.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/addmodule (Importar metadatos) (Opciones del compilador


de C#)
Esta opción agrega un módulo creado con el modificador target:module para la compilación actual.

/addmodule:file[;file2]

Argumentos
file, file2
Archivo de resultados que contiene metadatos. Este archivo no puede contener un manifiesto de ensamblado. Para importar
más de un archivo, hay que separar los nombres de archivo con comas o puntos y comas.
Comentarios
Todos los módulos agregados mediante /addmodule deben hallarse en el mismo directorio que el archivo de resultados en
tiempo de ejecución. Es decir, se puede especificar un módulo de cualquier directorio en el momento de la compilación, pero el
módulo debe encontrarse en el directorio de la aplicación en tiempo de ejecución. Si dicho módulo no se encuentra en el
directorio de la aplicación en tiempo de ejecución, se obtiene la excepción TypeLoadException.
file no puede contener un ensamblado. Por ejemplo, si el archivo de resultados se creó con /target:module, se pueden importar
sus metadatos con /addmodule.
Si se creó el archivo de resultados con una opción /target diferente de /target:module, no se podrán importar sus metadatos
con /addmodule, pero sí con /reference.
Esta opción del compilador no está disponible en Visual Studio; en un proyecto no se puede hacer referencia a un módulo.
Además, esta opción del compilador no se puede modificar mediante programación.
Ejemplo
Para compilar el archivo de código fuente input.cs y agregar metadatos de metad1.netmodule y metad2.netmodule para
generar out.exe, ejecute:

csc /addmodule:metad1.netmodule;metad2.netmodule /out:out.exe input.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/baseaddress (Especificar la dirección base de un archivo DLL)


(Opciones del compilador de C#)
La opción /baseaddress permite especificar la dirección base preferida para cargar un archivo DLL.

/baseaddress:address

Argumentos
address
Dirección base para el archivo DLL. Esta dirección puede especificarse como número decimal, hexadecimal u octal.
Comentarios
La dirección base predeterminada de un archivo DLL la establece Common Language Runtime de .NET Framework.
Hay que tener en cuenta que se redondeará la palabra de orden inferior de esta dirección. Por ejemplo, si se especifica
0x11110001, quedará redondeada como 0x11110000.
Para completar el proceso de firma para un archivo DLL, utilice la opción –R de SN.EXE.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Dirección base del archivo DLL.
Para establecer esta opción del compilador mediante programación, vea BaseAddress.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/bugreport (Notificar un problema)


Especifica que la información de depuración se debe colocar en un archivo para un análisis posterior.

/bugreport:file

Argumentos
file
Nombre del archivo que va a contener el informe de error.
Comentarios
La opción /bugreport especifica que la siguiente información se debe colocar en file:
Una copia de todos los archivos de código fuente de la compilación.
Una lista de las opciones del compilador utilizadas en la compilación.
Información de versión acerca del compilador, el motor en tiempo de ejecución y el sistema operativo.
Los ensamblados y módulos a los que se hace referencia (guardados como dígitos hexadecimales), excepto los
ensamblados que se distribuyen con .NET Framework y el SDK.
Resultados del compilador, si existen.
Descripción del problema, que debe rellenar el usuario.
Descripción de cómo se debería resolver el problema, que debe rellenar el usuario.
Si se utiliza esta opción con /errorreport:prompt o /errorreport:send, se enviará la información del archivo a Microsoft
Corporation.
Puesto que se colocará una copia de todos los archivos de código fuente en file, es recomendable reproducir el defecto de
código que se sospecha en el programa más corto posible.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Observe que el contenido del archivo generado expone código fuente que podría producir la revelación inadvertida de
información.
Vea también
Referencia
/errorreport (Establecer el comportamiento de notificación de errores) (Opciones del compilador de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/checked (Comprobar aritmética de enteros) (Opciones del


compilador de C#)
La opción /checked especifica si una instrucción de aritmética de enteros que no pertenezca al ámbito de las palabras clave
checked o unchecked y dé como resultado un valor situado fuera del intervalo del tipo de datos causará una excepción en
tiempo de ejecución.

/checked[+ | <U>-</U>]

Comentarios
Una instrucción de aritmética de enteros que pertenece al ámbito de las palabras clave checked o unchecked no se ve
afectada por la opción /checked.
Si una instrucción de aritmética de enteros no comprendida en el ámbito de las palabras clave checked o unchecked da
como resultado un valor situado fuera del intervalo del tipo de datos, y se utiliza /checked+ (/checked) en la compilación,
esa instrucción causará una excepción en tiempo de ejecución. Si se utiliza /checked- en la compilación, la instrucción no
causará ninguna excepción en tiempo de ejecución.
El valor predeterminado de esta opción es /checked-, por lo que puede obtener el mismo efecto con tan sólo omitir la opción.
Un posible escenario para utilizar /checked- es la generación de grandes aplicaciones: a veces se utilizan herramientas
automatizadas para generar dichas aplicaciones que podrían establecer /checked como + de forma automática: en estos
casos, puede reemplazar el valor predeterminado global especificando /checked-.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener más información, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Comprobar el desbordamiento y subdesbordamiento aritmético.
Para tener acceso a esta opción del compilador mediante programación, vea CheckForOverflowUnderflow.
Ejemplo
Compile t2.cs y especifique que cualquier instrucción de aritmética de enteros que no pertenezca al ámbito de las palabras
clave checked o unchecked y dé como resultado un valor situado fuera del intervalo del tipo de datos causará una excepción
en tiempo de ejecución.

csc t2.cs /checked

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/codepage (Especificar una página de códigos para los archivos


de código fuente) (Opciones del compilador de C#)
Esta opción especifica qué página de códigos se debe utilizar durante la compilación si la página necesaria no es la
predeterminada para el sistema en ese momento.

/codepage:id

Argumentos
id
Identificador de la página de códigos para todos los archivos de código fuente en la compilación.
Comentarios
Si se compilan uno o varios archivos de código fuente que no se crearon para utilizar la página de códigos predeterminada en
el equipo, se podrá utilizar la opción /codepage para especificar la página de códigos que debe utilizarse. /codepage se
aplica a todos los archivos de código fuente de la compilación.
Si los archivos de código fuente se crearon con la misma página de códigos que está activada en el equipo o se crearon con
UNICODE o UTF-8, no es preciso utilizar /codepage.
Para obtener más información sobre cómo averiguar qué páginas de códigos admite el sistema, vea GetCPInfo.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/debug (Emitir información de depuración) (Opciones del


compilador de C#)
La opción /debug da lugar a que el compilador genere información de depuración y la incluya en los archivos de resultados.

/debug[+ | <U>-</U>]
/debug:{<U>full</U> | pdbonly}

Argumentos
+|-
Si se especifica +, o simplemente /debug, el compilador genera información de depuración y la incluye en una base de
datos de programa (archivo .pdb). Si se especifica -, que es la opción predeterminada cuando no se especifica /debug, no se
crea información de depuración.
full | pdbonly
Especifica el tipo de información de depuración generada por el compilador. El argumento full, que es la opción
predeterminada si no se especifica /debug:pdbonly, permite asociar un depurador al programa que se ejecuta. Al
especificar la opción pdbonly, se permite depurar el código fuente cuando se inicia el programa en el depurador, pero sólo
muestra el ensamblador cuando el programa que se ejecuta está asociado al depurador.
Comentarios
Utilice esta opción para generar versiones de depuración. Si no se especifica /debug, /debug+ o /debug:full, no podrá
depurar el archivo de resultados del programa.
Si utiliza /debug:full, sea consciente de que se producirá algún impacto en la velocidad y el tamaño del código optimizado JIT
y un pequeño impacto en la calidad del código con /debug:full. Recomendamos /debug:pdbonly o ningún PDB para
generar el código de la versión de lanzamiento.
Nota
Una diferencia entre /debug:pdbonly y /debug:full es que con /debug:full el compilador emite DebuggableAttribute, que
se utiliza para indicar al compilador JIT que la información de depuración está disponible. Por consiguiente, aparecerá un err
or si el código contiene DebuggableAttribute establecido en false y ha utilizado /debug:full.

Para obtener información sobre cómo configurar el rendimiento de depuración de una aplicación, vea
Facilitar la depuración de una imagen.
Para cambiar la ubicación del archivo .pdb, vea
/pdb (Especificar archivo de símbolos de depuración) (Opciones del compilador de C#).
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener más información, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Información de depuración.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea DebugSymbols.
Ejemplo
Para incluir información de depuración en el archivo de resultados app.pdb, ejecute:

csc /debug /out:app.pdb test.cs


Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/define (Definición de preprocesador) (Opciones del


compilador de C#)
La opción /define define name como un símbolo en el programa.

/define:name[;name2]

Argumentos
name, name2
Nombre de uno o varios símbolos que desea definir.
Comentarios
La opción /define produce el mismo efecto que una directiva de preprocesador #define en el archivo de código fuente. Un
símbolo permanece definido hasta que una directiva #undef del archivo de código fuente quita la definición o hasta que el
compilador llega al final del archivo.
Se pueden utilizar símbolos creados por esta opción con #if, #else, #elif y #endif para compilar archivos de código fuente de
forma condicional.
/d es la forma abreviada de /define.
Se pueden definir múltiples símbolos con /define utilizando punto y coma o coma para separar los nombres de símbolos. Por
ejemplo:

/define:DEBUG;TUESDAY

El propio compilador de C# no define ningún símbolo ni macro que se pueda utilizar en el código fuente; todas las definiciones
de símbolos deben estar definidas por el usuario.
Nota
La directiva #define de C# no permite que se le proporcione un valor a un símbolo, igual que sucede en otros lenguajes com
o C++. Por ejemplo, #define no se puede utilizar para crear una macro o definir una constante. Si tiene que definir una cons
tante, utilice una variable enum. Si desea crear una macro de estilo C++, considere alternativas como el uso de genéricos. Ya
que las macros son notoriamente propensas a errores, C# no permite su uso, pero proporciona alternativas más seguras.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener más información, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique el valor de la propiedad Símbolos de compilación condicional.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea DefineConstants.
Ejemplo
// preprocessor_define.cs
// compile with: /define:xx
// or uncomment the next line
// #define xx
using System;
public class Test
{
public static void Main()
{
#if (xx)
Console.WriteLine("xx defined");
#else
Console.WriteLine("xx not defined");
#endif
}
}

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/delaysign (Retardar la firma del ensamblado) (Opciones del


compilador de C#)
Esta opción hace que el compilador reserve espacio en el archivo de resultados de manera que se pueda agregar una firma
digital más adelante.

/delaysign[ + | - ]

Argumentos
+|-
Utilice /delaysign- para firmar completamente un ensamblado. Utilice /delaysign+ si desea incluir sólo la clave pública en
el ensamblado. El valor predeterminado es /delaysign-.
Comentarios
La opción /delaysign no produce ningún efecto a menos que se utilice con /keyfile o /keycontainer.
Cuando se solicita un ensamblado con firma completa, el compilador calcula el hash del archivo que contiene el manifiesto
(metadatos de ensamblado) y firma el hash con la clave privada. La firma digital resultante se almacena en el archivo que
contiene el manifiesto. Cuando se firma un ensamblado de forma retardada, el compilador no calcula ni almacena la firma,
pero reserva espacio en el archivo para poder agregar la firma más tarde.
Por ejemplo, si se utiliza /delaysign+, un comprobador podrá colocar el ensamblado en la caché global. Después de las
pruebas, se puede firmar totalmente el ensamblado colocando la clave privada en el mismo mediante la utilidad
Assembly Linker.
Para obtener más información, vea Crear y utilizar ensamblados con nombre seguro y Retrasar la firma de un ensamblado.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener más información, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Firma.
3. Modifique la propiedad Retrasar firma sólo.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea DelaySign.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/doc (Procesar comentarios de documentación) (Opciones del


compilador de C#)
La opción /doc permite insertar comentarios de documentación en un archivo XML.

/doc:file

Argumentos
file
Archivo de resultados para XML, que se llena con los comentarios de los archivos del código fuente de la compilación.
Comentarios
En los archivos de código fuente, pueden procesarse y agregarse al archivo XML los comentarios de documentación que
preceden a los citados a continuación:
Tipos definidos por el usuario como una clase, un delegado o una interfaz
Miembros como un campo, un evento, una propiedad o un método.
El código fuente que contiene Main es el primero que se extrae al archivo XML.
Para utilizar el archivo .xml generado junto con la función IntelliSense, dé el mismo nombre al archivo .xml que al ensamblado
que con el desee tener compatibilidad, y asegúrese de que ambos estén en el mismo directorio. Así, cuando se haga referencia
al ensamblado en el proyecto de Visual Studio, también se encontrará el archivo .xml. Vea Proporcionar comentarios al código
para obtener más información.
A no ser que compile con /target:module, file contendrá las etiquetas <assembly></assembly>, que especifican el nombre del
archivo que contiene el manifiesto del ensamblado del archivo de resultados de la compilación.
Nota
La opción /doc se aplica a todos los archivos de entrada; o bien, si se ha establecido en la configuración del proyecto, a todos
los archivos en el proyecto. Para deshabilitar las advertencias relacionadas con los comentarios de documentación de un arc
hivo o sección de código en particular, utilice #pragma warning.

Vea Etiquetas recomendadas para comentarios de documentación para conocer los modos de generar documentación a partir
de los comentarios del código.
Vea Ejemplo XML Documentation para obtener un ejemplo.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique la propiedad Archivo de documentación XML.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea DocumentationFile.
Vea también
Tareas
Ejemplo XML Documentation
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/errorreport (Establecer el comportamiento de notificación de


errores) (Opciones del compilador de C#)
Esta opción proporciona una forma cómoda de informar de un error interno del compilador de C# a Microsoft.

/errorreport:{ none | prompt | queue | send }

Argumentos
none
Los informes sobre los errores internos del compilador no se recogerán ni se enviarán a Microsoft.
prompt
Le pide que envíe un informe cuando reciba un error interno del compilador. prompt es la opción predeterminada cuando
se compila una aplicación en el entorno de desarrollo.
queue
Pone en la cola el informe de errores. Cuando inicia una sesión con privilegios de administrador, aparece una ventana
emergente donde puede informar de todos los errores desde la última vez que inició una sesión. No se le pedirá que envíe
informes de errores más de una vez cada tres días. queue es la opción predeterminada cuando se compila una aplicación en
la línea de comandos.
send
Envía automáticamente informes de errores internos del compilador a Microsoft. Para habilitar esta opción, primero debe
aceptar la directiva de recogida de datos de Microsoft. La primera vez que especifique /errorreport:send en un equipo, un
mensaje del compilador le remitirá a un sitio Web que contiene la directiva de recogida de datos de Microsoft.
Comentarios
Un error interno del compilador (ICE) se produce cuando el compilador no puede procesar un archivo de código fuente.
Cuando aparece un ICE, el compilador no genera un archivo de resultados ni otro tipo de diagnóstico útil que pueda utilizar
para corregir el código.
En versiones anteriores, cuando se obtenía un ICE, se le animaba a que llamara al servicio de soporte técnico de Microsoft para
informar del problema. Con /errorreport, puede proporcionar directamente la información de los ICE al equipo de Visual C#.
Sus informes de errores pueden ayudar a mejorar las futuras versiones del compilador.
La capacidad de un usuario para enviar informes depende del equipo y de los permisos de la directiva del usuario.
Para obtener más información sobre depurador de errores, vea
Descripción de la herramienta Dr. Watson para Windows (Drwtsn32.exe) Descripción de la herramienta Dr. Watson para
Windows (Drwtsn32.exe).
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener más información, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Informe de errores internos del compilador.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea ErrorReport.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/filealign (Especificar la alineación de una sección) (Opciones


del compilador de C#)
La opción /filealign permite especificar el tamaño de las secciones del archivo de resultados.

/filealign:number

Argumentos
number
Valor que especifica el tamaño de las secciones del archivo de resultados. Los valores válidos son 512, 1024, 2048, 4096 y
8192. Estos valores se expresan en bytes.
Comentarios
Cada sección se alineará con un límite que es múltiplo del valor /filealign. No hay un valor predeterminado fijo. Si no se
especifica /filealign, Common Language Runtime elige un valor predeterminado en tiempo de compilación.
Especificar el tamaño de la sección afecta al tamaño del archivo de resultados. Puede ser útil modificar el tamaño de sección
para programas que se ejecuten en dispositivos más pequeños.
Utilice DUMPBIN para ver información acerca de las secciones del archivo de resultados.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Alineación de archivo.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea FileAlignment.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/fullpaths (Especificar ruta completa en los resultados del


compilador) (Opciones del compilador de C#)
La opción /fullpaths hace que el compilador especifique la ruta de acceso completa al archivo al mostrar los errores y las
advertencias de compilación.

/fullpaths

Comentarios
Los errores y advertencias que resultan de la compilación especifican, de forma predeterminada, el nombre del archivo en el
que se encontró el error. La opción /fullpaths hace que el compilador especifique la ruta completa al archivo.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/help, /? (Ayuda de la línea de comandos del compilador)


(Opciones del compilador de C#)
Esta opción envía una lista de opciones del compilador y una breve descripción de cada opción a stdout.

/help
/?

Comentarios
Si se incluye esta opción en una compilación, no se creará ningún archivo de resultados y no se llevará a cabo la compilación.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/keycontainer (Especificar contenedor de claves con nombre


seguro) (Opciones del compilador de C#)
Especifica el nombre del contenedor de claves criptográficas.

/keycontainer:string

Argumentos
Término Definición
string Nombre del contenedor de clave de nombre seguro.
Comentarios
Cuando se utiliza la opción /keycontainer, el compilador crea un componente compartible insertando en el manifiesto del
ensamblado una clave pública incluida en el contenedor especificado y firmando el ensamblado final con la clave privada. Para
generar un archivo de claves, escriba sn -k file en la línea de comandos. sn -i instala el par de claves en un contenedor.
Si se compila con la opción /target:module, el nombre del archivo de clave queda almacenado en el módulo y se incorpora al
ensamblado al compilar este módulo como un ensamblado mediante /addmodule.
También se puede especificar esta opción como un atributo personalizado (System.Reflection.AssemblyKeyNameAttribute) en
el código fuente de cualquier módulo de lenguaje intermedio de Microsoft (MSIL).
También puede pasar la información de cifrado al compilador mediante /keyfile. Utilice /delaysign si desea agregar la clave
pública al manifiesto del ensamblado pero prefiere retardar la firma del ensamblado hasta haberlo probado.
Para obtener más información, vea Crear y utilizar ensamblados con nombre seguro y Retrasar la firma de un ensamblado.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
Esta opción del compilador no está disponible en el entorno de desarrollo de Visual Studio.
Puede tener acceso mediante programación a esta opción del compilador con AssemblyKeyContainerName.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/keyfile (Especificar archivo clave con nombre seguro)


(Opciones del compilador de C#)
Especifica el nombre de archivo que contiene la clave criptográfica.

/keyfile:file

Argumentos
Término Definición
file Nombre del archivo que contiene la clave de nombre seguro.
Comentarios
Cuando se utiliza esta opción, el compilador inserta la clave pública del archivo especificado en el manifiesto del ensamblado y,
a continuación, firma el último ensamblado con la clave privada. Para generar un archivo de clave, escriba sn -k file en la línea
de comandos.
Si se compila con la opción /target:module, el nombre del archivo de claves se mantiene en el módulo y se incorpora en el
ensamblado que se crea al compilar un ensamblado con la opción /addmodule.
También puede pasar la información de cifrado al compilador mediante /keycontainer. Utilice /delaysign para firmar el
ensamblado de forma parcial.
Si se especifica tanto /keyfile como /keycontainer (ya sea mediante una opción de línea de comandos o mediante un atributo
personalizado) en la misma compilación, el compilador probará primero el contenedor de clave. Si lo consigue, el ensamblado
se firma con la información del contenedor de claves. Si el compilador no encuentra el contenedor de clave, probará el archivo
especificado con /keyfile. Si lo consigue, el ensamblado se firma con la información del archivo de clave y la información de la
clave se instalará en el contenedor de clave (similar a sn -i) de modo que, en la próxima compilación, el contenedor de claves
será válido.
Tenga en cuenta que un archivo de clave puede contener sólo la clave pública.
Para obtener más información, vea Crear y utilizar ensamblados con nombre seguro y Retrasar la firma de un ensamblado.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Firma.
3. Modifique la propiedad Seleccione un archivo de clave de nombre seguro.
Puede tener acceso mediante programación a esta opción del compilador con AssemblyOriginatorKeyFile.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/langversion (Sintaxis compatible) (Opciones del compilador


de C#)
Hace que el compilador acepte sólo la sintaxis incluida en la especificación del lenguaje C# ISO/IEC 23270:2003.

/langversion:option

Argumentos
option
Si option es ISO-1, el compilador producirá un error para cualquier sintaxis que no esté en la especificación del lenguaje C#
ISO/IEC 23270:2003. Si option es default, el compilador aceptará toda sintaxis del lenguaje que sea válida.
/langversion:default es el valor predeterminado.
Comentarios
La versión 1.0 de la especificación de C# representa la funcionalidad disponible con /langversion:ISO-1.
http://msdn.microsoft.com/vcsharp/programming/language/default.aspx contiene todas las especificaciones en archivos de
Microsoft Word.
Los metadatos a los que hace referencia una aplicación de C# no están sujetos a la opción del compilador /langversion.
Todas las versiones del compilador de C# contienen extensiones que corresponden a la especificación del lenguaje, de modo
que /langversion no proporciona la funcionalidad equivalente de una versión anterior del compilador.
Sin tener en cuenta la configuración de /langversion que utilice, debe emplear la versión actual de Common Language
Runtime para crear archivos .exe o .dll.
Una excepción son los ensamblados de confianza y
/moduleassemblyname (Especificar un ensamblado de confianza para el módulo) (Opción del compilador de C# ), que
funcionan bajo /langversion:ISO-1.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad Versión del lenguaje.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea LanguageVersion.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/lib (Especificar ubicaciones de referencias de ensamblados)


(Opciones del compilador de C#)
La opción /lib especifica la ubicación de los ensamblados a los que se hace referencia mediante la opción
/reference (Importar metadatos) (Opciones del compilador de C#).

/lib:dir1[,dir2]

Argumentos
dir1
Directorio utilizado por el compilador para buscar un ensamblado al que se hace referencia si no lo encuentra en el
directorio de trabajo actual (el directorio desde el que se invoca al compilador) o en el directorio del sistema de Common
Language Runtime.
dir2
Uno o varios directorios adicionales para buscar las referencias a ensamblados. Separe los nombres de directorio adicionales
con una coma y sin espacio en blanco entre ellos.
Comentarios
El compilador busca referencias a ensamblados que no presentan la ruta completa en el siguiente orden:
1. Directorio actual de trabajo. Es el directorio desde donde se invoca al compilador.
2. Directorio del sistema de Common Language Runtime.
3. Directorios especificados por /lib.
4. Directorios especificados por la variable de entorno LIB.
Hay que utilizar /reference para especificar una referencia a un ensamblado.
La opción /lib es sumatoria; si se especifica más de una vez, anexa nuevos valores a los ya existentes.
Una alternativa al uso de /lib consiste en copiar en el directorio de trabajo los ensamblados requeridos; esto permitirá pasar el
nombre del ensamblado a /reference. A continuación, se pueden eliminar los ensamblados del directorio de trabajo. Dado
que en el manifiesto del ensamblado no se especifica la ruta al ensamblado dependiente, la aplicación puede iniciarse en el
equipo de destino y desde allí buscará y utilizará el ensamblado en la caché de ensamblados global.
El hecho de que el compilador puede hacer referencia al ensamblado, no implica que Common Language Runtime pueda
buscar y cargar el ensamblado en tiempo de ejecución. Vea Cómo el motor en tiempo de ejecución ubica ensamblados para
obtener los detalles sobre cómo busca el motor en tiempo de ejecución los ensamblados a los que se hace referencia.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Ruta de acceso de referencias.
3. Modifique el contenido del cuadro de lista.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea ReferencePath.
Ejemplo
Para compilar t2.cs con el fin de crear un archivo .exe. El compilador busca referencias a ensamblados en el directorio de
trabajo y en el directorio raíz de la unidad C.

csc /lib:c:\ /reference:t2.dll t2.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/linkresource (Vincular a recursos de .NET Framework)


(Opciones del compilador de C#)
Crea un vínculo a un recurso .NET Framework en el archivo de resultados; el archivo de recursos no se incluye en el de
resultados, al contrario que con la opción /resource que sí incrusta el archivo de recursos en el archivo de resultados.

/linkresource:filename[,identifier[,accessibility-modifier]]

Argumentos
filename
Archivo de recursos de .NET Framework con el que desea crear un vínculo desde el ensamblado.
identifier (opcional)
Nombre lógico del recurso; nombre usado para cargar el recurso. El valor predeterminado es el nombre del archivo.
accessibility-modifier (opcional)
Accesibilidad del recurso: pública o privada. El valor predeterminado es que sea pública.
Comentarios
Los recursos vinculados son públicos en el ensamblado cuando se crean con el compilador de C#. Para que sean privados,
especifique el modificador de accesibilidad private. No se permite ningún otro modificador distinto de public o private.
/linkresource requiere una de las opciones de /target distinta de /target:module.
Si filename es un archivo de recursos de .NET Framework creado, por ejemplo, con Resgen.exe o en el entorno de desarrollo,
se puede obtener acceso a él con miembros del espacio de nombres System.Resources. Para obtener más información, vea
System.Resources.ResourceManager. En todos los demás recursos, hay que utilizar los métodos GetManifestResource* en la
clase Assembly para tener acceso al recurso en tiempo de ejecución.
El archivo especificado en filename puede tener cualquier formato. Por ejemplo, se puede hacer que un archivo DLL nativo
forme parte de un ensamblado para que se pueda instalar en la caché de ensamblados global y sea accesible desde código
administrado del ensamblado. El segundo de los siguientes ejemplos muestra cómo hacerlo. También es posible llevarlo a
cabo en Assembly Linker. El tercer ejemplo indica cómo. Para obtener más información, vea
Herramienta Assembly Linker (Al.exe) y Trabajar con ensamblados y la Caché de ensamblados global.
La opción /linkres es la forma breve de /linkresource.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Ejemplo
Para compilar in.cs y vincularlo al archivo de recursos rf.resource, ejecute:

csc /linkresource:rf.resource in.cs

Para compilar A.cs en un archivo DLL, vincularlo a un archivo DLL nativo N.dll y colocar el resultado en la Caché de
ensamblados global (GAC), ejecute lo siguiente. En este ejemplo, A.dll y N.dll residen en la GAC.

csc /linkresource:N.dll /t:library A.cs


gacutil -i A.dll

Este ejemplo hace lo mismo que el anterior, pero utiliza las opciones de Assembly Linker.

csc /t:module A.cs


al /out:A.dll A.netmodule /link:N.dll
gacutil -i A.dll

Vea también
Referencia
Herramienta Assembly Linker (Al.exe)
Otros recursos
Opciones del compilador de C#
Trabajar con ensamblados y la Caché de ensamblados global
Referencia del lenguaje C#

/main (Especificar la ubicación del método Main) (Opciones del


compilador de C#)
Esta opción especifica la clase que contiene el punto de entrada al programa, si más de una clase contiene un método Main.

/main:class

Argumentos
class
Tipo que contiene el método Main.
Comentarios
Si la compilación incluye más de un tipo con un método Main, se puede especificar el tipo que contiene el método Main que
se desea utilizar como punto de entrada en el programa.
Esta opción sólo se puede usar al compilar archivos .exe.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique el valor de la propiedad Objeto inicial.
Para establecer esta opción del compilador mediante programación, vea StartupObject.
Ejemplo
Para compilar t2.cs y t3.cs, y especificar que el método Main está en Test2, ejecute:

csc t2.cs t3.cs /main:Test2

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/moduleassemblyname (Especificar un ensamblado de


confianza para el módulo) (Opción del compilador de C# )
Especifica un ensamblado a cuyos tipos no públicos puede tener acceso .netmodule.

/moduleassemblyname:assembly_name

Argumentos
assembly_name
El nombre del ensamblado a cuyos tipos no públicos puede tener acceso .netmodule.
Comentarios
Se debe utilizar /moduleassemblyname al generar .netmodule cuando se den las condiciones siguientes:
.netmodule necesita tener acceso a los tipos no públicos de un ensamblado existente.
Se conoce el nombre del ensamblado en el que se generará .netmodule.
El ensamblado existente ha concedido acceso de ensamblado de confianza al ensamblado en el que se generará
.netmodule.
Para obtener más información sobre cómo generar .netmodule, vea
/target:module (Crear un módulo para agregarlo a un ensamblado) (Opciones del compilador de C#).
Para obtener más información sobre los ensamblados de confianza, vea
Ensamblados de confianza (Guía de programación de C#).
Esta opción no está disponible en el entorno de desarrollo; sólo está disponible al compilar desde la línea de comandos.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Ejemplo
Este ejemplo genera un ensamblado con un tipo privado que concede acceso de ensamblado de confianza a un ensamblado
llamado csman_an_assembly.

// moduleassemblyname_1.cs
// compile with: /target:library
using System;
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo ("csman_an_assembly")]

class An_Internal_Class
{
public void Test()
{
Console.WriteLine("An_Internal_Class.Test called");
}
}

Este ejemplo genera un módulo .netmodule que tiene acceso a un tipo no público del ensamblado moduleassemblyname_1.dll.
Al saber que dicho .netmodule se generará en un ensamblado llamado csman_an_assembly, se puede especificar
/moduleassemblyname, lo que permite que el módulo .netmodule tenga acceso a los tipos no públicos de un ensamblado
que ha concedido acceso de ensamblado de confianza a csman_an_assembly.

// moduleassemblyname_2.cs
// compile with: /moduleassemblyname:csman_an_assembly /target:module /reference:moduleasse
mblyname_1.dll
class B {
public void Test() {
An_Internal_Class x = new An_Internal_Class();
x.Test();
}
}

Este ejemplo de código genera el ensamblado csman_an_assembly, haciendo referencia al ensamblado y .netmodule
generados previamente.

// csman_an_assembly.cs
// compile with: /addmodule:moduleassemblyname_2.netmodule /reference:moduleassemblyname_1.
dll
class A {
public static void Main() {
B bb = new B();
bb.Test();
}
}

Resultados
An_Internal_Class.Test called

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/noconfig (Omitir csc.rsp) (Opciones del compilador de C#)


La opción /noconfig comunica al compilador que no compile con el archivo csc.rsp, que está ubicado y se carga desde el
mismo directorio que el archivo csc.exe.

/noconfig

Comentarios
El archivo csc.rsp hace referencia a todos los ensamblados incluidos en .NET Framework. Las referencias reales que incluye el
entorno de desarrollo Visual Studio .NET dependen del tipo de proyecto.
Es posible modificar el archivo csc.rsp y especificar opciones de compiladores adicionales que puedan incluirse en cada
compilación desde la línea de comandos con csc.exe (excepto la opción /noconfig).
El compilador procesa en último lugar las opciones que se pasan al comando csc. Por lo tanto, cualquier opción de la línea de
comandos reemplaza la configuración de la misma opción en el archivo csc.rsp.
Si no desea que el compilador busque y utilice la configuración del archivo csc.rsp, especifique /noconfig.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/nologo (Suprimir la información de pancarta) (Opciones del


compilador de C#)
La opción /nologosuprime la presentación de la pancarta de inicio de sesión cuando se ejecuta el compilador y la de los
mensajes de información durante la compilación.

/nologo

Comentarios
Esta opción no está disponible en el entorno de desarrollo; sólo está disponible al compilar desde la línea de comandos.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/nostdlib (No importar la biblioteca estándar) (Opciones del


compilador de C#)
/nostdlib evita la importación de mscorlib.dll, que define el espacio de nombres System completo.

/nostdlib[<U>+</U> | -]

Comentarios
Use esta opción si desea definir o crear sus propios objetos y espacio de nombres System.
Si no especifica /nostdlib, se importará mscorlib.dll al programa (equivale a especificar /nostdlib-). Especificar sólo /nostdlib
equivale a especificar /nostdlib+.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Haga clic en el botón Avanzadas.
4. Modifique la propiedad No hacer referencia al archivo mscorlib.dll.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea NoStdLib.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/nowarn (Suprimir las advertencias especificadas) (Opciones


del compilador de C#)
La opción /nowarn permite evitar que el compilador muestre una o más advertencias. Si hay varios números de advertencia,
hay que separarlos con una coma.

/nowarn:number1[,number2,...]

Argumentos
number1, number2
Número o números de advertencia que el compilador debe suprimir.
Comentarios
Sólo se debe especificar la parte numérica del identificador de advertencia. Por ejemplo, si se desea suprimir CS0028, hay que
especificar /nowarn:28.
El compilador omitirá silenciosamente los números de advertencias que se han pasado a /nowarn, que eran válidas en
versiones anteriores, pero que se han eliminado del compilador. Por ejemplo, CS0679 era válida para el compilador en Visual
Studio .NET 2002, pero posteriormente se ha eliminado.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique el valor de la propiedad Suprimir advertencias.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea DelaySign.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/optimize (Habilitar o deshabilitar optimizaciones) (Opciones


del compilador de C#)
La opción /optimizehabilita o deshabilita las optimizaciones realizadas por el compilador para hacer que el archivo de
resultados sea más pequeño, rápido y eficiente.

/optimize[+ | <U>-</U>]

Comentarios
También indica a Common Language Runtime que optimice el código en tiempo de ejecución.
De forma predeterminada, las optimizaciones están deshabilitadas. Especifique /optimize+ para habilitar las optimizaciones.
Cuando genere un módulo para que lo utilice un ensamblado, utilice la misma configuración /optimize que para el propio
ensamblado.
/o es la forma abreviada de /optimize.
Se pueden combinar las opciones /optimize y /debug.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique la propiedad Optimizar código.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea Optimize.
Ejemplo
Para compilar t2.cs y habilitar las optimizaciones del compilador, ejecute:

csc t2.cs /optimize

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/out (Establecer el nombre de archivo de los resultados)


(Opciones del compilador de C#)
La opción /out especifica el nombre del archivo de resultados.

/out:filename

Argumentos
filename
Nombre del archivo de resultados creado por el compilador.
Comentarios
En la línea de comandos, es posible especificar varios archivos de resultados de una compilación. El compilador espera
encontrar al menos un archivo de código fuente después de la opción /out. Posteriormente, todos los archivos de código
fuente se compilarán en el archivo de resultados especificado por la opción /out.
Hay que especificar el nombre completo y la extensión del archivo que se desea crear.
Si no se especifica el nombre del archivo de resultados:
Un archivo .exe toma el nombre del archivo de código fuente que contiene el método Main.
Un archivo .dll o .netmodule toma el nombre del primer archivo de código fuente.
Un archivo de código fuente utilizado para compilar un archivo de resultados no puede utilizarse para compilar otro archivo de
este tipo en la misma compilación.
Cuando se producen varios archivos de resultados en una compilación de línea de comandos, recuerde que sólo uno de los
archivos de resultados puede ser un ensamblado y que sólo el primero que haya especificado (ya sea implícita o
explícitamente con /out) puede ser el ensamblado.
Todos los módulos que se produzcan como parte de una compilación se convierten en archivos asociados a cualquier
ensamblado que también se haya producido en la compilación. Utilice ildasm.exe para ver el manifiesto del ensamblado y los
archivos asociados.
Es obligatorio utilizar la opción /out del compilador que un archivo exe sea el destino de un ensamblado de confianza. Para
obtener más información, vea Ensamblados de confianza (Guía de programación de C#).
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique la propiedad Nombre del ensamblado.
Para establecer esta opción del compilador mediante programación: OutputFileName es una propiedad de sólo lectura
que se determina a partir de una combinación del tipo de proyecto (ejecutable, biblioteca, etc.) y el nombre del
ensamblado. Es necesario modificar una de estas propiedades o ambas para establecer el nombre del archivo de
resultados.
Ejemplo
Para compilar t.cs y crear el archivo de resultados t.exe, y para generar t2.cs y crear el archivo de resultados del módulo
mymodule.netmodule, ejecute:

csc t.cs /out:mymodule.netmodule /target:module t2.cs

Vea también
Referencia
Ensamblados de confianza (Guía de programación de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/pdb (Especificar archivo de símbolos de depuración)


(Opciones del compilador de C#)
La opción del compilador /pdb especifica el nombre y ubicación del archivo de símbolos de depuración.

/pdb:filename

Argumentos
filename
Nombre y ubicación del archivo de símbolos de depuración.
Comentarios
Cuando especifica /debug (Emitir información de depuración) (Opciones del compilador de C#), el compilador crea un archivo
.pdb en el mismo directorio en el que creará el archivo de resultados (.exe o .dll) con un nombre de archivo que es igual que el
del archivo de resultados.
/pdb le permite especificar un nombre de archivo y ubicación no predeterminados para el archivo .pdb.
Esta opción del compilador no se puede establecer en el entorno de desarrollo de Visual Studio, ni se puede cambiar mediante
programación.
Ejemplo
Compile t.cs y cree un archivo .pdb denominado tt.pdb:

csc /debug /pdb:tt t.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/platform (Especificar la plataforma de los resultados)


(Opciones del compilador de C#)
Especifica qué versión de Common Language Runtime (CLR) puede ejecutar el ensamblado.

/platform:string

Parámetros
string
x86, Itanium, x64 o anycpu (valor predeterminado).
Comentarios
x86 compila el ensamblado para ejecutarlo en Common Language Runtime de 32 bits, compatible con x86.
Itanium compila el ensamblado para ejecutarlo en Common Language Runtime de 64 bits en un equipo con un
procesador Itanium.
x64 compila el ensamblado para ejecutarlo en Common Language Runtime de 64 bits en un equipo que admite el
conjunto de instrucciones de AMD64 o EM64T.
anycpu (valor predeterminado) compila el ensamblado para ejecutarlo en cualquier plataforma.
En un sistema operativo Windows de 64 bits:
Los ensamblados compilados con /platform:x86 se ejecutarán en el CLR de 32 bits que se ejecuta bajo WOW64.
Los ejecutables compilados con el modificador /platform:anycpu se ejecutarán en el CLR de 64 bits.
Un archivo DLL compilado con el modificador /platform:anycpu se ejecutará en el mismo CLR que el proceso en el que
se cargó.
Para obtener más información sobre cómo desarrollar una aplicación que se ejecute en un sistema operativo Windows de 64
bits, vea Aplicaciones de 64 bits.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique la propiedad Destino de la plataforma.
Nota /platform no está disponible en el entorno de desarrollo en Visual C# Express.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea PlatformTarget.
Ejemplo
En el ejemplo siguiente se muestra cómo utilizar la opción /platform para especificar que la aplicación sólo se debe ejecutar
en el CLR de 64 bits, en un sistema operativo Windows de 64 bits para Itanium.

csc /platform:Itanium myItanium.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/recurse (Buscar archivos de código fuente en subdirectorios)


(Opciones del compilador de C#)
La opción /recurse permite compilar archivos de código fuente de todos los directorios secundarios del directorio especificado
(dir) o del directorio del proyecto.

/recurse:[dir\]file

Argumentos
dir (opcional)
Directorio en el que se desea iniciar la búsqueda. Si no se especifica, la búsqueda empieza en el directorio del proyecto.
file
Los archivos que se van a buscar. Se permiten caracteres comodín.
Comentarios
La opción /recurse permite compilar archivos de código fuente de todos los directorios secundarios del directorio especificado
(dir) o del directorio del proyecto.
El nombre de archivo se puede especificar con caracteres comodín de modo que se compilen todos los archivos del directorio
del proyecto que cumplan la especificación sin tener que utilizar /recurse.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Ejemplo
Compila todos los archivos de C# del directorio actual:

csc *.cs

Compila todos los archivos de C# del directorio dir1\dir2 y todos sus subdirectorios, y genera dir2.dll:

csc /target:library /out:dir2.dll /recurse:dir1\dir2\*.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/reference (Importar metadatos) (Opciones del compilador de


C#)
La opción /reference hace que el compilador importe información de tipos public (Referencia de C#) al archivo especificado
del proyecto actual, permitiéndole así hacer referencia a los metadatos desde los archivos de ensamblado especificados.

/reference:[alias=]filename
/reference:filename

Argumentos
filename
Nombre de un archivo que contiene un manifiesto del ensamblado. Para importar más de un archivo, incluya una opción
/reference independiente para cada archivo.
alias
Un identificador de C# válido que representa al espacio de nombres raíz que contendrá todos los espacios de nombres del
ensamblado.
Comentarios
Para importar más de un archivo, incluya una opción /reference para cada archivo.
Los archivos que importe deben contener un manifiesto, y el archivo de resultados debe haberse compilado con una opción
/target (Especificar el formato del archivo de resultados) (Opciones del compilador de C#) que no sea
/target:module (Crear un módulo para agregarlo a un ensamblado) (Opciones del compilador de C#).
/r es la forma abreviada de /reference.
Utilice /addmodule (Importar metadatos) (Opciones del compilador de C#) para importar metadatos de un archivo de
resultados que no contenga un manifiesto de ensamblado.
Si hace referencia a un ensamblado (Ensamblado A) que, a su vez, hace referencia a otro ensamblado (Ensamblado B), también
deberá hacer referencia al ensamblado B si:
Un tipo utilizado en el Ensamblado A hereda de un tipo o implementa una interfaz del Ensamblado B.
Se invoca un campo, una propiedad, un evento o un método que devuelve un tipo o tiene un tipo de parámetro de
Ensamblado B.
Utilice /lib (Especificar ubicaciones de referencias de ensamblados) (Opciones del compilador de C#) para especificar el
directorio en el que se encuentran una o varias de las referencias de ensamblados. El tema /lib trata también sobre los
directorios donde el compilador busca ensamblados.
Para que el compilador reconozca un tipo en un ensamblado, y no en un módulo, debe obligársele a que resuelva el tipo, lo
que se puede conseguir definiendo una instancia del tipo. Existen otras formas de que el compilador resuelva nombres de
tipos en un ensamblado; por ejemplo, si hereda de un tipo de un ensamblado, el compilador reconocerá el nombre del tipo.
A veces, es necesario hacer referencia a dos versiones diferentes del mismo componente desde un solo ensamblado. Para ello,
utilice la subopción de alias en el modificador /reference para que cada archivo distinga entre los dos archivos. Dicho alias se
utilizará como calificador del nombre del componente y se resolverá como tal componente en uno de los archivos.
El archivo de respuesta csc.rsp, que hace referencia a los ensamblados utilizados comúnmente en .NET Framework, es el
predeterminado. Utilice /noconfig (Omitir csc.rsp) (Opciones del compilador de C#) si no desea que el compilador utilice
csc.rsp.
Para obtener más información, vea Agregar referencia (Cuadro de diálogo).
Ejemplo
En este ejemplo se muestra cómo utilizar la función alias externo (Referencia de C#).
Compile el archivo de código fuente e importe los metadatos de grid.dll y grid20.dll, que se compilaron anteriormente.
Los dos archivos DLL contienen versiones independientes del mismo componente y el usuario utiliza dos modificadores
/reference con opciones de alias para compilar el archivo de código fuente. Las opciones tienen la apariencia siguiente:
/reference:GridV1=grid.dll y /reference:GridV2=grid20.dll
Con ello se crean los alias externos "GridV1" y "GridV2" que podrá utilizar en su programa por medio de una instrucción
extern:

extern GridV1;
extern GridV2;
// Using statements go here.

Una vez hecho esto, puede hacer referencia al control de cuadrícula de grid.dll anteponiendo GridV1 al nombre de control, de
la siguiente forma:

GridV1::Grid

Además, puede hacer referencia al control de cuadrícula de grid20.dll anteponiendo GridV2 al nombre de control, de la
siguiente forma:

GridV2::Grid

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/resource (Incrustar un archivo de recursos en el resultado)


(Opciones del compilador de C#)
Incrusta el recurso especificado en el archivo de resultados.

/resource:filename[,identifier[,accessibility-modifier]]

Argumentos
filename
Archivo de recursos de .NET Framework que se desea incrustar en el archivo de resultados de la compilación.
identifier (opcional)
Nombre lógico del recurso; nombre usado para cargar el recurso. El valor predeterminado es el nombre del archivo.
accessibility-modifier (opcional)
Accesibilidad del recurso: pública o privada. El valor predeterminado es que sea pública.
Comentarios
Se utiliza la opción /linkresource para vincular un recurso a un ensamblado y no incluir el archivo de recursos en el archivo de
resultados.
De forma predeterminada, los recursos son públicos en el ensamblado cuando se crean con el compilador de C#. Para que
sean privados, especifique el modificador de accesibilidad private. No se permite ninguna otra accesibilidad distinta de public
o private.
Si filename es un archivo de recursos de .NET Framework creado, por ejemplo, con Resgen.exe o en el entorno de desarrollo,
se puede tener acceso a él con miembros del espacio de nombres System.Resources (vea System.Resources.ResourceManager
para obtener más información). En todos los demás recursos, hay que utilizar los métodos GetManifestResource* en la clase
Assembly para tener acceso al recurso en tiempo de ejecución.
/res es la forma abreviada de /resource.
El orden de los recursos en el archivo de resultados se determina a partir del orden especificado en la línea de comandos.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Agregue un archivo de recursos al proyecto.
2. Seleccione el archivo que desea incrustar en el Explorador de soluciones.
3. Seleccione Acción de generación para ese archivo en la ventana Propiedades.
4. Establezca el valor de Acción de generación en Recurso incrustado.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea BuildAction.
Ejemplo
Para compilar in.cs y asociar el archivo de recursos rf.resource, ejecute:

csc /resource:rf.resource in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/target (Especificar el formato del archivo de resultados)


(Opciones del compilador de C#)
La opción del compilador /targetse puede especificar de cuatro formas distintas:
/target:exe
Para crear un archivo .exe.
/target:library
Para crear una biblioteca de código.
/target:module
Para crear un módulo.
/target:winexe
Para crear un programa de Windows.
A menos que se especifique /target:module, /target incluye un manifiesto de ensamblado de .NET Framework en un archivo
resultante. Para obtener más información, vea Ensamblados en Common Language Runtime y Atributos globales.
El manifiesto de ensamblado se sitúa en el primer archivo de resultados .exe de la compilación o bien en el primer archivo DLL
si no hubiera .exe. Por ejemplo, en la siguiente línea de comandos, el manifiesto se colocará en 1.exe:

csc /out:1.exe t1.cs /out:2.netmodule t2.cs

El compilador sólo crea un manifiesto de ensamblado por compilación. En el manifiesto de ensamblado se incluye información
sobre todos los archivos que intervienen en una compilación. Todos los archivos resultantes, excepto los creados con
/target:module, pueden contener un manifiesto de ensamblado. Cuando se producen varios archivos de resultados en la
línea de comandos, sólo puede crearse un manifiesto de ensamblado y éste debe ir al primer archivo de resultados
especificado en la línea de comandos. Independientemente de cuál sea el primer archivo de resultados (/target:exe,
/target:winexe, /target:library o /target:module), cualquier otro archivo de resultados creado en la misma compilación
debe ser un módulo (/target:module).
Si crea un ensamblado, puede indicar que todo o parte del código sea compatible con CLS mediante el atributo CLSCompliant.

// target_clscompliant.cs
[assembly:System.CLSCompliant(true)] // specify assembly compliance

[System.CLSCompliant(false)] // specify compliance for an element


public class TestClass
{
public static void Main() {}
}

Para obtener más información sobre cómo establecer mediante programación esta opción del compilador, vea OutputType.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/target:exe (Crear una aplicación de consola) (Opciones del


compilador de C#)
La opción /target:exe hace que el compilador cree una aplicación de consola ejecutable (EXE).

/target:exe

Comentarios
La opción /target:exeestá activada de manera predeterminada. El archivo ejecutable se creará con la extensión .exe.
Utilice /target:winexe para crear un programa ejecutable de Windows.
A menos que se especifique otra cosa con la opción /out, el archivo de resultados toma el nombre del archivo de entrada que
contiene el método Main.
Cuando se especifica en la línea de comandos, se utilizan todos los archivos hasta la siguiente opción /out o /target:module
para crear el archivo .exe.
Sólo se requiere un método Main en los archivos de código fuente que se compilan para producir un .exe. La opción /main del
compilador permite especificar la clase que contiene el método Main, en casos en los que el código tiene más de una clase con
un método Main.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique la propiedad Tipo de resultado.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea OutputType.
Ejemplo
Cada una de las siguientes líneas de comandos compilará in.cs y creará in.exe:

csc /target:exe in.cs


csc in.cs

Vea también
Referencia
/target (Especificar el formato del archivo de resultados) (Opciones del compilador de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/target:library (Crear una biblioteca de código) (Opciones del


compilador de C#)
La opción /target:library hace que el compilador cree una biblioteca de vínculos dinámicos (DLL) en lugar de un archivo
ejecutable (EXE).

/target:library

Comentarios
Se creará el archivo DLL con la extensión .dll.
A menos que se especifique otra cosa con la opción /out, el archivo de resultados toma el nombre del primer archivo de
entrada.
Cuando se especifica en la línea de comandos, se utilizan todos los archivos hasta la siguiente opción /out o /target:module
para crear el archivo .dll.
Para generar un archivo .dll, no es necesario un método Main.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique la propiedad Tipo de resultado.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea OutputType.
Ejemplo
Compile in.cs, creando in.dll:

csc /target:library in.cs

Vea también
Referencia
/target (Especificar el formato del archivo de resultados) (Opciones del compilador de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/target:module (Crear un módulo para agregarlo a un


ensamblado) (Opciones del compilador de C#)
Esta opción hace que el compilador no genere un manifiesto de ensamblado.

/target:module

Comentarios
De manera predeterminada, el archivo de resultados creado al compilar con esta opción tendrá la extensión .netmodule.
Common Language Runtime de .NET Framework no puede cargar un archivo sin manifiesto de ensamblado. No obstante,
puede incorporar ese archivo al manifiesto del ensamblado mediante /addmodule.
Si se crea más de un módulo en una sola compilación, los tipos internal de un módulo estarán disponibles para el resto de
módulos de la compilación. Cuando el código de un módulo hace referencia a los tipos internal de otro módulo, ambos
módulos deben incorporarse a un manifiesto de ensamblado mediante /addmodule.
El entorno de desarrollo de Visual Studio no permite la creación de módulos.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea OutputType.
Ejemplo
Compile in.cs, creando in.netmodule:

csc /target:module in.cs

Vea también
Referencia
/target (Especificar el formato del archivo de resultados) (Opciones del compilador de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/target:winexe (Crear un programa para Windows) (Opciones


del compilador de C#)
La opción /target:winexe hace que el compilador cree un programa de Windows ejecutable (EXE).

/target:winexe

Comentarios
El archivo ejecutable se creará con la extensión .exe. Los programas para Windows proporcionan una interfaz de usuario para
la biblioteca de .NET Framework o con las API Win32.
Utilice /target:exe para crear una aplicación de consola.
A menos que se especifique otra cosa con la opción /out, el archivo de resultados toma el nombre del archivo de entrada que
contiene el método Main.
Cuando se especifica en la línea de comandos, todos los archivos hasta la siguiente opción /out o /target se utilizan para crear
el programa de Windows.
Sólo se requiere un método Main en los archivos de código fuente que se compilan para producir un .exe. La opción /main
permite especificar la clase que contiene el método Main, en casos en los que el código tiene más de una clase con un método
Main.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique la propiedad Tipo de resultado.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea OutputType.
Ejemplo
Para compilar in.cs en un programa de Windows, ejecute:

csc /target:winexe in.cs

Vea también
Referencia
/target (Especificar el formato del archivo de resultados) (Opciones del compilador de C#)
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/unsafe (Habilitar modo Unsafe) (Opciones del compilador de


C#)
La opción /unsafe del compilador permite compilar el código que utiliza la palabra clave unsafe.

/unsafe

Comentarios
Para obtener más información sobre el código no seguro, vea Código no seguro y punteros (Guía de programación de C#).
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Active la casilla de verificación Permitir código no seguro.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea AllowUnsafeBlocks.
Ejemplo
Para compilar in.cs en modo no seguro, ejecute:

csc /unsafe in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/utf8output (Mostrar mensajes del compilador con UTF-8)


(Opciones del compilador de C#)
La opción /utf8outputmuestra los resultados del compilador utilizando la codificación UTF-8.

/utf8output

Comentarios
En algunas configuraciones internacionales, los resultados del compilador no se pueden mostrar correctamente en la consola.
En estas configuraciones, hay que utilizar /utf8output y redirigir los resultados del compilador a un archivo.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/warn (Especificar el nivel de advertencia) (Opciones del


compilador de C#)
La opción /warn especifica el nivel de advertencia que debe mostrar el compilador.

/warn:option

Argumentos
option
El nivel de advertencia que se desea mostrar para la compilación: los números más bajos muestran sólo las advertencias
muy graves; los números altos, más advertencias. Los valores válidos están comprendidos entre 0 y 4:
Nivel de advert Significado
encia
0 Desactiva la emisión de todos los mensajes de advertencia.

1 Muestra los mensajes de advertencia graves.

2 Muestra las advertencias de nivel 1 y también algunas otras menos graves, como las relativas a la ocultaci
ón de miembros de clase.

3 Muestra las advertencias de nivel 2 y también algunas otras menos graves, como las relativas a expresion
es que siempre se evalúan como true o false.

4 (valor predeter Muestra todas las advertencias de nivel 3 y también las informativas.
minado)

Comentarios
Para obtener información sobre un error o una advertencia, puede buscar su código en el índice de la Ayuda. Encontrará otras
formas de obtener información sobre errores o advertencias en Cómo: Buscar temas de Ayuda para los errores del compilador.
Si desea tratar todas las advertencias como errores, utilice /warnaserror. Utilice /nowarn para deshabilitar determinadas
advertencias.
/w es la forma abreviada de /warn.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique la propiedad Nivel de advertencia.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea WarningLevel.
Ejemplo
Para compilar in.cs y hacer que el compilador sólo muestre las advertencias de nivel 1, ejecute:

csc /warn:1 in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/warnaserror (Tratar advertencias como errores) (Opciones del


compilador de C#)
La opción /warnaserror+ trata todas las advertencias como errores

/warnaserror[<U>+</U> | -][:warning-list]

Comentarios
Los mensajes que, normalmente, se mostrarían como advertencias se muestran como errores y el proceso de generación se
detiene (no se generan archivos de resultados).
De manera predeterminada, está activada la opción /warnaserror-, que hace que las advertencias no impidan la generación de
un archivo de resultados. La opción /warnaserror, que equivale a /warnaserror+, hace que se traten las advertencias como
errores.
De manera optativa, si desea que sólo se traten como errores algunas advertencias concretas, puede especificar sus números
en una lista separada por comas.
Utilice /warn para especificar el nivel de advertencia que debe mostrar el compilador. Utilice /nowarn para deshabilitar
determinadas advertencias.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra la página Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Generar.
3. Modifique el valor de la propiedad Tratar advertencias como errores.
Para establecer esta opción del compilador mediante programación, vea TreatWarningsAsErrors.
Ejemplo
Para compilar in.cs y hacer que el compilador no muestre advertencias, ejecute:

csc /warnaserror in.cs


csc /warnaserror:642,649,652 in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/win32res (Importar un archivo .ico) (Opciones del compilador


de C#)
La opción /win32icon inserta un archivo .ico en el archivo de resultados, lo que le proporciona la apariencia deseada en el
Explorador de Windows.

/win32icon:filename

Argumentos
filename
Archivo .ico que se desea agregar al archivo de resultados.
Comentarios
Los archivos .ico pueden crearse con el compilador de recursos. El compilador de recursos se invoca cuando se compila un
programa de Visual C++; se crea un archivo .ico a partir del archivo .rc.
Vea /linkresource (para hacer referencia a) o /resource (para asociar) un archivo de recursos de .NET Framework. Vea
/win32res para importar un archivo .res.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
1. Abra las páginas Propiedades del proyecto. Para obtener información detallada, vea
Cómo: Especificar las propiedades del proyecto (C#, J#).
2. Haga clic en la página de propiedades Aplicación.
3. Modifique el valor de la propiedad Icono de aplicación.
Para obtener información sobre cómo establecer esta opción del compilador mediante programación, vea ApplicationIcon.
Ejemplo
Para compilar in.cs y asociar un archivo .ico rf.ico con el fin de generar in.exe, ejecute:

csc /win32icon:rf.ico in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

/win32res (Importar un archivo de recursos Win32) (Opciones


del compilador de C#)
La opción /win32resinserta un recurso Win32 en el archivo de resultados.

/win32res:filename

Argumentos
filename
Archivo de recursos que se desea agregar al archivo de resultados.
Comentarios
Los archivos de recursos Win32 se pueden crear con el compilador de recursos. El compilador de recursos se invoca cuando se
compila un programa de Visual C++; se crea un archivo .res a partir del archivo .rc.
Un recurso Win32 puede contener información de versión o un mapa de bits (icono) que ayudan a identificar la aplicación en
el Explorador de Windows. Si no se especifica la opción /win32res, el compilador generará información de versión basada en
la versión del ensamblado.
Vea /linkresource (para hacer referencia a) o /resource (para asociar) un archivo de recursos de .NET Framework.
Esta opción del compilador no está disponible en Visual Studio y no se puede cambiar mediante programación.
Ejemplo
Para compilar in.cs y asociar un archivo de recursos Win32 rf.res con el fin de generar in.exe, ejecute:

csc /win32res:rf.res in.cs

Vea también
Otros recursos
Opciones del compilador de C#
Referencia del lenguaje C#

Cómo: Buscar temas de Ayuda para los errores del compilador


Nota
Los cuadros de diálogo y comandos de menú que verá en Visual Studio pueden variar con respecto a los descritos en la Ayu
da en función de su edición o configuración activa. Para cambiar su configuración, elija Importar y exportar configuraciones,
en el menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Todos los errores del compilador de C# tienen temas correspondientes que explican por qué se genera un error, y en algunos
casos, cómo corregirlo. Para obtener ayuda sobre un mensaje de error concreto, pruebe una de las siguientes opciones:
Procedimiento
Para encontrar la ayuda de un error
Haga clic en el número de error en el Resultados (Ventana) y presione F1.
-O bien-
Escriba el número de error en el cuadro Buscar del Índice.
-O bien-
Escriba el número de error en la página Buscar.
Vea también
Otros recursos
Opciones del compilador de C#
Referencia de Visual C#: errores y advertencias

Errores del compilador de C#


Esta sección muestra los errores del compilador de C# en orden numérico. Todos los errores del compilador de C# tienen
temas correspondientes que explican porqué se genera un error y, en algunos casos, cómo corregirlo. Para obtener ayuda
sobre un mensaje de error concreto, pruebe una de las siguientes opciones:
Haga clic en el número de error en el Resultados (Ventana) y presione F1.
Escriba el número de error en el cuadro Buscar del Índice.
Escriba el número de error en la página Buscar.
Busque el error en la lista Contenido.
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de la configu
ración activa o la edición. Para cambiar su configuración, elija Importar y exportar configuraciones en el menú Herramientas.
Para obtener más información, vea Valores de configuración de Visual Studio.

Vea también
Otros recursos
Opciones del compilador de C#
Referencia de Visual C#: errores y advertencias

Error del compilador CS0001


Mensaje de error
Error interno del compilador
Internal compiler error
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
éste no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0003


Mensaje de error
Memoria insuficiente
Out of memory
El compilador no pudo asignar memoria virtual suficiente para completar la compilación. Cierre todas las aplicaciones que no
esté utilizando y vuelva a compilar.
También puede resultar conveniente aumentar el tamaño del archivo de paginación y asegurarse de que dispone de espacio
suficiente en disco.
Este error también puede aparecer como resultado de la existencia de versiones no coincidentes de .NET Framework SDK y del
compilador de C#, o de uno o varios archivos dañados compatibles con el compilador de C#; para solucionarlo vuelva a
instalar Visual Studio.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0004


Warning treated as error
Advertencia tratada como error
Se ha compilado con la opción de compilador /warnaserror, que hace que el compilador genere la advertencias como si fueran
errores.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0005


Mensaje de error
La opción 'opción_compilador' del compilador debe ir seguida de un argumento
Compiler option 'compiler_option' must be followed by an argument
Algunas opciones del compilador requieren el uso de parámetros. Si no pasa los argumentos requeridos por la opción del
compilador, se genera el error número CS0005.
Para obtener más información, vea Opciones del compilador de C#.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0006


Mensaje de error
No se puede encontrar el archivo de metadatos 'nombre_dll'
Metadata file 'dll_name' could not be found
Se compiló el programa y se le pasó explícitamente el nombre de un archivo que contenía metadatos; sin embargo, no se
encontró el archivo .dll. Para obtener más información, vea /reference (Importar metadatos) (Opciones del compilador de C#).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0007


Mensaje de error
Error de inicialización inesperado de Common Language Runtime — 'descripción'
Unexpected common language runtime initialization error — 'description'
Este error aparece si no se ha podido cargar el motor en tiempo de ejecución. Esto puede ocurrir si la versión de Common
Language Runtime que el compilador intenta cargar no está presente en el equipo, o si la instalación o la configuración de
Common Language Runtime están dañadas.
Esto puede pasar si se ha cambiado el archivo csc.exe.config. Este archivo se configura durante la instalación y no se debería
cambiar. Si hay alguna posibilidad de que se haya modificado el archivo csc.exe.config, revíselo para asegurarse de que la
versión del motor en tiempo de ejecución especificada en el archivo esté presente en el equipo. Si la versión correcta está
presente, puede que esté dañado. Vuelva a instalar Common Language Runtime
Referencia de Visual C#: errores y advertencias

Error del compilador CS0008


Mensaje de error
Error inesperado al leer metadatos del archivo 'archivo' — 'descripción'
Unexpected error reading metadata from file 'file' — 'description'
Se abrió con éxito un archivo DLL para recuperar metadatos, pero se encuentra dañado, por lo que no se pudieron leer los
datos. Para obtener más información, vea /reference (Importar metadatos) (Opciones del compilador de C#).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0009


Mensaje de error
No se puede abrir el archivo de metadatos 'archivo' — 'descripción'
Metadata file 'file' could not be opened — 'description'
El archivo especificado mediante la opción /reference del compilador no contiene metadatos válidos.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0011


Mensaje de error
La clase base o la interfaz 'clase' del ensamblado 'ensamblado' a la que hace referencia el tipo 'tipo' no se ha podido resolver
The base class or interface 'class' in assembly 'assembly' referenced by type 'type' could not be resolved
Una clase importada desde un archivo mediante /reference se deriva de una clase o implementa una interfaz que no se
encuentra. Esto puede ocurrir si no se incluye también un archivo DLL requerido en la compilación con /reference.
Para obtener más información, vea Agregar referencia (Cuadro de diálogo) y
/reference (Importar metadatos) (Opciones del compilador de C#).
Ejemplo
// CS0011_1.cs
// compile with: /target:library

public class Outer


{
public class B { }
}

El segundo crea un archivo DLL que define una clase C derivada de la clase B creada en el ejemplo anterior.

// CS0011_2.cs
// compile with: /target:library /reference:CS0011_1.dll
// post-build command: del /f CS0011_1.dll
public class C : Outer.B {}

El tercero reemplaza el archivo DLL creado por el primer paso y omite la definición de la clase interna B.

// CS0011_3.cs
// compile with: /target:library /out:cs0011_1.dll
public class Outer {}

Por último, el cuarto archivo hace referencia a la clase C definida en el segundo ejemplo, que se deriva de la clase B y que ya no
está.
El ejemplo siguiente genera el error CS0011.

// CS0011_4.cs
// compile with: /reference:CS0011_1.dll /reference:CS0011_2.dll
// CS0011 expected

class M
{
public static void Main()
{
C c = new C();
}
}

Vea también
Referencia
Agregar referencia (Cuadro de diálogo)
/reference (Importar metadatos) (Opciones del compilador de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0012


Mensaje de error
El tipo 'tipo' está definido en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado
'ensamblado'.
The type 'type' is defined in an assembly that is not referenced. You must add a reference to assembly 'assembly'.
No se encuentra la definición de un tipo al que se hace referencia. Esto puede ocurrir si no se incluye una DLL requerida en la
compilación. Para obtener más información, vea Agregar referencia (Cuadro de diálogo) y
/reference (Importar metadatos) (Opciones del compilador de C#).
La siguiente secuencia de compilaciones dará como resultado el error CS0012:

// cs0012a.cs
// compile with: /target:library
public class A {}

A continuación:

// cs0012b.cs
// compile with: /target:library /reference:cs0012a.dll
public class B
{
public static A f()
{
return new A();
}
}

A continuación:

// cs0012c.cs
// compile with: /reference:cs0012b.dll
class C
{
public static void Main()
{
object o = B.f(); // CS0012
}
}

Se puede resolver el error CS0012 compilando con /reference:b.dll;a.dll.


Referencia de Visual C#: errores y advertencias

Error del compilador CS0013


Mensaje de error
Error inesperado al escribir metadatos en el archivo 'archivo' — 'descripción'
Unexpected error writing metadata to file 'file' — 'description'
El Common Language Runtime de .NET Framework no pudo generar metadatos. Asegúrese de que la ruta de acceso sea
correcta y de que el disco no esté lleno. Si el problema persiste, posiblemente sea necesario reparar o reinstalar Visual Studio
y/o .NET Framework.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0014


Mensaje de error
No se encuentra el archivo requerido 'archivo'
Required file 'file' could not be found
El compilador requiere un archivo pero éste no se encuentra en el sistema. Asegúrese de que la ruta de acceso sea correcta. Si
el archivo es un archivo de sistema Visual Studio, es posible que sea preciso reparar la instalación o quitar y reinstalar Visual
Studio completamente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0015


Mensaje de error
El nombre del tipo 'tipo' es demasiado largo
The name of type 'type' is too long
El nombre completo de un tipo definido por el usuario debe ser inferior o igual a 2048 caracteres.
En el código siguiente se genera el error CS0015:

// CS0015.cs
namespace
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
{
namespace
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
{
namespace
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
{
public class
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC // CS0015
{
public static void Main()
{
}
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0016


Mensaje de error
No se puede escribir en el archivo de resultados 'archivo' — 'causa'
Could not write to output file 'file' — 'reason'
El compilador no pudo escribir en un archivo de resultados. Compruebe la ruta de acceso al archivo para asegurarse de que
existe. Si ya hay un archivo generado anteriormente en esa ubicación, asegúrese de que es modificable y de que ningún
proceso tiene bloqueado el archivo actualmente. Por ejemplo, asegúrese de que su archivo ejecutable no está cargado en
memoria cuando intente generarlo.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0017


Mensaje de error
El programa 'nombre de archivo de resultados' tiene más de un punto de entrada definido: 'función'
Program 'output file name' has more than one entry point defined: function
Un programa sólo puede tener un método Main.
Para resolver este error, se pueden eliminar todos los métodos Main del código, salvo uno, o se puede utilizar la opción /main
del compilador para especificar qué método Main se desea usar.
El código siguiente genera el error CS0017:

// CS0017.cs
public class clx
{
static public void Main()
{
}
}
public class cly
{
public static void Main() // CS0017, delete one Main or use /main
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0019


Mensaje de error
El operador 'operador' no se puede aplicar a operandos del tipo 'tipo' y 'tipo'
Operator 'operator' cannot be applied to operands of type 'type' and 'type'
Un operador binario está actuando en tipos de datos para los que no fue diseñado. Por ejemplo, no se puede utilizar el
operador || en las cadenas.
Ejemplo
En este ejemplo, la lógica condicional debe especificarse fuera del atributo ConditionalAttribute. Sólo se puede pasar un
símbolo predefinido al atributo ConditionalAttribute.
El código siguiente genera el error CS0019.

// CS0019.cs
// compile with: /target:library
using System.Diagnostics;
public class MyClass
{
[ConditionalAttribute("DEBUG" || "TRACE")] // CS0019
public void TestMethod() {}

// OK
[ConditionalAttribute("DEBUG")]
public void TestMethod2() {}
}

Vea también
Referencia
Operadores (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0020


Mensaje de error
División entre constante cero
Division by constant zero
Una expresión usa un valor literal (no variable) cero en el denominador de una operación de división. La división por cero no
está definida y, por tanto, no es válida.
El código siguiente genera el error CS0020:

// CS0020.cs
namespace x
{
public class b
{
public static void Main()
{
1 / 0; // CS0020
}
}
}

Vea también
Referencia
Operadores (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0021


Mensaje de error
No se puede aplicar la indización con [] a una expresión del tipo 'tipo'
Cannot apply indexing with [] to an expression of type 'type'
Se intentó obtener acceso a un valor a través de un indizador en un tipo de datos que no admite
Indizadores (Guía de programación de C#).
Es posible que reciba CS0021 si intenta utilizar un indizador en un ensamblado de C++. En este caso, decore la clase de C++
con el atributo DefaultMember de modo que el compilador de C# sepa qué indizador es el predeterminado. El código
siguiente genera el error CS0021:
Ejemplo
Este archivo se compila a un archivo .dll (con el atributo DefaultMember marcado como comentario) para generar el error.

// CPP0021.cpp
// compile with: /clr /LD
using namespace System::Reflection;
// Uncomment the following line to resolve
//[DefaultMember("myItem")]
public ref class MyClassMC
{
public:
property int myItem[int]
{
int get(int i){ return 5; }
void set(int i, int value) {}
}
};

A continuación figura el archivo C# que llama al archivo .dll. Este archivo intenta tener acceso a la clase a través de un
indizador, pero se genera el error porque no se ha declarado ningún miembro como indizador predeterminado para su uso.

// CS0021.cs
// compile with: /reference:CPP0021.dll
public class MyClass
{
public static void Main()
{
MyClassMC myMC = new MyClassMC();
int j = myMC[1]; // CS0021
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0022


Mensaje de error
Número incorrecto de índices dentro de [], se esperaba 'número'
Wrong number of indices inside [], expected 'number'
Una operación de acceso a la matriz ha especificado un número incorrecto de dimensiones dentro de los corchetes. Para
obtener más información, vea Matrices (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0022:

// CS0022.cs
public class MyClass
{
public static void Main()
{
int[] a = new int[10];
a[0] = 0; // single-dimension array
a[0,1] = 9; // CS0022, the array does not have two dimensions
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0023


Mensaje de error
El operador 'operador' no se puede aplicar al operando del tipo 'tipo'
Operator 'operator' cannot be applied to operand of type 'type'
Se intentó aplicar un operador a una variable cuyo tipo no está diseñado para trabajar con ese operador. Para obtener más
información, vea Tipos de datos (Guía de programación de C#) y Operadores de C#.
El código siguiente genera el error CS0023:

// CS0023.cs
namespace x
{
public class a
{
public static void Main()
{
string s = "hello";
s = -s; // CS0023, minus operator not allowed on strings
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0026


Mensaje de error
La palabra clave 'this' no es válida en una propiedad, método o inicializador de campo estáticos
Keyword 'this' is not valid in a static property, static method, or static field initializer
La palabra clave this (Referencia de C#) hace referencia a un objeto, que es una instancia de un tipo. Puesto que los métodos
estáticos son independientes de cualquier instancia de la clase contenedora, la palabra clave "this" no tiene sentido y, por lo
tanto, no se permite. Para obtener más información, vea Clases estáticas y sus miembros (Guía de programación de C#) y
Objetos (Guía de programación de C#).
Ejemplo
El ejemplo siguiente genera el error CS0026:

// CS0026.cs
public class A
{
public static int i = 0;
public static void Main()
{
// CS0026
this.i = this.i + 1;
// Try the following line instead:
// i = i + 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0027


Mensaje de error
La palabra clave 'this' no está disponible en el contexto actual
Keyword 'this' is not available in the current context
Se encontró la palabra clave this (Referencia de C#) fuera de una propiedad, un método o un constructor.
Para corregir este error, modifique la instrucción de modo que ya no se utilice la palabra clave this, y/o mueva una parte o la
totalidad de la instrucción al interior de una propiedad, un método o un constructor.
El ejemplo siguiente genera el error CS0027:

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication3
{
class MyClass
{

int err1 = this.Fun() + 1; // CS0027

public int Fun()


{
return 10;
}

public void Test()


{
// valid use of this
int err = this.Fun() + 1;
Console.WriteLine(err);
}

public static void Main()


{
MyClass c = new MyClass();
c.Test();
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0029


Mensaje de error
No se puede convertir implícitamente el tipo 'tipo' a 'tipo'
Cannot implicitly convert type 'type' to 'type'
El compilador requiere una conversión explícita. Por ejemplo, puede ser necesario convertir explícitamente un valor r para que
tenga el mismo tipo que un valor l. De lo contrario, se deberán proporcionar rutinas de conversión para poder admitir ciertas
sobrecargas de operadores.
Las conversiones deben producirse cuando se asigna una variable de un tipo a una variable de un tipo diferente. Cuando se
realiza una asignación entre variables de tipos diferentes, el compilador debe convertir el tipo de la parte derecha del operador
de asignaciones al tipo de la parte izquierda del operador de asignaciones. Considere el código siguiente:

int i = 50;
long lng = 100;
i = lng;

i = lng; realiza una asignación, pero los tipos de datos de las variables a la izquierda y a la derecha del operador de
asignaciones no coinciden. Antes de realizar la asignación, el compilador convierte implícitamente la variable lng, que es de
tipo long, a int. Se realiza de forma implícita porque ningún código indicó explícitamente al compilador que realizara esta
conversión. El problema de este código es que se considera una conversión de restricción, y el compilador no permite
conversiones de restricción implícitas, porque podrían perderse datos.
Se produce una conversión de restricción cuando se realiza la conversión a un tipo de datos que ocupa menos espacio de
almacenamiento en la memoria que el tipo de datos desde el que se realiza la conversión. Por ejemplo, la conversión de long a
int sería considerada como una conversión de restricción. Un long ocupa 8 bytes de memoria, mientras que un int ocupa 4
bytes. Para ver cómo puede producirse una pérdida de datos, observe el siguiente ejemplo:

int i = 50;
long lng = 3147483647;
i = lng;

La variable lng contiene ahora un valor que no se puede almacenar en la variable i porque es demasiado grande. Si
tuviéramos que convertir este valor a un tipo int, perderíamos parte de los datos y el valor convertido no sería el mismo que el
valor antes de la conversión.
Una conversión de ampliación sería lo contrario que una conversión de restricción. En las conversiones de ampliación, se
realiza la conversión a un tipo de datos que ocupa más espacio en la memoria que el tipo de datos desde el que se realiza la
conversión. He aquí un ejemplo de una conversión de ampliación:

int i = 50;
long lng = 100;
lng = i;

Observe la diferencia que existe entre este ejemplo de código y el primero. En esta ocasión, la variable lng se encuentra a la
izquierda del operador de asignaciones, por lo que es el destino de la asignación. Antes de que pueda realizarse el trabajo, el
compilador debe convertir implícitamente la variable i, que es de tipo int, al tipo long. Se trata de una conversión de
ampliación, puesto que se convierte de un tipo que ocupa 4 bytes de memoria (int) a un tipo que ocupa 8 bytes de memoria
(long). Las conversiones de ampliación implícitas están permitidas porque no existe riesgo de pérdida de datos. Cualquier valor
que se pueda almacenar en un tipo int también se puede almacenar en un tipo long.
Sabemos que las conversiones de restricción implícitas no están permitidas, de modo que para compilar este código debemos
convertir de forma explícita el tipo de datos. Las conversiones explícitas se realizan mediante conversiones de tipo. En C# se
entiende por conversión la conversión de un tipo de datos a otro. Para obtener el código que se debe compilar debemos
utilizar la siguiente sintaxis:

int i = 50;
long lng = 100;
i = (int) lng; // cast to int
Con la tercera línea de código se le indica al compilador que, antes de que se realice la asignación, convierta explícitamente a
int la variable lng, que es de tipo long. No olvide que con una conversión de restricción se pueden perder datos. Las
conversiones de restricción deben utilizarse con precaución y, aunque se realizará la compilación del código, podrían
producirse resultados inesperados en tiempo de ejecución.
Esto sólo hace referencia a los tipos de valores. Cuando se trabaja con tipos de valores, se hace directamente con los datos
almacenados en la variable. Sin embargo, .NET Framework también tiene tipos de referencia. Cuando se trabaja con tipos de
referencia, se hace con una referencia a una variable, no con los datos reales. Son ejemplos de tipos de referencia las clases, las
interfaces y las matrices. No es posible convertir implícita o explícitamente un tipo de referencia en otro, a no ser que el
compilador permita la conversión específica o bien que los operadores de conversión necesarios estén implementados.
El código siguiente genera el error CS0029:

// CS0029.cs
public class MyInt
{
private int x = 0;

// Uncomment this conversion routine to resolve CS0029


/*
public static implicit operator int(MyInt i)
{
return i.x;
}
*/

public static void Main()


{
MyInt myInt = new MyInt();
int i = myInt; // CS0029
}
}

Vea también
Conceptos
Operadores de conversión (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0030


Mensaje de error
No se puede convertir el tipo 'tipo' en 'tipo'
Cannot convert type 'type' to 'type'
Se deben proporcionar rutinas de conversión para poder admitir ciertas sobrecargas de operadores. Para obtener más
información, vea Operadores de conversión (Guía de programación de C#).
El código siguiente genera el error CS0030:

// CS0030.cs
namespace x
{
public class iii
{
/*
public static implicit operator iii(int aa)
{
return null;
}

public static implicit operator int(iii aa)


{
return 0;
}
*/

public static iii operator ++(iii aa)


{
return (iii)0; // CS0030
// uncomment the conversion routines to resolve CS0030
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0031


Mensaje de error
El valor constante 'valor' no se puede convertir en 'tipo'
Constant value 'value' cannot be converted to a 'type'
Se intentó asignar un valor a una variable cuyo tipo no puede almacenar el valor. Para obtener más información, vea
Tipos de datos (Guía de programación de C#).
El código siguiente genera el error CS0031:

// CS0031.cs
namespace x
{
public class a
{
public static void Main()
{
byte i = 512; // CS0031, 512 cannot fit in byte
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0034


Mensaje de error
El operador 'operador' es ambiguo en operandos del tipo 'tipo1' y 'tipo2'
Operator 'operator' is ambiguous on operands of type 'type1' and 'type2'
Se utilizó un operador en dos objetos y el compilador detectó más de una conversión. Las conversiones han de ser únicas, por
lo que se requiere una conversión explícita de tipo 'cast' o hacer que una de las conversiones sea explícita. Para obtener más
información, vea Operadores de conversión (Guía de programación de C#).
El código siguiente genera el error CS0034:

// CS0034.cs
public class A
{
// allows for the conversion of A object to int
public static implicit operator int (A s)
{
return 0;
}

public static implicit operator string (A i)


{
return null;
}
}

public class B
{
public static implicit operator int (B s)
// one way to resolve this CS0034 is to make one conversion explicit
// public static explicit operator int (B s)
{
return 0;
}

public static implicit operator string (B i)


{
return null;
}

public static implicit operator B (string i)


{
return null;
}
public static implicit operator B (int i)
{
return null;
}
}

public class C
{
public static void Main ()
{
A a = new A();
B b = new B();
b = b + a; // CS0034
// another way to resolve this CS0034 is to make a cast
// b = b + (int)a;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0035


Mensaje de error
El operador 'operador' es ambiguo en un operando del tipo 'tipo'
Operator 'operator' is ambiguous on an operand of type 'type'
El compilador tiene más de una conversión disponible y no se le ha indicado cuál debe realizar antes de aplicar el operador.
Para obtener más información, vea Templated User Defined Conversions y
Operadores de conversión (Guía de programación de C#).
El código siguiente genera el error CS0035:

// CS0035.cs
class MyClass
{
private int i;
public MyClass(int i)
{
this.i = i;
}

public static implicit operator double(MyClass x)


{
return (double) x.i;
}

public static implicit operator decimal(MyClass x)


{
return (decimal) x.i;
}
}

class MyClass2
{
static void Main()
{
MyClass x = new MyClass(7);
object o = - x; // CS0035
// try a cast:
// object o = - (double)x;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0036


Mensaje de error
Un parámetro Out no puede tener un atributo '[In]'
An out parameter cannot have the '[In]' attribute
Actualmente, el atributo In no se permite en un parámetro out.
El código siguiente genera el error CS0036:

// CS0036.cs

using System;
using System.Runtime.InteropServices;

public class MyClass


{
public static void TestOut([In] out char TestChar) // CS0036
// try the following line instead
// public static void TestOut(out char TestChar)
{
TestChar = 'b';
Console.WriteLine(TestChar);
}

public static void Main()


{
char i; //variable to receive the value
TestOut(out i); // the arg must be passed as out
Console.WriteLine(i);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0037


Mensaje de error
No se puede convertir null en 'tipo' porque es un tipo de valor
Cannot convert null to 'type' because it is a value type
El compilador no puede asignar null a un tipo de valor; null sólo se puede asignar a un tipo de referencia u otro tipo que acepte
valores null. struct es un tipo de valor. Para obtener más información, vea
Tipos que aceptan valores NULL (Guía de programación de C#).
El código siguiente genera el error CS0037:

// CS0037.cs
public struct s
{
}
class a
{
public static void Main()
{
int i = null; // CS0037
s ss = null; // CS0037
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0038


Mensaje de error
No se puede obtener acceso a un miembro no estático de tipo externo 'tipo1' mediante el tipo anidado 'tipo2'
Cannot access a nonstatic member of outer type 'type1' via nested type 'type2'
Un campo de una clase no queda automáticamente disponible para una clase anidada. Para que esté disponible en una clase
anidada, el campo debe ser static. De otra forma, se deberá crear una instancia de la clase externa. Para obtener más
información, vea Tipos anidados (Guía de programación de C#).
El código siguiente genera el error CS0038:

// CS0038.cs
class OuterClass
{
public int count;
// try the following line instead
// public static int count;

class InnerClass
{
void func()
{
// or, create an instance
// OuterClass class_inst = new OuterClass();
// int count2 = class_inst.count;
int count2 = count; // CS0038
}
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0039


Mensaje de error
No se puede convertir el tipo 'tipo1' en 'tipo2' mediante una conversión integrada
Cannot convert type 'type1' to 'type2' via a built-in conversion
El operador as (Referencia de C#) se puede utilizar en las conversiones de herencia, en las conversiones de referencia y en
conversiones 'boxing'. Para obtener más información, vea Operadores de conversión (Guía de programación de C#).
Ejemplo
En el código siguiente se genera el error CS0039:

// CS0039.cs
using System;
class A
{
}
class B: A
{
}
class C: A
{
}
class M
{
static void Main()
{
A a = new C();
B b = new B();
C c;

// This is valid; there is a built-in reference


// conversion from A to C.
c = a as C;

//The following generates CS0039; there is no


// built-in reference conversion from B to C.
c = b as C; // CS0039
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0040


Mensaje de error
Error inesperado en la inicialización de la información de depuración — 'causa'
Unexpected debug information initialization error — 'reason'
Este error puede producirse al usar la opción /debug del compilador e indica que el compilador no pudo escribir en el archivo
.pdb. Las posibles soluciones a este error comprenden volver a instalar Visual Studio, asegurándonos de que el compilador
posee acceso de escritura a un archivo o directorio, o evitar compilar con la opción /debug.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0041


Mensaje de error
Error inesperado al escribir la información de depuración en el archivo 'archivo' — 'causa'
Unexpected error writing debug information to file 'file' — 'reason'
Este error puede producirse al utilizar la opción /debug del compilador. Si encuentra este error, elimine los archivos PDB del
directorio bin y vuelva a compilar. Si el error persiste, es posible que sea necesario reparar o volver a instalar Visual Studio.
Como último recurso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0042


Mensaje de error
Error inesperado al crear el archivo de información de depuración 'archivo' — 'causa'
Unexpected error creating debug information file 'file' — 'reason'
El compilador no pudo crear la información de depuración; causa contiene información adicional sobre las circunstancias que
dan lugar al error.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0043


Mensaje de error
El archivo PDB 'archivo' tiene un formato incorrecto u obsoleto. Es necesario eliminarlo y volver a generarlo.
PDB file 'file' has an incorrect or out-of-date format. Delete it and rebuild.
Elimine el archivo .pdb de esta compilación y vuelva a compilar.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0050


Mensaje de error
Incoherencia de accesibilidad: el tipo de valor devuelto 'tipo' es menos accesible que el método 'método'
Inconsistent accessibility: return type 'type' is less accessible than method 'method'
El tipo de valor devuelto y cada uno de los tipos a los que se hace referencia en la lista de parámetros formales de un método
deben tener como mínimo el mismo nivel de accesibilidad que el método. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Ejemplo
En el ejemplo siguiente se genera el error CS0050 porque no se proporciona ningún modificador de accesibilidad para
MyClass y, por tanto, su nivel de acceso predeterminado es private.

// CS0050.cs
class MyClass //accessibility defaults to private
// try the following line instead
// public class MyClass
{
}

public class MyClass2


{
public static MyClass MyMethod() // CS0050
{
return new MyClass();
}

public static void Main() { }


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0051


Mensaje de error
Incoherencia de accesibilidad: el tipo de parámetro 'tipo' es menos accesible que el método 'método'
Inconsistent accessibility: parameter type 'type' is less accessible than method 'method'
El tipo-de-valor-devuelto y cada uno de los tipos a los que se hace referencia en la lista-de-parámetros-formales de un método
deben tener como mínimo el mismo nivel de accesibilidad que el método. Asegúrese de que los tipos utilizados en las firmas
de método no sean privados por error debido a la omisión del modificador public. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0051:

// CS0051.cs
public class A
{
// Try making B public since F is public
// B is implicitly private here
class B
{
}

public static void F(B b) // CS0051


{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0052


Mensaje de error
Incoherencia de accesibilidad: el tipo de campo 'tipo' es menos accesible que el campo 'campo'
Inconsistent accessibility: field type 'type' is less accessible than field 'field'
El tipo de un campo no puede ser menos accesible que el propio campo porque todas las construcciones públicas deben
devolver un objeto accesible públicamente.
Ejemplo
El código siguiente genera el error CS0052:

// CS0052.cs
class MyClass
// try the following line instead
// public class MyClass
{
}

public class MyClass2


{
public MyClass mf; // CS0052
}

public class MyClass3


{
public static void Main()
{
}
}

Vea también
Referencia
Palabras clave de C#
Modificadores de acceso (Referencia de C#)
Niveles de accesibilidad (Referencia de C#)
Modificadores (Referencia de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0053


Mensaje de error
Incoherencia de accesibilidad: el tipo de propiedad 'tipo' es menos accesible que la propiedad 'propiedad'
Inconsistent accessibility: property type 'type' is less accessible than property 'property'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0053:

// CS0053.cs
class MyClass //defaults to private accessibility
// try the following line instead
// public class MyClass
{
}
public class MyClass2
{
public MyClass myProperty // CS0053
{
get
{
return new MyClass();
}
set
{
}
}
}

public class MyClass3


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0054


Mensaje de error
Incoherencia de accesibilidad: el tipo de valor devuelto del indizador 'tipo' es menos accesible que el indizador 'indizador'
Inconsistent accessibility: indexer return type 'type' is less accessible than indexer 'indexer'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0054:

// CS0054.cs
class MyClass
// try the following line instead
// public class MyClass
{
}
public class MyClass3
{
public MyClass this[int i] // CS0054
{
get
{
return new MyClass();
}
}
}

public class MyClass2


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0055


Mensaje de error
Incoherencia de accesibilidad: el tipo de parámetro 'tipo' es menos accesible que el indizador 'indizador'
Inconsistent accessibility: parameter type 'type' is less accessible than indexer 'indexer'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0055:

// CS0055.cs
class MyClass //defaults to private accessibility
// try the following line instead
// public class MyClass
{
}
public class MyClass2
{
public int this[MyClass myClass] // CS0055
{
get
{
return 0;
}
}
}

public class MyClass3


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0056


Mensaje de error
Incoherencia de accesibilidad: el tipo de valor devuelto 'tipo' es menos accesible que el operador 'operador'
Inconsistent accessibility: return type 'type' is less accessible than operator 'operator'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0056:

// CS0056.cs
class MyClass
// try the following line instead
// public class MyClass
{
}
public class A
{
public static implicit operator MyClass(A a) // CS0056
{
return new MyClass();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0057


Mensaje de error
Incoherencia de accesibilidad: el tipo de parámetro 'tipo' es menos accesible que el operador 'operador'
Inconsistent accessibility: parameter type 'type' is less accessible than operator 'operator'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0057:

// CS0057.cs
class MyClass //defaults to private accessibility
// try the following line instead
// public class MyClass
{
}
public class MyClass2
{
public static implicit operator MyClass2(MyClass iii) // CS0057
{
return new MyClass2();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0058


Mensaje de error
Incoherencia de accesibilidad: el tipo de valor devuelto 'tipo' es menos accesible que el delegado 'delegado'
Inconsistent accessibility: return type 'type' is less accessible than delegate 'delegate'
Una construcción pública debe devolver un objeto accesible públicamente. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
En el ejemplo siguiente se genera el error CS0058 porque no se aplica ningún modificador de acceso a MyClass y, por tanto, se
le da acceso privado de forma predeterminada:

// CS0058.cs
class MyClass
// try the following line instead
// public class MyClass
{
}

public delegate MyClass MyClassDel(); // CS0058

public class A
{
public static void Main()
{
}
}

Vea también
Referencia
private (Referencia de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0059


Mensaje de error
Incoherencia de accesibilidad: el tipo de parámetro 'tipo' es menos accesible que el delegado 'delegado'
Inconsistent accessibility: parameter type 'type' is less accessible than delegate 'delegate'
El tipo-de-valor-devuelto y cada uno de los tipos a los que se hace referencia en la lista-de-parámetros-formales de un método
deben tener como mínimo el mismo nivel de accesibilidad que el método. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0059:

// CS0059.cs
class MyClass //defaults to private accessibility
// try the following line instead
// public class MyClass
{
}
public delegate void MyClassDel( MyClass myClass); // CS0059

public class Program


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0060


Mensaje de error
Incoherencia de accesibilidad: la clase base 'clase1' es menos accesible que la clase 'clase2'
Inconsistent accessibility: base class 'class1' is less accessible than class 'class2'
La accesibilidad de la clase debe ser coherente entre la clase base y la clase heredada.
El código siguiente genera el error CS0060:

// CS0060.cs
class MyClass
// try the following line instead
// public class MyClass
{
}

public class MyClass2 : MyClass // CS0060


{
public static void Main()
{
}
}

Vea también
Referencia
Modificadores de acceso (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0061


Mensaje de error
Incoherencia de accesibilidad: la interfaz base 'interfaz 1' es menos accesible que la interfaz 'interfaz 2'
Inconsistent accessibility: base interface 'interface 1' is less accessible than interface 'interface 2'
Una construcción public debe devolver un objeto accesible públicamente.
La accesibilidad de la interfaz no puede restringirse en una interfaz derivada. Para obtener más información, vea
Interfaces (Guía de programación de C#) y Modificadores de acceso (Guía de programación de C#).
El código siguiente genera el error CS0061.

// CS0061.cs
// compile with: /target:library
internal interface A {}
public interface AA : A {} // CS0061

// OK
public interface B {}
internal interface BB : B {}

internal interface C {}
internal interface CC : C {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0065


Mensaje de error
'evento': la propiedad del evento debe tener los descriptores de acceso add y remove
'event' : event property must have both add and remove accessors
Un evento que no sea un campo debe tener ambos métodos de acceso.
El código siguiente genera el error CS0065:

// CS0065.cs
using System;
public delegate void Eventhandler(object sender, int e);
public class MyClass
{
public event EventHandler Click // CS0065,
{
// to fix, uncomment the add and remove definitions
/*
add
{
Click += value;
}
remove
{
Click -= value;
}
*/
}

public static void Main()


{
}
}

Vea también
Conceptos
Eventos (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0066


Mensaje de error
'evento': el evento debe ser de tipo delegado
'event': event must be of a delegate type
La palabra clave event requiere un tipo delegado. Para obtener más información, vea Eventos (Guía de programación de C#) y
Delegados (Guía de programación de C#).
El código siguiente genera el error CS0066:

// CS0066.cs
using System;

public class EventHandler


{
}
// to fix the error, remove the event declaration and the
// EventHandler class declaration, and uncomment the following line
// public delegate void EventHandler();

public class a
{
public event EventHandler Click; // CS0066

private void TestMethod()


{
if (Click != null)
Click();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0068


Mensaje de error
'evento': el evento de una interfaz no puede tener un inicializador
'event': event in interface cannot have initializer
El evento de una interfaz no puede tener un inicializador. Para obtener más información, vea
Interfaces (Guía de programación de C#).
El código siguiente genera el error CS0068:

// CS0068.cs

delegate void MyDelegate();

interface I
{
event MyDelegate d = new MyDelegate(M.f); // CS0068
// try the following line instead
// event MyDelegate d2;
}

class M
{
event MyDelegate d = new MyDelegate(M.f);

public static void f()


{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0069


Mensaje de error
Un evento de una interfaz no puede tener los descriptores de acceso add y remove
An event in an interface cannot have add or remove accessors
No se pueden definir las funciones de descriptor de acceso de un evento en una interfaz. Para obtener más información, vea
Eventos (Guía de programación de C#) y Interfaces (Guía de programación de C#).
El código siguiente genera el error CS0069:

// CS0069.cs
// compile with: /target:library

public delegate void EventHandler();

public interface a
{
event EventHandler Click { remove {} } // CS0069
event EventHandler Click2; // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0070


Mensaje de error
El evento 'evento' sólo puede aparecer a la izquierda de += o -= (excepto cuando se utiliza desde dentro del tipo 'tipo')
The event 'event' can only appear on the left hand side of += or -= (except when used from within the type 'type')
Un evento sólo puede agregar o quitar referencias fuera de la clase en la que está definido. Para obtener más información, vea
Eventos (Guía de programación de C#).
El código siguiente genera el error CS0070:

// CS0070.cs
using System;
public delegate void EventHandler();

public class A
{
public event EventHandler Click;

public static void OnClick()


{
EventHandler eh;
A a = new A();
eh = a.Click;
}

public static void Main()


{
}
}

public class B
{
public int Foo ()
{
EventHandler eh = new EventHandler(A.OnClick);
A a = new A();
eh = a.Click; // CS0070
// try the following line instead
// a.Click += eh;
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0071


Mensaje de error
La implementación explícita de un evento en una interfaz debe utilizar sintaxis de propiedad
An explicit interface implementation of an event must use property syntax
Cuando implemente explícitamente un evento declarado en una interfaz, debe proporcionar manualmente los descriptores de
acceso de evento add y remove, incluidos normalmente en el compilador. El código de descriptor de acceso puede conectar el
evento de interfaz a otro evento de su clase (mostrado a continuación) o a su propio tipo de delegado. Para obtener más
información, vea Cómo: Implementar eventos de interfaz (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0071.

// CS0071.cs
public delegate void MyEvent(object sender);

interface ITest
{
event MyEvent Clicked;
}

class Test : Itest


{
event MyEvent ITest.Clicked; // CS0071

// try the following code instead


/*
private MyEvent clicked;

event MyEvent Itest.Clicked


{
add
{
clicked += value;
}
remove
{
clicked -= value;
}
}
*/
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0072


Mensaje de error
'evento': no se puede reemplazar; 'método' no es un evento
'event' : cannot override; 'method' is not an event
Un evento sólo puede reemplazar a otro evento. Para obtener más información, vea Eventos (Guía de programación de C#).
El código siguiente genera el error CS0072:

// CS0072.cs
delegate void MyDelegate();

class Test1
{
public virtual event MyDelegate MyEvent;
public virtual void VMeth()
{
}

public void FireAway()


{
if (MyEvent != null)
MyEvent();
}
}

class Test2 : Test1


{
public override event MyDelegate VMeth // CS0072
// uncomment the following lines to resolve
// public override event MyDelegate MyEvent
{
add
{
VMeth += value;
// MyEvent += value;
}
remove
{
VMeth -= value;
// MyEvent -= value;
}
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0073


Mensaje de error
Un descriptor de acceso add o remove debe tener un cuerpo
An add or remove accessor must have a body
La palabra clave add o remove de una definición de evento debe tener un cuerpo. Para obtener más información, vea
Eventos (Guía de programación de C#).
El código siguiente genera el error CS0073:

// CS0073.cs
delegate void del();

class Test
{
public event del MyEvent
{
add; // CS0073
// try the following lines instead
// add
// {
// MyEvent += value;
// }
remove
{
MyEvent -= value;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0074


Mensaje de error
'evento': un evento abstracto no puede tener inicializador
'event': abstract event cannot have initializer
Si se marca un evento como abstract, no se puede inicializar. Para obtener más información, vea
Eventos (Guía de programación de C#).
El código siguiente genera el error CS0074:

// CS0074.cs
delegate void D();

abstract class Test


{
public abstract event D e = null; // CS0074
// try the following line instead
// public abstract event D e;

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0075


Mensaje de error
Para convertir un valor negativo, el valor debe ir entre paréntesis
To cast a negative value, you must enclose the value in parentheses
Si la conversión se efectúa mediante una palabra clave que identifica un tipo predefinido, los paréntesis no son necesarios. De
lo contrario, debe colocar los paréntesis porque (x) –y no se considerará una expresión de conversión. De la especificación de
C#, sección 7.6.6:
De la regla de anulación de ambigüedades se deduce que, si x e y son identificadores, (x)y, (x)(y) y (x)(-y) son expresiones de
conversión, pero (x)-y no lo es, aunque x identifique un tipo. No obstante, si x es una palabra clave que identifica un tipo
predefinido (como int), las cuatro formas son expresiones de conversión de tipos (porque esta palabra clave nunca podría ser
una expresión por sí misma).
El código siguiente genera el error CS0075:

// CS0075
namespace MyNamespace
{
enum MyEnum { }
public class MyClass
{
public static void Main()
{
// To fix the error, place the negative
// values below in parentheses
int i = (System.Int32) - 4; //CS0075
MyEnum e = (MyEnum) - 1; //CS0075
System.Console.WriteLine(i); //to avoid warning
System.Console.WriteLine(e); //to avoid warning
}
}
}

Vea también
Referencia
Conversión (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0076


Mensaje de error
El nombre de enumerador 'value__' está reservado y no se puede utilizar
The enumerator name 'value__' is reserved and cannot be used
Un elemento de una enumeración no puede tener un identificador denominado value__.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0077


Mensaje de error
El operador as se debe utilizar con un tipo de referencia ('tipo' es un tipo de valor)
The as operator must be used with a reference type ('type' is a value type)
Se pasó al operador as un tipo de valor. Debido a que as puede devolver null, sólo se le pueden pasar tipos de referencia.
El código siguiente genera el error CS0077:

// CS0077.cs
using System;

class C
{
}

struct S
{
}

class M
{
public static void Main()
{
object o1, o2;
C c;
S s;

o1 = new C();
o2 = new S();

s = o2 as S; // CS0077, S is not a reference type.


// try the following line instead
// c = o1 as C;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0079


Mensaje de error
El evento 'evento' sólo puede aparecer a la izquierda de += o -=
The event 'event' can only appear on the left hand side of += or -=
Se llamó incorrectamente a un evento. Para obtener más información, vea Eventos (Guía de programación de C#) y
Delegados (Guía de programación de C#).
El código siguiente genera el error CS0079:

// CS0079.cs
using System;

public delegate void MyEventHandler();

public class Class1


{
private MyEventHandler _e;

public event MyEventHandler Pow


{
add
{
_e += value;
Console.WriteLine("in add accessor");
}
remove
{
_e -= value;
Console.WriteLine("in remove accessor");
}
}

public void Handler()


{
}

public void Fire()


{
if (_e != null)
{
Pow(); // CS0079
// try the following line instead
// _e();
}
}

public static void Main()


{
Class1 p = new Class1();
p.Pow += new MyEventHandler(p.Handler);
p._e();
p.Pow += new MyEventHandler(p.Handler);
p._e();
p._e -= new MyEventHandler(p.Handler);
if (p._e != null)
{
p._e();
}
p.Pow -= new MyEventHandler(p.Handler);
if (p._e != null)
{
p._e();
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0080


Mensaje de error
No se permiten restricciones en declaraciones no genéricas
Constraints are not allowed on non-generic declarations
La sintaxis encontrada sólo puede utilizarse en una declaración genérica para aplicar las restricciones al parámetro de tipo.
Para obtener más información, vea Genéricos (Guía de programación de C#).
En el ejemplo siguiente se genera el error CS0080 porque MyClass no es una clase genérica y Foo no es un método genérico.

namespace MyNamespace
{
public class MyClass where MyClass : System.IDisposable // CS0080 //the following li
ne shows an example of correct syntax
//public class MyClass<T> where T : System.IDisposable
{
public void Foo() where Foo : new() // CS0080
//the following line shows an example of correct syntax
//public void Foo<U>() where U : struct
{
}
}

public class Program


{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0081


Mensaje de error
La declaración de parámetros de tipo debe ser un identificador, no un tipo
Type parameter declaration must be an identifier not a type
Cuando declare un tipo o un método genérico, especifique el parámetro de tipo como un identificador, por ejemplo "T" o
"inputType". Cuando el código de cliente llama al método, proporciona el tipo, que reemplaza cada aparición del identificador
en el cuerpo del método o clase. Para obtener más información, vea
Parámetros de tipos genéricos (Guía de programación de C#).

// CS0081.cs
class MyClass
{
public void F<int>() {} // CS0081
public void F<T>(T input) {} // OK

public static void Main()


{
MyClass a = new MyClass();
a.F<int>(2);
a.F<double>(.05);
}
}

Vea también
Conceptos
Genéricos (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0100


Mensaje de error
El nombre de parámetro 'nombre de parámetro' está duplicado
The parameter name 'parameter name' is a duplicate
Una declaración de método utiliza el mismo nombre de parámetro más de una vez. Los nombres de parámetro deben ser
únicos en una declaración de método. Para obtener más información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0100:

// CS0100.cs
namespace x
{
public class a
{
public static void f(int i, char i) // CS0100
// try the following line instead
// public static void f(int i, char j)
{
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0101


Mensaje de error
El espacio de nombres 'espacio de nombres' ya contiene una definición para 'tipo'
The namespace 'namespace' already contains a definition for 'type'
Un espacio de nombres contiene identificadores duplicados. Cambie el nombre de uno de los identificadores duplicados o
elimínelo. Para obtener más información, vea Espacios de nombres (Guía de programación de C#)
El código siguiente genera el error CS0101:

// CS0101.cs
namespace MyNamespace
{
public class MyClass
{
static public void Main()
{
}
}

public class MyClass // CS0101


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0102


Mensaje de error
El tipo 'nombre de tipo' ya contiene una definición para 'identificador'
The type 'type name' already contains a definition for 'identifier'
Una clase contiene varias declaraciones de identificadores con el mismo nombre y el mismo ámbito. Para corregir el error,
cambie el nombre de los identificadores duplicados.
Ejemplo
El código siguiente genera el error CS0102.

// CS0102.cs
// compile with: /target:library
namespace MyApp
{
public class MyClass
{
string s = "Hello";
string s = "Goodbye"; // CS0102

public void GetString()


{
string s = "Hello again"; // method scope, no error
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0103


Mensaje de error
El nombre 'identificador' no existe en el contexto actual
The name 'identifier' does not exist in the current context
Se ha intentado usar un nombre que no existe en la clase, en el espacio de nombres o en el ámbito . Compruebe que el
nombre esté correctamente escrito, sus instrucciones using y sus referencias de ensamblado para asegurarse de que el
nombre que intenta utilizar está disponible. Un error habitual consiste en declarar una variable dentro de un bucle o un bloque
try y, a continuación, intentar tener acceso al mismo desde un bloque de código que lo contiene o desde otro bloque de
código, como se muestra en el siguiente ejemplo.
El código siguiente genera el error CS0103:

// CS0103.cs
using System;

class MyClass
{
public static void Main()
{
// MyClass conn = null;
try
{
MyClass conn = new MyClass(); // delete this line
// and uncomment the following line and the line above the try
// conn = new MyClass();
}
catch(Exception e)
{
if (conn != null) // CS0103
Console.WriteLine("{0}", e);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0104


Mensaje de error
'referencia' es una referencia ambigua entre 'identificador' y 'identificador'
'reference' is an ambiguous reference between 'identifier' and 'identifier'
El programa contiene directivas using para dos espacios de nombres y el código correspondiente hace referencia a un nombre
que aparece en ambos espacios de nombres.
El código siguiente genera el error CS0104:

// CS0104.cs
using x;
using y;

namespace x
{
public class Test
{
}
}

namespace y
{
public class Test
{
}
}

public class a
{
public static void Main()
{
Test test = new Test(); // CS0104, is Test in x or y namespace?
// try the following line instead
// y.Test test = new y.Test();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0106


Mensaje de error
El modificador 'modificador' no es válido para este elemento
The modifier 'modifier' is not valid for this item
Se marcó un miembro de clase o interfaz con un modificador de acceso no válido. En los siguientes ejemplos se describen
algunos de estos modificadores no válidos:
Los modificadores static y public no son válidos en los métodos de interfaz.
Asimismo, tampoco se permite la palabra clave public en una declaración de interfaz explícita. En este caso, quite la
palabra clave public de la declaración de interfaz explícita.
La palabra clave abstract no está permitida en una declaración de interfaz explícita, ya que en ningún caso se puede
reemplazar una implementación de interfaz explícita.
En versiones anteriores de Visual Studio no se permitía el modificador static en una clase, pero en Microsoft Visual Studio
2005 sí es posible utilizar clases static.
Para obtener más información, vea Interfaces (Guía de programación de C#)
Ejemplo
El código siguiente genera el error CS0106.

// CS0106.cs
namespace MyNamespace
{
interface I
{
void m();
static public void f(); // CS0106
}

public class MyClass


{
public void I.m() {} // CS0106
public static void Main() {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0107


Mensaje de error
Hay más de un modificador de protección
More than one protection modifier
Sólo se permite un modificador de acceso (public, private, protected o internal) en un miembro de clase, con la excepción de
internal protected.
El código siguiente genera el error CS0107:

// CS0107.cs
public class C
{
private internal void f() // CS0107, delete private or internal
{
}
public static int Main()
{
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0110


Mensaje de error
La evaluación del valor constante de 'declaración const' comprende una definición circular
The evaluation of the constant value for 'const declaration' involves a circular definition
La declaración de una variable const (a) no puede hacer referencia a otra variable const (b) que al mismo tiempo haga
referencia a (a).
El código siguiente genera el error CS0110:

// CS0110.cs
namespace MyNamespace
{
public class A
{
public static void Main()
{
}
}

public class B : A
{
public const int i = c + 1; // CS0110, c already references i
public const int c = i + 1;
// the following line would be OK
// public const int c = 10;
}
}

Vea también
Referencia
Constantes (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0111


Mensaje de error
El tipo 'clase' ya define un miembro denominado 'miembro' con los mismos tipos de parámetros
Type 'class' already defines a member called 'member' with the same parameter types
El error CS0111 se produce si una clase contiene dos declaraciones de miembros con el mismo nombre y los mismos tipos de
parámetros. Para obtener más información, vea Métodos (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0111.

// CS0111.cs
class A
{
void Test() { }
public static void Test(){} // CS0111

public static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0112


Mensaje de error
Un miembro estático 'función' no se puede marcar como override, virtual o abstract
A static member 'function' cannot be marked as override, virtual or abstract
Una declaración de método que utilice una palabra clave override, virtual o abstract no puede utilizar también la palabra
clave static.
Para obtener más información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0112:

// CS0112.cs
namespace MyNamespace
{
abstract public class MyClass
{
public abstract void Foo();
}
public class MyClass2 : MyClass
{
override public static void Foo() // CS0112, remove static keyword
{
}
public static int Main()
{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0113


Mensaje de error
Un miembro 'función' marcado como override no se puede marcar como new o virtual
A member 'function' marked as override cannot be marked as new or virtual
El uso de las palabras clave new y override para marcar un método se excluye mutuamente.
El código siguiente genera el error CS0113:

// CS0113.cs
namespace MyNamespace
{
abstract public class MyClass
{
public abstract void Foo();
}

public class MyClass2 : MyClass


{
override new public void Foo() // CS0113, remove new keyword
{
}

public static int Main()


{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0115


Mensaje de error
'función': no se encontró ningún método adecuado que reemplazar
'function' : no suitable method found to override
Se marcó un método como reemplazo, pero el compilador no encontró ningún método que reemplazar. Para obtener más
información, vea override (Referencia de C#) y
Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#).
Ejemplo
En el código siguiente se genera el error CS0115. Se puede solucionar el error CS0115 de dos formas:
Quite la palabra clave override del método de MyClass2.
Utilice MyClass1 como clase base para MyClass2.

// CS0115.cs
namespace MyNamespace
{
abstract public class MyClass1
{
public abstract int f();
}

abstract public class MyClass2


{
public override int f() // CS0115
{
return 0;
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0116


Mensaje de error
Un espacio de nombres no contiene directamente miembros como campos o métodos
A namespace does not directly contain members such as fields or methods
Dentro de un espacio de nombres, el compilador sólo acepta clases, estructuras, uniones, enumeraciones, interfaces y
delegados. Este error lo generan con frecuencia desarrolladores habituados a C/C++, que se olvidan de que en C# los métodos
y las variables se deben declarar y definir dentro de una estructura o clase. Para obtener más información, vea
Estructura general de un programa de C# (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0116:

// CS0116.cs
namespace x
{
using System;
// method must be in class/struct
void Method(string str) // CS0116
{
Console.WriteLine(str);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0117


'type' does not contain a definition for 'identifier'
'tipo' no contiene una definición para 'identificador'
Este error se produce cuando se hace referencia a un miembro que no existe para el tipo de datos.
Existen varias situaciones comunes que pueden generar este error:
Llamar a un método que no existe.
Utilizar la propiedad Item seguida por un indizador.
Llamar a un método calificado cuando el nombre de una clase y el nombre de su espacio de nombres envolvente son
iguales.
Llamar a una interfaz escrita un lenguaje que admite miembros estáticos dentro de las interfaces.
El código siguiente genera el error CS0117.

// CS0117_1.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
int i;
i = i.get(); // CS0117
}
}
}

Ejemplo
En este ejemplo, se utiliza la propiedad Item con un indizador. En C#, se puede utilizar una propiedad o un indizador para
tener acceso a un miembro, pero no ambos. El código siguiente genera el error CS0117.

// CS0117_2.cs
using System;
using System.Collections;
class Test
{
public static void Main()
{
ArrayList al = new ArrayList();
al.Add( new Test() );
Console.WriteLine("{0}", al.Item[0]); // CS0117
Console.WriteLine("{0}", al[0]); // OK
}
}

El error CS0017 también se produce cuando se utiliza una biblioteca escrita un lenguaje que admite miembros estáticos en las
interfaces y se intenta tener acceso al miembro estático desde C#.

// CS0117_3.jsl
// compile with: /target:library
public interface IMyJSharpInterface
{
static int MyStaticMember = 0;
void NonStaticMember();
}
El código siguiente genera el error CS0117.

// CS0117_4.cs
// compile with: /reference:CS0117_3.dll
class MyCSharpClass : IMyJSharpInterface
{
public void NonStaticMember() {}
public static void Main()
{
IMyJSharpInterface myObj = new MyCSharpClass();
myObj.NonStaticMember();
int i = myObj.MyStaticMember; // CS0117
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0118


Mensaje de error
'nombre_construcción1 es 'construcción1' pero se utiliza como 'construcción2'
'construct1_name' is a 'construct1' but is used like a 'construct2'
El compilador detectó una situación en la que una construcción se utilizó de alguna forma errónea o se intentó realizar una
operación no permitida en una construcción. Algunos ejemplos comunes incluyen:
Se intentaron crear instancias de un espacio de nombres (en lugar de una clase)
Se intentó llamar a un campo (en lugar de un método)
Se intentó utilizar un tipo como una variable
Se intentó utilizar un alias externo como un tipo.
Para resolver este error, asegúrese de que la operación que está realizando es válida para el tipo en el cual la está ejecutando.
Ejemplo
El código siguiente genera el error CS0118.

// CS0118.cs
// compile with: /target:library
namespace MyNamespace
{
class MyClass
{
// MyNamespace not a class
MyNamespace ix = new MyNamespace (); // CS0118
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0119


Mensaje de error
'nombre_construcción1' es 'construcción1', que no es válida en el contexto indicado.
'construct1_name' is a 'construct1', which is not valid in the given context.
El compilador ha detectado una construcción inesperada, como la siguiente:
Un constructor de clase no es válido como expresión de prueba en una instrucción condicional.
Se usó un nombre de clase en lugar de un nombre de instancia para referirse a un elemento de matriz.
Se utiliza un identificador de método como si fuera una estructura o clase
Ejemplo
El código siguiente genera el error CS0119.

// CS0119.cs
using System;
public class MyClass
{
public static void Test() {}

public static void Main()


{
Console.WriteLine(Test.x); // CS0119
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0120


Mensaje de error
Se requiere una referencia a objeto para el campo, método o propiedad no estáticos 'miembro'
An object reference is required for the nonstatic field, method, or property 'member'
Para utilizar un campo, método o propiedad no estáticos debe crear en primer lugar una instancia de objeto. Para obtener más
información, vea Constructores de instancias (Guía de programación de C#).
El código siguiente genera el error CS0120:

// CS0120_1.cs
public class MyClass
{
// Non-static field
public int i;
// Non-static method
public void f(){}
// Non-static property
int Prop
{
get
{
return 1;
}
}

public static void Main()


{
i = 10; // CS0120
f(); // CS0120
int p = Prop; // CS0120
// try the following lines instead
// MyClass mc = new MyClass();
// mc.i = 10;
// mc.f();
// int p = mc.Prop;
}
}

También se generará el error CS0120 si hay una llamada a un método no estático desde un método estático de la siguiente
manera:

// CS0120_2.cs
// CS0120 expected
using System;

public class MyClass


{
public static void Main()
{
TestCall(); // CS0120
// To call a non-static method from Main,
// first create an instance of the class.
// Use the following two lines instead:
// MyClass anInstanceofMyClass = new MyClass();
// anInstanceofMyClass.TestCall();
}

public void TestCall()


{
}
}
Igualmente, un método no estático no puede llamar a un método de instancia a menos que se le pase explícitamente una
instancia de la clase, como se indica a continuación:

// CS0120_3.cs
using System;

public class MyClass


{
public static void Main()
{
do_it("Hello There"); // CS0120
}
private void do_it(string sText)
// You could also add the keyword static to the method definition:
// private static void do_it(string sText)
{
Console.WriteLine(sText);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0121


Mensaje de error
La llamada es ambigua entre los siguientes métodos o propiedades: 'método1' y 'método2'
The call is ambiguous between the following methods or properties: 'method1' and 'method2'
Debido a la conversión implícita, el compilador no pudo llamar a una forma de un método sobrecargado. Puede resolver este
error de las siguientes maneras:
Especifique los parámetros del método de tal manera que una conversión implícita no pueda tener lugar.
Elimine todas las sobrecargas del método.
Convierta al tipo apropiado antes de llamar al método.
El código siguiente genera el error CS0121:

// CS0121.cs
public class C
{
void f(int i, double d)
{
}

void f(double d, int i)


{
}

public static void Main()


{
C c = new C();

c.f(1, 1); // CS0121


// try the following line instead
// c.f(1, 1.0);
// or
// c.f(1.0, 1);
// or
// c.f(1, (double)1); // cast and specify which method to call
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0122


Mensaje de error
'miembro' no es accesible debido a su nivel de protección
'member' is inaccessible due to its protection level
El modificador de acceso de un miembro de clase evita el acceso al miembro. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Una causa de este problema (que no se muestra en el ejemplo siguiente) puede ser que se haya omitido el indicador del
compilador /out en el destino de un ensamblado de confianza. Para obtener más información, vea
Ensamblados de confianza (Guía de programación de C#) y
/out (Establecer el nombre de archivo de los resultados) (Opciones del compilador de C#).
Ejemplo
El código siguiente genera el error CS0122:

// CS0122.cs
public class MyClass
{
// Make public to resolve CS0122
void Foo()
{
}
}

public class MyClass2


{
public static int Main()
{
MyClass a = new MyClass();
// Foo is private
a.Foo(); // CS0122
return 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0123


Mensaje de error
Ninguna sobrecarga correspondiente a 'método' coincide con el 'delegado' delegado
No overload for 'method' matches delegate 'delegate'
El intento de crear un delegado dio un error, debido a que no se utilizó la firma correcta. Las instancias de un delegado deben
declararse con la misma firma que la declaración del delegado.
Se puede resolver este error ajustando la firma del método o del delegado. Para obtener más información, vea
Delegados (Guía de programación de C#).
El código siguiente genera el error CS0123.

// CS0123.cs
delegate void D();
delegate void D2(int i);

public class C
{
public static void f(int i) {}

public static void Main()


{
D d = new D(f); // CS0123
D2 d2 = new D2(f); // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0126


Mensaje de error
Se requiere un objeto cuyo tipo se pueda convertir en 'tipo'
An object of a type convertible to 'type' is required
Hay presente una instrucción return, pero no devuelve un valor del tipo esperado. Para obtener más información, vea
Propiedades (Guía de programación de C#).
El código siguiente genera el error CS0126:

// CS0126.cs
public class a
{
public int i
{
set
{
}
get
{
return; // CS0126, specify a value to return
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0127


Mensaje de error
Debido a que 'función' devuelve void, una palabra clave return no debe ir seguida de una expresión de objeto
Since 'function' returns void, a return keyword must not be followed by an object expression
Un método con el tipo de valor devuelto void no puede devolver un valor. Para obtener más información, vea
Métodos (Guía de programación de C#).
El código siguiente genera el error CS0127:

// CS0127.cs
namespace MyNamespace
{
public class MyClass
{
public int hiddenMember2
{
get
{
return 0;
}
set // CS0127, set has an implicit void return type
{
return 0; // remove return statement to resolve this CS0127
}
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0128


Mensaje de error
Ya se ha definido una variable local denominada 'variable' en este ámbito
A local variable named 'variable' is already defined in this scope
El compilador detectó declaraciones de dos variables locales con el mismo nombre. Para obtener más información, vea
Métodos (Guía de programación de C#).
El código siguiente genera el error CS0128:

// CS0128.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
char i;
int i; // CS0128
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0131


Mensaje de error
La parte izquierda de una asignación debe ser una variable, una propiedad o un indizador
The left-hand side of an assignment must be a variable, property or indexer
En una instrucción de asignación, el valor de la parte derecha se asigna a la parte izquierda. La parte izquierda debe ser una
variable, una propiedad o un indizador
Para corregir este error, asegúrese de que todos los operadores estén en la parte derecha y de que la parte izquierda sea una
variable, una propiedad o un indizador. Para obtener más información, vea
Instrucciones, expresiones y operadores (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0131.

// CS0131.cs
public class MyClass
{
public int i = 0;
public void MyMethod()
{
i++ = 1; // CS0131
// try the following line instead
// i = 1;
}
public static void Main() { }
}

Este error también se puede producir al intentar realizar operaciones aritméticas en la parte izquierda de un operador de
asignación, como en el siguiente ejemplo.

// CS0131b.cs
public class C
{
public static int Main()
{
int a = 1, b = 2, c = 3;
if (a + b = c) // CS0131
// try this instead
// if (a + b == c)
return 0;
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0132


Mensaje de error
'constructor': un constructor estático no debe tener parámetros
'constructor' : a static constructor must be parameterless
Un constructor static no puede declararse con uno o más parámetros. Para obtener más información, vea
Constructores (Guía de programación de C#).
El código siguiente genera el error CS0132:

// CS0132.cs
namespace MyNamespace
{
public class MyClass
{
public MyClass(int i)
{
}
}

public class MyClass2 : MyClass


{
static MyClass2(int i) // CS0132
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0133


Mensaje de error
La expresión que se asigne a 'variable' debe ser constante
The expression being assigned to 'variable' must be constant
Una variable const no puede tomar como valor una expresión que no sea constante. Para obtener más información, vea
Constantes (Guía de programación de C#).
El código siguiente genera el error CS0133:

// CS0133.cs
public class MyClass
{
public const int i = c; // CS0133, c is not constant
public static int c = i;
// try the following line instead
// public const int i = 6;

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0134


Mensaje de error
'variable' es del tipo 'tipo'. Una constante de tipo de referencia diferente de String sólo puede inicializarse con null.
'variable' is of type 'type'. A const of reference type other than string can only be initialized with null.
Una expresión constante es una expresión que se puede evaluar completamente en tiempo de compilación. Dado que la única
forma de crear un valor que no sea null de un tipo de referencia es aplicar el nuevo operador, y puesto que el nuevo operador
no se permite en una expresión constante, el único valor posible para las constantes de los tipos de referencia que no sean
String es null.
Si se produce este error al intentar crear una matriz de cadenas constantes, la solución consiste en convertir la matriz en una
matriz de sólo lectura e inicializarla en el constructor.
Ejemplo
En el siguiente ejemplo se genera el error CS0134.

// CS0134.cs
// compile with: /target:library
class MyTest {}

class MyClass
{
const MyTest test = new MyTest(); // CS0134

//OK
const MyTest test2 = null;
const System.String test3 = "test";
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0135


Mensaje de error
'declaración1' entra en conflicto con la declaración 'declaración2'
'declaration1' conflicts with the declaration 'declaration2'
El compilador no permite ocultar nombres, lo cual suele causar errores lógicos en el código.
El código siguiente genera el error CS0135:

// CS0135.cs
public class MyClass2
{
public static int i = 0;

public static void Main()


{
{
int i = 4;
i++;
}
i = 0; // CS0135
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0136


Mensaje de error
No se puede declarar una variable local denominada 'var' en este ámbito, porque daría un significado diferente a 'var', que ya
se utiliza en un ámbito 'principal o actual/secundario' con otra denotación
A local variable named 'var' cannot be declared in this scope because it would give a different meaning to 'var', which is
already used in a 'parent or current/child' scope to denote something else
Una declaración de variable oculta otra declaración que de otro modo quedaría dentro de ámbito. Cambie el nombre de la
variable que se declara en la línea que generó el error CS0136.
El código siguiente genera el error CS0136:

// CS0136.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
int i = 0;
{
char i = 'a'; // CS0136, hides int i
}
i++;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0138


Mensaje de error
Una directiva de espacio de nombres using sólo se puede aplicar a espacios de nombres; 'tipo' es un tipo, no un espacio de
nombres
A using namespace directive can only be applied to namespaces; 'type' is a type not a namespace
Una directiva using sólo puede tomar el nombre de un espacio de nombres como parámetro. Para obtener más información,
vea Espacios de nombres (Guía de programación de C#).
El código siguiente genera el error CS0138:

// CS0138.cs
using System.Object; // CS0138
Referencia de Visual C#: errores y advertencias

Error del compilador CS0139


Mensaje de error
No hay ningún bucle envolvente desde el que interrumpir o continuar
No enclosing loop out of which to break or continue
Se detectó una instrucción break o continue situada fuera de un bucle.
Para obtener más información, vea Instrucciones de salto.
El código siguiente genera dos veces el error CS0139:

// CS0139.cs
namespace x
{
public class a
{
public static void Main()
{
continue; // CS0139
break; // CS0139
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0140


Mensaje de error
La etiqueta 'etiqueta' está duplicada
The label 'label' is a duplicate
Ha aparecido dos veces una etiqueta con el mismo nombre. Para obtener más información, vea goto (Referencia de C#).
El código siguiente genera el error CS0140:

// CS0140.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
label1: int i = 0;
label1: int j = 0; // CS0140, comment this line to resolve
goto label1;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0143


Mensaje de error
El tipo 'clase' no tiene constructores definidos
The type 'class' has no constructors defined
No hay disponible un constructor apropiado.
El código siguiente genera el error CS0143:

// CS0143.cs
class MyClass
{
static public void Main ()
{
double d = new double(4.5); // CS0143
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0144


Mensaje de error
No se puede crear una instancia de la clase o interfaz abstracta 'interfaz'
Cannot create an instance of the abstract class or interface 'interface'
No se puede crear una instancia de una interfaz o clase de tipo abstract. Para obtener más información, vea
Interfaces (Guía de programación de C#).
El código siguiente genera el error CS0144:

// CS0144.cs
interface MyInterface
{
}
public class MyClass
{
public static void Main()
{
MyInterface myInterface = new MyInterface (); // CS0144
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0145


Mensaje de error
El campo const requiere que se proporcione un valor
A const field requires a value to be provided
Se debe inicializar una variable const. Para obtener más información, vea Constantes (Guía de programación de C#).
El código siguiente genera el error CS0145:

// CS0145.cs
class MyClass
{
const int i; // CS0145
// try the following line instead
// const int i = 0;

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0146


Mensaje de error
Dependencia de clase base circular que requiere 'clase1' y 'clase2'
Circular base class dependency involving 'class1' and 'class2'
La lista de herencia de una clase incluye una referencia directa o indirecta a sí misma. Una clase no se puede derivar de sí
misma. Para obtener más información, vea Herencia (Guía de programación de C#).
El código siguiente genera el error CS0146:

// CS0146.cs
namespace MyNamespace
{
public interface InterfaceA
{
}
public class MyClass : InterfaceA, MyClass2
{
public void Main()
{
}
}

public class MyClass2 : MyClass // CS0146


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0148


Mensaje de error
El delegado 'delegado' no tiene un constructor válido
The delegate 'delegate' does not have a valid constructor
Se importó y utilizó un programa administrado (uno que utiliza Common Language Runtime de .NET Framework) que fue
creado con otro compilador. Ese compilador permitía un constructor delegate mal formado. Para obtener más información,
vea Delegados (Guía de programación de C#).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0149


Mensaje de error
Se espera un nombre de método
Method name expected
Al crear un delegado (delegate), se debe especificar un método. Para obtener más información, vea
Delegados (Guía de programación de C#).
El código siguiente genera el error CS0149:

// CS0149.cs
using System;

delegate string MyDelegate(int i);

class MyClass
{
// class member-field of the declared delegate type
static MyDelegate dt;

public static void Main()


{
dt = new MyDelegate(17.45); // CS0149
// try the following line instead
// dt = new MyDelegate(Func2);
F(dt);
}

public static string Func2(int j)


{
Console.WriteLine(j);
return j.ToString();
}

public static void F(MyDelegate myFunc)


{
myFunc(8);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0150


Mensaje de error
Se espera un valor constante
A constant value is expected
Se encontró una variable donde se esperaba una constante. Para obtener más información, vea switch (Referencia de C#).
El código siguiente genera el error CS0150:

// CS0150.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
int i = 0;
int j = 0;

switch(i)
{
case j: // CS0150, j is a variable int, not a constant int
// try the following line instead
// case 1:
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0151


Mensaje de error
Se espera un valor de tipo integral
A value of an integral type expected
Se utilizó una variable en una situación donde se requería un tipo de datos integral. Para obtener más información, vea
Tipos de datos (Guía de programación de C#).
Ejemplo
Este error puede suceder donde no hay conversión, o si las conversiones implícitas disponibles dan como resultado una
situación ambigua. El código siguiente genera el error CS0151.

// CS0151.cs
public class MyClass
{
public static implicit operator int (MyClass aa)
{
return 0;
}

public static implicit operator long (MyClass aa)


{
return 0;
}

public static void Main()


{
MyClass a = new MyClass();

// Compiler cannot choose between int and long


switch (a) // CS0151
// try the following line instead
// switch ((int)a)
{
case 1:
break;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0152


Mensaje de error
La etiqueta 'etiqueta' ya se da en esta instrucción switch
The label 'label' already occurs in this switch statement
Se repitió una etiqueta en una instrucción switch. Para obtener más información, vea switch (Referencia de C#).
El código siguiente genera el error CS0152:

// CS0152.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
int i = 0;

switch (i)
{
case 1:
i++;
return;

case 1: // CS0152, two case 1 statements


i++;
return;
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0153


Mensaje de error
Una instrucción goto case sólo es válida dentro de una instrucción switch
A goto case is only valid inside a switch statement
Se intentó utilizar la sintaxis de switch fuera de una instrucción switch . Para obtener más información, vea
switch (Referencia de C#).
El código siguiente genera el error CS0153:

// CS0153.cs
public class a
{
public static void Main()
{
goto case 5; // CS0153
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0154


Mensaje de error
La propiedad o el indizador 'propiedad' no se puede utilizar en este contexto porque carece del descriptor de acceso get
The property or indexer 'property' cannot be used in this context because it lacks the get accessor
Se produjo un error al intentar usar una propiedad, ya que no se definió un método de descriptor de acceso get en la
propiedad. Para obtener más información, vea Campos (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0154:

// CS0154.cs
public class MyClass2
{
public int i
{
set
{
}
// uncomment the get method to resolve this error
/*
get
{
return 0;
}
*/
}
}

public class MyClass


{
public static void Main()
{
MyClass2 myClass2 = new MyClass2();
int j = myClass2.i; // CS0154, no get method
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0155


Mensaje de error
El tipo detectado o producido debe derivarse de System.Exception
The type caught or thrown must be derived from System.Exception
Se intentó pasar un tipo de datos que no se deriva de System.Exception a un bloque catch. Sólo se pueden pasar a un bloque
catch los tipos de datos derivados de System.Exception. Para obtener más información, vea
Instrucciones de control de excepciones y Excepciones y control de excepciones (Guía de programación de C#).
El código siguiente genera el error CS0155:

// CS0155.cs
using System;

namespace MyNamespace
{
public class MyClass2
// try the following line instead
// public class MyClass2 : Exception
{
}
public class MyClass
{
public static void Main()
{
try
{
}
catch (MyClass2) // CS0155, resolves if you derive MyClass2 from Exception
{
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0156


Mensaje de error
No se permite una instrucción throw sin argumentos fuera de una cláusula catch
A throw statement with no arguments is not allowed outside of a catch clause
Una instrucción throw sin parámetros sólo puede aparecer en una cláusula catch que no tome parámetros.
Para obtener más información, vea Instrucciones de control de excepciones y
Excepciones y control de excepciones (Guía de programación de C#).
El código siguiente genera el error CS0156:

// CS0156.cs
using System;

namespace MyNamespace
{
public class MyClass2 : Exception
{
}

public class MyClass


{
public static void Main()
{
try
{
throw; // CS0156
}

catch(MyClass2)
{
throw; // this throw is valid
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0157


Mensaje de error
El control no puede salir del texto de una cláusula finally
Control cannot leave the body of a finally clause
Todas las instrucciones de una cláusula finally deben ejecutarse. Para obtener más información, vea
Instrucciones de control de excepciones y Excepciones y control de excepciones (Guía de programación de C#).
El código siguiente genera el error CS0157:

// CS0157.cs
using System;
namespace MyNamespace
{
public class MyClass2 : Exception
{
}

public class MyClass


{
public static void Main()
{
try
{
}

finally
{
return; // CS0157, cannot leave finally clause
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0158


Mensaje de error
La etiqueta 'etiqueta' oculta otra etiqueta del mismo nombre en un ámbito contenido
The label 'label' shadows another label by the same name in a contained scope
Una etiqueta de un ámbito interno oculta una etiqueta con el mismo nombre y perteneciente a un ámbito externo. Para
obtener más información, vea goto (Referencia de C#).
El código siguiente genera el error CS0158:

// CS0158.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
goto lab1;
lab1:
{
lab1:
goto lab1; // CS0158
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0159


Mensaje de error
No existe la etiqueta 'etiqueta' en el ámbito de la instrucción goto
No such label 'label' within the scope of the goto statement
La etiqueta a la que hace referencia la instrucción goto no puede encontrarse en el ámbito de la instrucción goto.
El código siguiente genera el error CS0159:

// CS0159.cs
public class Class1
{
public static void Main()
{
int i = 0;

switch (i)
{
case 1:
goto case 3; // CS0159, case 3 label does not exist
case 2:
break;
}
goto NOWHERE; // CS0159, NOWHERE label does not exist
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0160


Mensaje de error
Una cláusula catch previa ya detecta todas las excepciones de este tipo o de tipo superior ('tipo')
A previous catch clause already catches all exceptions of this or of a super type ('type')
Una serie de instrucciones catch debe tener orden decreciente de derivación. Por ejemplo, los objetos más derivados deben
aparecer en primer lugar.
Para obtener más información, vea Instrucciones de control de excepciones y
Excepciones y control de excepciones (Guía de programación de C#).
El código siguiente genera el error CS0160:

// CS0160.cs
public class MyClass2 : System.Exception {}
public class MyClass
{
public static void Main()
{
try {}

catch(System.Exception) {} // Second-most derived; should be second catch


catch(MyClass2) {} // CS0160 Most derived; should be first catch
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0161


Mensaje de error
'método': no todas las rutas de código devuelven un valor
'method': not all code paths return a value
Un método que devuelve un valor debe tener una instrucción return en todas las rutas de acceso al código. Para obtener más
información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0161:

// CS0161.cs
public class Test
{
public static int Main() // CS0161
{
int i = 10;
if (i < 10)
{
return i;
}
else
{
// uncomment the following line to resolve
// return 1;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0163


Mensaje de error
El control no puede pasar explícitamente de una etiqueta de caso ('etiqueta') a otra
Control cannot fall through from one case label ('label') to another
Cuando una instrucción case contiene una o varias instrucciones y va seguida de otra instrucción case, una de las siguientes
instrucciones debe terminar explícitamente dicha instrucción case:
return
goto
break
Si se desea implementar el comportamiento de "paso explícito", utilice goto case #. Para obtener más información, vea
switch (Referencia de C#)
El código siguiente genera el error CS0163:

// CS0163.cs
public class MyClass
{
public static void Main()
{
int i = 0;

switch (i) // CS0163


{
case 1:
i++;
// uncomment one of the following lines to resolve
// return;
// break;
// goto case 3;

case 2:
i++;
return;

case 3:
i = 0;
return;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0165


Mensaje de error
Uso de la variable local no asignada 'var'
Use of unassigned local variable 'var'
El compilador de C# no permite el uso de variables no inicializadas. Si el compilador detecta el uso de una variable que pueda
no haberse inicializado, genera el error CS0165. Para obtener más información, vea Campos (Guía de programación de C#).
Utilice new para crear una instancia de un objeto o asignar un valor.
El código siguiente genera el error CS0165:

// CS0165.cs
using System;

class MyClass
{
public int i;
}
class MyClass2
{
public static void Main(string [] args)
{
int i, j;
if (args[0] == "test")
{
i = 0;
}

/*
// to resolve, either initialize the variables when declared
// or provide for logic to initialize them, as follows:
else
{
i = 1;
}
*/
j = i; // CS0165, i might be uninitialized

MyClass myClass;
myClass.i = 0; // CS0165
// use new as follows
// MyClass myClass = new MyClass();
// myClass.i = 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0167


Mensaje de error
Falta el método Invoke del delegado 'delegado'
The delegate 'delegate' is missing the Invoke method
Se importó y utilizó un programa administrado (uno que utiliza Common Language Runtime de .NET Framework) que fue
creado con otro compilador. Ese compilador permitía un delegado mal formado. Por lo tanto, el método Invoke no estaba
disponible. Para obtener más información, vea Delegados (Guía de programación de C#).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0170


Mensaje de error
Uso del campo 'campo', posiblemente no asignado
Use of possibly unassigned field 'field'
Se utilizó un campo de una estructura sin inicializarlo previamente. Para resolver este problema, determine primero qué
campo no se inicializó y, a continuación, inicialícelo antes de intentar tener acceso a él. Para obtener más información sobre
cómo inicializar estructuras, vea Estructuras (Guía de programación de C#) y Utilizar estructuras (Guía de programación de C#).
El código siguiente genera el error CS0170:

// CS0170.cs
public struct error
{
public int i;
}

public class MyClass


{
public static void Main()
{
error e;
// uncomment the next line to resolve this error
// e.i = 0;
System.Console.WriteLine( e.i ); // CS0170 because
//e.i was never assigned
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0171


Mensaje de error
El campo 'campo' debe estar completamente asignado antes de que el control abandone el constructor
Field 'field' must be fully assigned before control leaves the constructor
El constructor de una struct debe inicializar todos los campos de la estructura. Para obtener más información, vea
Constructores (Guía de programación de C#).
El código siguiente genera el error CS0171:

// CS0171.cs
struct MyStruct
{
MyStruct(int initField) // CS0171
{
// i = initField; // uncomment this line to resolve this error
}
public int i;
}

class MyClass
{
public static void Main()
{
MyStruct aStruct = new MyStruct();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0172


Mensaje de error
No se puede determinar el tipo de la expresión condicional porque 'tipo1' y 'tipo2' se convierten implícitamente uno en el otro
Type of conditional expression cannot be determined because 'type1' and 'type2' implicitly convert to one another
En una instrucción condicional, debe poder convertir los tipos de ambos lados del operador :. Asimismo, no puede haber
rutinas de conversión mutua; sólo es necesaria una conversión. Para obtener más información, vea
Operadores de conversión (Guía de programación de C#).
El código siguiente genera el error CS0172:

// CS0172.cs
public class Square
{
public class Circle
{
public static implicit operator Circle(Square aa)
{
return null;
}

public static implicit operator Square(Circle aa)


// using explicit resolves this error
// public static explicit operator Square(Circle aa)
{
return null;
}
}

public static void Main()


{
Circle aa = new Circle();
Square ii = new Square();
object o = (1 == 1) ? aa : ii; // CS0172
// the following cast would resolve this error
// (1 == 1) ? aa : (Circle)ii;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0173


Mensaje de error
No se puede determinar el tipo de la expresión condicional porque no hay una conversión implícita entre 'clase1' y 'clase2'
Type of conditional expression cannot be determined because there is no implicit conversion between 'class1' and 'class2'
Las conversiones entre clases son útiles cuando se desea que objetos de diferentes clases funcionen con el mismo código. Sin
embargo, dos clases que funcionan juntas no pueden tener conversiones mutuas y redundantes.
Para resolver el error CS0173, asegúrese de que hay una sola conversión implícita entre class1 y class2, sin importar el sentido
en el que tiene lugar la misma, y con independencia de la clase en la que se realiza. Para obtener más información, vea
Tabla de conversiones numéricas implícitas (Referencia de C#) y Operadores de conversión (Guía de programación de C#)
El código siguiente genera el error CS0173:

// CS0173.cs
public class C {}
public class A {}
public class MyClass
{
public static void F(bool b)
{
A a = new A();
C c = new C();
object o = b ? a : c; // CS0173
}

public static void Main()


{
F(true);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0174


Mensaje de error
Clase base requerida para una referencia 'base'
A base class is required for a 'base' reference
Este error sólo se produce cuando Common Language Runtime de .NET Framework compila el código fuente de la clase
System.Object, que es la única clase que no posee clase base.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0175


Mensaje de error
El uso de la palabra clave 'base' no es válido en este contexto
Use of keyword 'base' is not valid in this context
La palabra clave base (Referencia de C#) debe usarse para especificar un miembro determinado de la clase base. Para obtener
más información, vea Constructores (Guía de programación de C#).
El código siguiente genera el error CS0175:

// CS0175.cs
using System;
class BaseClass
{
public int TestInt = 0;
}
class MyClass : BaseClass
{
public static void Main()
{
MyClass aClass = new MyClass();
aClass.BaseTest();
}

public void BaseTest()


{
Console.WriteLine(base); // CS0175
// Try the following line instead:
// Console.WriteLine(base.TestInt);
base = 9; // CS0175

// Try the following line instead:


// base.TestInt = 9;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0176


Mensaje de error
No se puede obtener acceso al miembro estático 'miembro' con una referencia de instancia; utilice un nombre de tipo en su
lugar
Static member 'member' cannot be accessed with an instance reference; qualify it with a type name instead
Sólo puede utilizarse un nombre de clase para calificar una variable static; un nombre de instancia no puede ser un calificador.
Para obtener más información, vea Clases estáticas y sus miembros (Guía de programación de C#).
El código siguiente genera el error CS0176:

// CS0176.cs
public class MyClass2
{
public static int ii;
}

public class a
{
public static void Main()
{
MyClass2 myClass2 = new MyClass2 ();
int i = myClass2.ii; // CS0176
// try the following line instead
// int i = MyClass2.ii;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0177


Mensaje de error
Es necesario asignar el parámetro 'parámetro' out antes de que el control abandone el método actual
The out parameter 'parameter' must be assigned to before control leaves the current method
No se asignó un valor a un parámetro marcado con la palabra clave out en el cuerpo del método. Para obtener más
información, vea Pasar parámetros (Guía de programación de C#)
El código siguiente genera el error CS0177:

// CS0177.cs
public class MyClass
{
public static void Foo(out int i) // CS0177
{
// uncomment the following line to resolve this error
// i = 0;
}

public static void Main()


{
int x = -1;
Foo(out x);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0178


Mensaje de error
Especificador de rango no válido: se esperaba ',' o ']'
Invalid rank specifier: expected ',' or ']'
La inicialización de una matriz estaba mal formada. Por ejemplo, al especificar las dimensiones de una matriz se puede
especificar lo siguiente:
Un número entre corchetes
Un par de corchetes vacíos
Una coma entre corchetes.
Para obtener más información, vea Matrices (Guía de programación de C#) y la sección de la especificación de C#
(Especificación del lenguaje C#) sobre inicializadores de matrices.
Ejemplo
El código siguiente genera el error CS0178.

// CS0178.cs
class MyClass
{
public static void Main()
{
int a = new int[5][,][][5; // CS0178
int[,] b = new int[3,2]; // OK

int[][] c = new int[10][];


c[0] = new int[5][5]; // CS0178
c[0] = new int[2]; // OK
c[1] = new int[2]{1,2}; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0179


Mensaje de error
'miembro' no puede ser extern y declarar un cuerpo
'member' cannot be extern and declare a body
Cuando se marca un miembro de clase como extern, significa que su definición se encuentra en otro archivo. Por tanto, un
miembro de clase marcado como extern no puede definirse en la clase. Quite la palabra clave extern o elimine la definición.
Para obtener más información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0179:

// CS0179.cs
public class MyClass
{
public extern int ExternMethod(int aa) // CS0179
{
return 0;
}
// try the following line instead
// public extern int ExternMethod(int aa);

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0180


Mensaje de error
'miembro' no puede ser extern y abstract
'member' cannot be both extern and abstract
Las palabras clave abstract y extern se excluyen mutuamente. La palabra clave extern significa que el miembro está definido
fuera del archivo, y abstract significa que su implementación se proporciona en una clase derivada. Para obtener más
información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0180:

// CS0180.cs
namespace MyNamespace
{
public class MyClass
{
public extern abstract int Foo(int a); // CS0180

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0182


Mensaje de error
Un argumento de atributo debe ser una expresión constante, expresión Typeof o una expresión de creación de matrices
An attribute argument must be a constant expression, typeof expression or array creation expression
No se especificó correctamente el argumento de un atributo. Para obtener más información, vea
Atributos globales (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0182:

// CS0182.cs
public class MyClass
{
static string s = "Test";
[System.Diagnostics.ConditionalAttribute(s)] // CS0182
// try the following line instead
// [System.Diagnostics.ConditionalAttribute("Test")]
void NonConstantArgumentToConditional()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0185


Mensaje de error
'tipo' no es el tipo de referencia que requiere la instrucción lock
'type' is not a reference type as required by the lock statement
La instrucción lock sólo puede evaluar tipos de referencia. Para obtener más información, vea
Sincronización de subprocesos (Guía de programación de C#) y Tipos de referencia (Referencia de C#).
Ejemplo
El código siguiente genera el error CS0185:

// CS0185.cs
public class MainClass
{
public static void Main ()
{
lock (1) // CS0185
// try the following lines instead
// MainClass x = new MainClass();
// lock(x)
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0186


Mensaje de error
No se permite utilizar null en este contexto
Use of null is not valid in this context
El código siguiente genera el error CS0186:

// CS0186.cs
using System;
using System.Collections;

class MyClass
{
static void Main()
{
// Each of the following lines generates CS0186:
foreach (int i in null) {} // CS0186
foreach (int i in (IEnumerable) null) { }; // CS0186
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0188


Mensaje de error
El objeto 'this' no se puede utilizar antes de que se hayan asignado todos sus campos
The 'this' object cannot be used before all of its fields are assigned to
El constructor deberá haber asignado todos los campos de una struct antes de que dicho constructor pueda llamar a un
método de la struct. Para obtener más información, vea Utilizar estructuras (Guía de programación de C#).
El código siguiente genera el error CS0188:

// CS0188.cs
// compile with: /t:library
namespace MyNamespace
{
class MyClass
{
struct S
{
public int a;

void Foo()
{
}

S(int i)
{
// a = i;
Foo(); // CS0188
}
}
public static void Main()
{ }

}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0191


Mensaje de error
No se puede asignar un campo de sólo lectura (excepto en un constructor o inicializador de variable)
A readonly field cannot be assigned to (except in a constructor or a variable initializer)
Un campo de sólo lectura (readonly) sólo puede tomar una asignación en un constructor o en el momento de su declaración.
Para obtener más información, vea Constructores (Guía de programación de C#).
También se puede obtener el error CS0191 si el campo readonly es static y el constructor no está marcado como static.
Ejemplo
El código siguiente genera el error CS0191.

// CS0191.cs
class MyClass
{
public readonly int TestInt = 6; // OK to assign to readonly field in declaration
MyClass()
{
TestInt = 11; // OK to assign to readonly field in constructor
}

public void TestReadOnly()


{
TestInt = 19; // CS0191
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0192


Mensaje de error
No se puede pasar ref u out a un campo de sólo lectura (excepto en un constructor)
A readonly field cannot be passed ref or out (except in a constructor)
No se puede pasar un campo (variable) marcado con la palabra clave readonly a un parámetro ref u out excepto dentro de un
constructor. Para obtener más información, vea Campos (Guía de programación de C#).
También se puede obtener el error CS0192 si el campo readonly es static y el constructor no está marcado como static.
Ejemplo
En el código siguiente se genera el error CS0192:

// CS0192.cs
class MyClass
{
public readonly int TestInt = 6;
static void TestMethod(ref int testInt)
{
testInt = 0;
}

MyClass()
{
TestMethod(ref TestInt); // OK
}

public void PassReadOnlyRef()


{
TestMethod(ref TestInt); // CS0192
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0193


Mensaje de error
El operador * o -> se debe aplicar a un puntero
The * or -> operator must be applied to a pointer
Se utilizó el operador * o -> con un tipo de no puntero. Para obtener más información, vea
Tipos de puntero (Guía de programación de C#).
El código siguiente genera el error CS0193:

// CS0193.cs
using System;

public struct Age


{
public int AgeYears;
public int AgeMonths;
public int AgeDays;
}

public class MyClass


{
public static void SetAge(ref Age anAge, int years, int months, int days)
{
anAge->Months = 3; // CS0193, anAge is not a pointer
// try the following line instead
// anAge.AgeMonths = 3;
}

public static void Main()


{
Age MyAge = new Age();
Console.WriteLine(MyAge.AgeMonths);
SetAge(ref MyAge, 22, 4, 15);
Console.WriteLine(MyAge.AgeMonths);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0196


Mensaje de error
Un puntero sólo puede estar indizado por un valor
A pointer must be indexed by only one value
Un puntero no puede tener más de un índice. Para obtener más información, vea
Tipos de puntero (Guía de programación de C#)
El código siguiente genera el error CS0196:

// CS0196.cs
public class MyClass
{
public static void Main ()
{
int *i = null;
int j = 0;
j = i[1,2]; // CS0196
// try the following line instead
// j = i[1];
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0197


Mensaje de error
No se puede pasar 'argumento' como ref u out ni aceptar su dirección porque podría provocar una excepción en tiempo de
ejecución ya que es un campo de una clase por referencia
Passing 'argument' as ref or out or taking its address may cause a runtime exception because it is a field of a marshal-by-
reference class
Cualquier clase que se derive, directa o indirectamente, de MarshalByRefObject es una clase de cálculo por referencia. Puede
realizarse el cálculo por referencia de dicha clase sin tener en cuenta los límites de proceso o de equipo. Por ello, las instancias
de esta clase pueden ser proxy respecto de objetos remotos. No se puede pasar un campo de un objeto proxy como si se
tratara de uno ref u out. Por ello, no se pueden pasar los campos de esta clase como si se tratara de un ref u out, a menos que
la instancia sea this, la cual nunca puede ser un objeto proxy.
Ejemplo
El código siguiente genera el error CS0197.

// CS0197.cs
// compile with: /W:1
class X : System.MarshalByRefObject
{
public int i;
}

class M
{
public int i;
static void AddSeventeen(ref int i)
{
i += 17;
}

static void Main()


{
X x = new X();
x.i = 12;
AddSeventeen(ref x.i); // CS0197

// OK
M m = new M();
m.i = 12;
AddSeventeen(ref m.i);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0198


Mensaje de error
No se puede asignar un campo de sólo lectura estático (excepto en un constructor estático o inicializador de variable)
A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)
Una variable readonly debe tener el mismo uso de static que el constructor en el que se desea inicializar. Para obtener más
información, vea Constructores estáticos (Guía de programación de C#).
El código siguiente genera el error CS0198:

// CS0198.cs
class MyClass
{
public static readonly int TestInt = 6;

MyClass()
{
TestInt = 11; // CS0198, constructor is not static and readonly field is
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0199


Mensaje de error
No se puede pasar ref o out a un campo estático de sólo lectura (excepto en un constructor estático)
A static readonly field cannot be passed ref or out (except in a static constructor)
Una variable readonly debe tener el mismo uso de static que el constructor al que se desea pasarla como un parámetro ref o
out. Para obtener más información, vea Pasar parámetros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0199:

// CS0199.cs
class MyClass
{
public static readonly int TestInt = 6;
static void TestMethod(ref int testInt)
{
testInt = 0;
}

MyClass()
{
TestMethod(ref TestInt); // CS0199, TestInt is static
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0200


Mensaje de error
No se puede asignar la propiedad o el indizador 'propiedad' (es de sólo lectura)
Property or indexer 'property' cannot be assigned to — it is read only
Se intentó asignar un valor a una propiedad, pero ésta no tiene establecido un descriptor de acceso set. Solucione el error
agregando un descriptor de acceso set. Para obtener más información, vea
Cómo: Declarar y utilizar propiedades de lectura y escritura (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0200:

// CS0200.cs
public class MainClass
{
// private int _mi;
int I
{
get
{
return 1;
}

// uncomment the set accessor and declaration for _mi


/*
set
{
_mi = value;
}
*/
}

public static void Main ()


{
MainClass II = new MainClass();
II.I = 9; // CS0200
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0201


Mensaje de error
Sólo se pueden utilizar las expresiones de objeto assignment, call, increment, decrement y new como instrucción
Only assignment, call, increment, decrement, and new object expressions can be used as a statement
El compilador genera un error cuando encuentra una instrucción sin sentido.
Ejemplo
El ejemplo siguiente genera el error CS0201.

// CS0201.cs
public class MainClass
{
public static void Main()
{
2 * 3; // CS0201
}
}

El ejemplo siguiente genera el error CS0201.

// CS0201_b.cs
// compile with: /target:library
public class MyList<T>
{
public void Add(T x)
{
int i = 0;
if ( (object)x == null)
{
checked(i++); // CS0201

// OK
checked {
i++;
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0202


Mensaje de error
foreach requiere que el tipo de valor devuelto 'tipo' de 'type.GetEnumerator()' tenga un método MoveNext público y una
propiedad Current adecuados
foreach requires that the return type 'type' of 'type.GetEnumerator()' must have a suitable public MoveNext method and public
Current property
Una función GetEnumerator, utilizada para habilitar el uso de instrucciones foreach, no puede devolver un puntero o una
matriz; debe devolver una instancia de una clase que pueda actuar como enumerador. Los requisitos apropiados para actuar
como enumerador incluyen una propiedad Current pública y un método MoveNext público.
Nota
En C# 2.0, el compilador generará automáticamente Current y MoveNext. Para obtener más información, vea los ejemplos de
código de Interfaces genéricas (Guía de programación de C#).

El código siguiente genera el error CS0202:

// CS0202.cs

public class C1
{
public int Current
{
get
{
return 0;
}
}

public bool MoveNext ()


{
return false;
}

public static implicit operator C1 (int c1)


{
return 0;
}
}

public class C2
{
public int Current
{
get
{
return 0;
}
}
public bool MoveNext ()
{
return false;
}
public C1[] GetEnumerator ()
// try the following line instead
// public C1 GetEnumerator ()
{
return null;
}
}
public class MainClass
{
public static void Main ()
{
C2 c2 = new C2();

foreach (C1 x in c2) // CS0202


{
System.Console.WriteLine(x.Current);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0204


Mensaje de error
Sólo se permiten 65535 variables locales
Only 65535 locals are allowed
Se ha superado el límite de 65535 variables locales en un método.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0205


Mensaje de error
No se puede llamar a un miembro base abstract: 'método'
Cannot call an abstract base member: 'method'
No se puede llamar a un método abstract porque no tiene un cuerpo de método. Para obtener más información, vea
Clases y miembros de clase abstractos y sellados (Guía de programación de C#).
El código siguiente genera el error CS0205:

// CS0205.cs
abstract public class MyClass
{
abstract public void mf();
}

public class MyClass2 : MyClass


{
public override void mf()
{
base.mf(); // CS0205, delete this line
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0206


Mensaje de error
Una propiedad o un indizador no se puede pasar como parámetro out o ref
A property or indexer may not be passed as an out or ref parameter
Una propiedad no está disponible para pasarla como parámetro ref u out. Para obtener más información, vea
Pasar parámetros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0206:

// CS0206.cs
public class MyClass
{
public static int P
{
get
{
return 0;
}
set
{
}
}

public static void MyMeth(ref int i)


// public static void MyMeth(int i)
{
}

public static void Main()


{
MyMeth(ref P); // CS0206
// try the following line instead
// MyMeth(P); // CS0206
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0208


Mensaje de error
No se puede adquirir la dirección, obtener el tamaño ni declarar un puntero a un tipo administrado ('tipo')
Cannot take the address of, get the size of, or declare a pointer to a managed type ('type')
Incluso cuando se utiliza con la palabra clave no segura, no se permite utilizar la dirección ni obtener el tamaño de un tipo
administrado, ni declarar un puntero que apunte a él. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0208:

// CS0208.cs
// compile with: /unsafe
class S
{
public int a = 98;
}

public class MyClass


{
unsafe public static int Main()
{
S s = new S(); // S is managed
S * s2 = &s; // CS0208
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0209


Mensaje de error
El tipo de variables locales declarado en una instrucción fixed debe ser un tipo de puntero
The type of locals declared in a fixed statement must be a pointer type
La variable que se declara en una instrucción fixed debe ser un puntero. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0209:

// CS0209.cs
// compile with: /unsafe

class Point
{
public int x, y;
}

public class MyClass


{
unsafe public static void Main()
{
Point pt = new Point();

fixed (int i) // CS0209


{
}
// try the following lines instead
/*
fixed (int* p = &pt.x)
{
}
fixed (int* q = &pt.y)
{
}
*/
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0210


Mensaje de error
Debe proporcionar un inicializador en una declaración de instrucción fixed o using
You must provide an initializer in a fixed or using statement declaration
Se debe declarar e inicializar la variable de una instrucción fixed. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0210:

// CS0210a.cs
// compile with: /unsafe

class Point
{
public int x, y;
}

public class MyClass


{
unsafe public static void Main()
{
Point pt = new Point();

fixed (int i) // CS0210


{
}
// try the following lines instead
/*
fixed (int* p = &pt.x)
{
}
fixed (int* q = &pt.y)
{
}
*/
}
}

El siguiente ejemplo también genera el error CS0210 porque la instrucción using no tiene inicializador.

// CS0210b.cs

using System.IO;
class Test
{
static void Main()
{
using (StreamWriter w) // CS0210
// Try this line instead:
// using (StreamWriter w = new StreamWriter("TestFile.txt"))
{
w.WriteLine("Hello there");
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0211


Mensaje de error
No se puede adquirir la dirección de la expresión dada
Cannot take the address of the given expression
Se puede obtener la dirección de campos, variables locales y direccionamiento indirecto de punteros, pero no se puede
obtener, por ejemplo, la dirección de la suma de dos variables locales. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0211:

// CS0211.cs
// compile with: /unsafe

public class MyClass


{
unsafe public void mf()
{
int a = 0, b = 0;
int *i = &(a + b); // CS0211, the addition of two local variables
// try the following line instead
// int *i = &a;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0212


Mensaje de error
Sólo se puede adquirir la dirección de una expresión de tipo unfixed de un inicializador de instrucción fixed
You can only take the address of an unfixed expression inside of a fixed statement initializer
Para obtener más información, vea Código no seguro y punteros (Guía de programación de C#).
En el ejemplo siguiente se muestra cómo adquirir la dirección de una expresión unfixed. El código siguiente genera el error
CS0212.

// CS0212a.cs
// compile with: /unsafe /target:library

public class A {
public int iField = 5;

unsafe public void mf() {


A a = new A();
int* ptr = &a.iField; // CS0212
}

// OK
unsafe public void mf2() {
A a = new A();
fixed (int* ptr = &a.iField) {}
}
}

El ejemplo siguiente también genera el error CS0212 y muestra una manera de resolverlo:

// CS0212b.cs
// compile with: /unsafe /target:library
using System;

public class MyClass


{
unsafe public void mf()
{
// Null-terminated ASCII characters in an sbyte array
sbyte[] sbArr1 = new sbyte[] { 0x41, 0x42, 0x43, 0x00 };
sbyte* pAsciiUpper = &sbArr1[0]; // CS0212
// To resolve this error, delete the previous line and
// uncomment the following code:
// fixed (sbyte* pAsciiUpper = sbArr1)
// {
// String szAsciiUpper = new String(pAsciiUpper);
// }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0213


Mensaje de error
No se puede utilizar la instrucción fixed para adquirir la dirección de una expresión de tipo fixed
You cannot use the fixed statement to take the address of an already fixed expression
Una variable local en un método unsafe o en un parámetro ya está fija (en la pila), por lo que no se puede obtener la dirección
de ninguna de esas dos variables en una expresión fixed. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0213.

// CS0213.cs
// compile with: /unsafe
public class MyClass
{
unsafe public static void Main()
{
int i = 45;
fixed (int *j = &i) { } // CS0213
// try the following line instead
// int* j = &i;

int[] a = new int[] {1,2,3};


fixed (int *b = a)
{
fixed (int *c = b) { } // CS0213
// try the following line instead
// int *c = b;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0214


Mensaje de error
Los punteros y los búferes de tamaño fijo sólo se pueden utilizar en un contexto no seguro
Pointers and fixed size buffers may only be used in an unsafe context
Los punteros sólo se pueden utilizar con la palabra clave unsafe. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0214:

// CS0214.cs
// compile with: /target:library /unsafe
public struct S
{
public int a;
}
public class MyClass
{
public static void Test()
{
S s = new S();
S * s2 = &s; // CS0214
s2->a = 3; // CS0214
s.a = 0;
}

// OK
unsafe public static void Test2()
{
S s = new S();
S * s2 = &s;
s2->a = 3;
s.a = 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0215


Mensaje de error
El tipo de valor devuelto del operador True o False debe ser bool
The return type of operator True or False must be bool
Los operadores true y false definidos por el usuario deben tener un tipo del valor devuelto bool. Para obtener más
información, vea Operadores sobrecargables (Guía de programación de C#).
El código siguiente genera el error CS0215:

// CS0215.cs
class MyClass
{
public static int operator true (MyClass MyInt) // CS0215
// try the following line instead
// public static bool operator true (MyClass MyInt)
{
return true;
}

public static int operator false (MyClass MyInt) // CS0215


// try the following line instead
// public static bool operator false (MyClass MyInt)
{
return true;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0216


Mensaje de error
El operador 'operador' requiere que también se defina un operador coincidente 'operador_ausente'
The operator 'operator' requires a matching operator 'missing_operator' to also be defined
Un operador true definido por el usuario requiere un operador false definido por el usuario, y viceversa. Para obtener más
información, vea Operadores (Guía de programación de C#).
El código siguiente genera el error CS0216:

// CS0216.cs
class MyClass
{
public static bool operator true (MyClass MyInt) // CS0216
{
return true;
}

// to resolve, uncomment the following operator definition


/*
public static bool operator false (MyClass MyInt)
{
return true;
}
*/

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0217


Mensaje de error
Para que se pueda aplicar un operador de cortocircuito, el operador lógico definido por el usuario ('operador') debe tener el
mismo tipo de valor devuelto que sus dos parámetros.
In order to be applicable as a short circuit operator a user-defined logical operator ('operator') must have the same return type
as the type of its 2 parameters.
Si se define un operador para un tipo definido por el usuario y a continuación se intenta utilizarlo como operador de
cortocircuito, el operador definido por el usuario debe tener parámetros y valores devueltos del mismo tipo. Para obtener más
información acerca de los operadores de cortocircuito, vea Operador && y Operador ||.
El código siguiente genera el error CS0217:

// CS0217.cs
using System;

public class MyClass


{
public static bool operator true (MyClass f)
{
return false;
}

public static bool operator false (MyClass f)


{
return false;
}

public static implicit operator int(MyClass x)


{
return 0;
}

public static int operator & (MyClass f1, MyClass f2) // CS0217
// try the following line instead
// public static MyClass operator & (MyClass f1, MyClass f2)
{
return new MyClass();
}
public static void Main()
{
MyClass f = new MyClass();
int i = f && f;
}
}

Vea también
Referencia
Operadores sobrecargables (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0218


Mensaje de error
El tipo ('tipo') debe incluir declaraciones de operador true y operador false
The type ('type') must contain declarations of operator true and operator false
Si se define un operador para un tipo definido por el usuario y a continuación se intenta utilizarlo como operador de
cortocircuito, el operador definido por el usuario debe tener definidos un operador true y un operador false. Para obtener más
información acerca de los operadores de cortocircuito, vea Operador && y Operador ||.
El código siguiente genera el error CS0218:

// CS0218.cs
using System;
public class MyClass
{
// uncomment these operator declarations to resolve this CS0218
/*
public static bool operator true (MyClass f)
{
return false;
}

public static bool operator false (MyClass f)


{
return false;
}
*/

public static implicit operator int(MyClass x)


{
return 0;
}

public static MyClass operator & (MyClass f1, MyClass f2)


{
return new MyClass();
}

public static void Main()


{
MyClass f = new MyClass();
int i = f && f; // CS0218, requires operators true and false
}
}

Vea también
Conceptos
Operadores de conversión (Guía de programación de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS0220


Mensaje de error
La operación se desborda en el momento de la compilación en modo checked
The operation overflows at compile time in checked mode
Se detectó una operación mediante checked, que es el modo predeterminado, la cual dio como resultado una pérdida de datos.
Deben corregirse los datos de entrada en la asignación o usar unchecked para resolver este error. Para obtener más
información, vea Checked y Unchecked (Referencia de C#).
El código siguiente genera el error CS0220:

// CS0220.cs
using System;

class TestClass
{
const int x = 1000000;
const int y = 1000000;

public int MethodCh()


{
int z = (x * y); // CS0220
return z;
}

public int MethodUnCh()


{
unchecked
{
int z = (x * y);
return z;
}
}

public static void Main()


{
TestClass myObject = new TestClass();
Console.WriteLine("Checked : {0}", myObject.MethodCh());
Console.WriteLine("Unchecked: {0}", myObject.MethodUnCh());
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0221


Mensaje de error
El valor constante 'valor' no se puede convertir en 'tipo' (utilice la sintaxis 'unchecked' para reemplazar el valor)
Constant value 'value' cannot be converted to a 'type' (use 'unchecked' syntax to override)
Una operación de asignación que daría como resultado una pérdida de datos fue detectada por el modo checked, que está
activado de forma predeterminada. Debe corregirse la asignación o usar unchecked para resolver este error. Para obtener más
información, vea Checked y Unchecked (Referencia de C#).
El código siguiente genera el error CS0221:

// CS0221.cs
public class MyClass
{
public static void Main()
{
// unchecked
// {
int a = (int)0xFFFFFFFF; // CS0221
a++;
// }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0225


Mensaje de error
El parámetro params debe ser una matriz de una dimensión
The params parameter must be a single dimensional array
Al utilizar la palabra clave params se debe especificar una matriz unidimensional del tipo de datos. Para obtener más
información, vea Métodos (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0225:

// CS0225.cs
public class MyClass
{
public static void TestParams(params int a) // CS0225
// try the following line instead
// public static void TestParams(params int[] a)
{
}

public static void Main()


{
TestParams(1);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0227


Mensaje de error
El código unsafe sólo puede aparecer si se compila con /unsafe
Unsafe code may only appear if compiling with /unsafe
Si el código fuente contiene la palabra clave unsafe, también debe utilizarse la opción del compilador /unsafe. Para obtener
más información, vea Código no seguro y punteros (Guía de programación de C#).
En el siguiente ejemplo, al realizar la compilación sin /unsafe, se genera el error CS0227:

// CS0227.cs
public class MyClass
{
unsafe public static void Main() // CS0227
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0228


Mensaje de error
'tipo' no contiene una definición para 'miembro' o no es accesible
'type' does not contain a definition for 'member', or it is not accessible
Puede que se haya reemplazado la versión del sistema de System.Hashtable, System.String o System.Array, y que el
reemplazo no contenga un member.
De lo contrario, puede resultar necesario reparar o reinstalar Visual Studio.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0229


Mensaje de error
Ambigüedad entre 'miembro1' y 'miembro2'
Ambiguity between 'member1' and 'member2'
Miembros de interfaces diferentes tienen el mismo nombre. Si se desea mantener los mismos nombres, hay que calificarlos.
Para obtener más información, vea Interfaces (Guía de programación de C#).
Nota
En algunos casos, esta ambigüedad se puede resolver proporcionando un prefijo explícito al identificador a través de un alias
using.

Ejemplo
En el código siguiente se genera el error CS0229:

// CS0229.cs

interface IList
{
int Count
{
get;
set;
}

void Counter();
}

interface Icounter
{
double Count
{
get;
set;
}
}

interface IListCounter : IList , Icounter {}


class MyClass
{
void Test(IListCounter x)
{
x.Count = 1; // CS0229
// Try one of the following lines instead:
// ((IList)x).Count = 1;
// or
// ((Icounter)x).Count = 1;
}

public static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0230


Mensaje de error
En una instrucción foreach se requieren un tipo y un identificador
Type and identifier are both required in a foreach statement
Una instrucción foreach está mal formada.
El código siguiente genera el error CS0230:

// CS0230.cs
using System;

class MyClass
{
public static void Main()
{
int[] myarray = new int[3] {1,2,3};

foreach (int in myarray) // CS0230


// try the following line instead
// foreach (int x in myarray)
{
Console.WriteLine(x);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0231


Mensaje de error
El parámetro params debe ser el último en una lista de parámetros formales.
A params parameter must be the last parameter in a formal parameter list.
El parámetro params admite un número variable de argumentos y debe encontrarse después de los demás parámetros. Para
obtener más información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0231:

// CS0231.cs
class Test
{
public void TestMethod(params int[] p, int i) {} // CS0231
// To resolve the error, use the following line instead:
// public void TestMethod(int i, params int[] p) {}
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0233


Mensaje de error
'identificador' no tiene un tamaño predefinido; por tanto, sizeof sólo se puede utilizar en un contexto no seguro (utilice
System.Runtime.InteropServices.Marshal.SizeOf)
'identifier' does not have a predefined size, therefore sizeof can only be used in an unsafe context (consider using
System.Runtime.InteropServices.Marshal.SizeOf)
El operador sizeof sólo se puede utilizar para tipos que sean constantes de tiempo de compilación. Si se produce este error,
asegúrese de que el tamaño del identificador se pueda determinar durante la compilación. En caso contrario, utilice SizeOf en
lugar de sizeof.
Ejemplo
El ejemplo siguiente genera el error CS0233:

// CS0233.cs
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct S
{
public int a;
}

public class MyClass


{
public static void Main()
{
S myS = new S();
Console.WriteLine(sizeof(S)); // CS0233
// Try the following line instead:
// Console.WriteLine(Marshal.SizeOf(myS));
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0234


Mensaje de error
El tipo o el nombre del espacio de nombres 'nombre' no existe en el espacio de nombres 'espacio de nombres' (¿falta una
referencia de ensamblado?)
The type or namespace name 'name' does not exist in the namespace 'namespace' (are you missing an assembly reference?)
Se esperaba un tipo. Las causas posibles son las siguientes:
No se hizo referencia en la compilación a un ensamblado que contiene la definición de un tipo; utilice
/reference (Importar metadatos) para especificar el ensamblado.
Se pasó un nombre de variable al operador typeof.
Vea Agregar referencia (Cuadro de diálogo) para obtener más información sobre cómo agregar una referencia en el entorno
de desarrollo.
El código siguiente genera el error CS0234:

// CS0234.cs
public class C
{
public static void Main()
{
System.DateTime x = new System.DateTim(); // CS0234
// try the following line instead
// System.DateTime x = new System.DateTime();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0236


Mensaje de error
Un inicializador de campo no puede hacer referencia al campo no estático, método o propiedad 'campo'
A field initializer cannot reference the nonstatic field, method, or property 'field'
Los campos de instancia no pueden utilizarse para inicializar otros campos de instancia fuera de un método. Si intenta
inicializar una variable fuera de un método, considere la posibilidad de realizar la inicialización dentro del constructor de clase.
Para obtener más información, vea Métodos (Guía de programación de C#).
El código siguiente genera el error CS0236:

// CS0236.cs
public class MyClass
{
public int i = 5;
public int j = i; // CS0236
public int k; // initialize in constructor

MyClass()
{
k = i;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0238


Mensaje de error
'miembro' no puede ser sealed porque no es override
'member' cannot be sealed because it is not an override
sealed se utilizó en un miembro que no estaba marcado también como override. Para obtener más información, vea
Herencia (Guía de programación de C#).
El código siguiente genera el error CS0238:

// CS0238.cs
abstract class MyClass
{
public abstract void f();
}

class MyClass2 : MyClass


{
public static void Main()
{
}

public sealed void f() // CS0238


// Try the following definition instead:
// public override sealed void f()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0239


Mensaje de error
'miembro': no se puede reemplazar el miembro heredado 'miembro heredado' porque es sealed
'member' : cannot override inherited member 'inherited member' because it is sealed
Un miembro no puede reemplazar (override) un miembro heredado sealed. Para obtener más información, vea
Checked y Unchecked (Referencia de C#).
El código siguiente genera el error CS0239:

// CS0239.cs
abstract class MyClass
{
public abstract void f();
}

class MyClass2 : MyClass


{
public static void Main()
{
}

public override sealed void f()


{
}
}

class MyClass3 : MyClass2


{
public override void f() // CS0239
// Try the following definition instead:
// public new void f()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0241


Mensaje de error
No se permiten especificadores de parámetros predeterminados
Default parameter specifiers are not permitted
Los parámetros de método no pueden tener valores predeterminados. Utilice sobrecargas de métodos para obtener ese efecto.
Para obtener más información, vea Pasar parámetros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0241. Además, el ejemplo muestra cómo simular, con sobrecarga, un método con
argumentos predeterminados.

// CS0241.cs
public class A
{
public void Test(int i = 9) {} // CS0241
}

public class B
{
public void Test() { Test(9); }
public void Test(int i) {}
}

public class C
{
public static void Main()
{
B x = new B();
x.Test();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0242


Mensaje de error
La operación en cuestión no está definida en punteros void
The operation in question is undefined on void pointers
No se permite incrementar un puntero void. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0242:

// CS0242.cs
// compile with: /unsafe
class TestClass
{
public unsafe void Test()
{
void * p = null;
p++; // CS0242, incrementing a void pointer not allowed
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0243


Mensaje de error
El atributo Conditional no es válido en 'método' porque es un método de reemplazo
The Conditional attribute is not valid on 'method' because it is an override method
No se permite el atributo Conditional en un método marcado con la palabra clave override. Para obtener más información, vea
Saber cuándo utilizar las palabras clave Override y New (Guía de programación de C#).
El compilador nunca crea enlaces a métodos de reemplazo, sólo con el método base, y Common Language Runtime llama al
reemplazo, según corresponda.
El código siguiente genera el error CS0243:

// CS0243.cs
// compile with: /target:library
public class MyClass
{
public virtual void M() {}
}

public class MyClass2 : MyClass


{
[System.Diagnostics.ConditionalAttribute("MySymbol")] // CS0243
// remove Conditional attribute or remove override keyword
public override void M() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0244


Mensaje de error
Ni "is" ni "as" son válidos como tipos de puntero
Neither "is" nor "as" are valid on pointer types
Las palabras clave is y as no son válidas para su uso en tipos de puntero. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0244:

// CS0244.cs
// compile with: /unsafe

class UnsafeTest
{
unsafe static void SquarePtrParam (int* p)
{
bool b = p is object; // CS0244 p is pointer
}

unsafe public static void Main()


{
int i = 5;
SquarePtrParam (&i);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0245


Mensaje de error
Los destructores y object.Finalize no se pueden llamar directamente. Llame a IDisposable.Dispose si está disponible.
Destructors and object.Finalize cannot be called directly. Consider calling IDisposable.Dispose if available.
Para obtener más información, vea Fundamentos de programación del recolector de elementos no utilizados y
Destructores (Guía de programación de C#).
El código siguiente genera el error CS0245:

// CS0245.cs
using System;
using System.Collections;

class MyClass // : IDisposable


{
/*
public void Dispose()
{
// cleanup code goes here
}
*/

void m()
{
this.Finalize(); // CS0245
// this.Dispose();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0246


Mensaje de error
No se puede encontrar el tipo o el nombre de espacio de nombres 'tipo o espacio de nombres' (¿falta una directiva using o una
referencia de ensamblado?)
The type or namespace name 'type/namespace' could not be found (are you missing a using directive or an assembly
reference?)
No se encontró un tipo. Puede que se haya olvidado hacer referencia (mediante /reference) al ensamblado que contiene el tipo,
o puede no haberse calificado correctamente mediante la directiva using.
Hay varias razones que justifican este error:
1. Puede que el nombre del tipo o del espacio de nombres que intenta utilizar esté mal escrito (incluido el uso incorrecto de
mayúsculas o minúsculas). Si el nombre no es correcto, el compilador no podrá encontrar la definición del tipo o del
espacio de nombres al que se ha hecho referencia en el código. Esto suele ocurrir porque no se han utilizado
correctamente las mayúsculas y minúsculas al hacer referencia al tipo y C# distingue entre mayúsculas y minúsculas. Por
ejemplo, Dataset ds; generará el error CS0246; observe que la s de Dataset no está escrita en mayúscula.
2. Si el error es por un nombre de espacio de nombres, puede que no haya hecho referencia (/reference) al ensamblado
que contiene el espacio de nombres. Por ejemplo, puede que el código contenga using Accessibility;. Sin embargo, si
el proyecto no hace referencia al ensamblado Accessibility.dll, obtendrá el error CS0246. Vea
Agregar referencia (Cuadro de diálogo) para obtener más información sobre cómo agregar una referencia en el entorno
de desarrollo.
3. Si el error es por un nombre de tipo, puede que no disponga de la directiva using correcta o que no haya introducido el
nombre completo del tipo. Observe la siguiente línea de código: DataSet ds;. Para poder utilizar el tipo DataSet, son
necesarias dos operaciones. En primer lugar, necesita una referencia al ensamblado que contiene la definición del tipo
DataSet. En segundo lugar, necesita utilizar una directiva para el espacio de nombres en el que se encuentra el tipo
DataSet. Por ejemplo, puesto que DataSet está ubicado en el espacio de nombres System.Data, debería introducir la
siguiente instrucción al principio del código: using System.Data;.
El segundo paso no es necesario. Sin embargo, si omite este paso, tendrá que introducir el nombre completo del tipo
DataSet cuando haga referencia a él. Esto significa que debe utilizar el espacio de nombres y el tipo cada vez que se
refiera a éste en el código. Por tanto, si ha decidido omitir el segundo paso, es necesario que cambie el código de
declaración anterior por: System.Data.DataSet ds;.
4. Si el error corresponde a algo que no sea un tipo, puede deberse a que se haya utilizado una variable u otro objeto
cuando se esperaba un tipo. Por ejemplo, este error se generará si se utiliza un objeto Type en la instrucción is en lugar
de un tipo real.
El código siguiente genera el error CS0246:

// CS0246.cs
// using System.Diagnostics;

public class MyClass


{
[Conditional("A")] // CS0246, uncomment using directive to resolve
public void Test()
{
}

public static void Main()


{
}
}

A continuación se muestra un ejemplo en que se ha utilizado un objeto de tipo Type en un punto donde se esperaba un tipo
real (caso 4 anterior):

// CS0246b.cs
using System;
class C
{
public bool supports(object o, Type t)
{
if (o is t) // CS0246 – t is not a type
{
return true;
}
return false;
}
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0247


Mensaje de error
No se puede utilizar un tamaño negativo con stackalloc
Cannot use a negative size with stackalloc
Se pasó un número negativo a una instrucción stackalloc.
El código siguiente genera el error CS0247:

// CS0247.cs
// compile with: /unsafe
public class MyClass
{
unsafe public static void Main()
{
int *p = stackalloc int [-30]; // CS0247
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0248


Mensaje de error
No se puede crear una matriz con un tamaño negativo
Cannot create an array with a negative size
Se especificó un tamaño de matriz con un número negativo. Para obtener más información, vea
Matrices (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0248:

// CS0248.cs
class MyClass
{
public static void Main()
{
int[] myArray = new int[-3] {1,2,3}; // CS0248, pass a nonnegative number
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0249


Mensaje de error
No reemplace object.Finalize. En su lugar, proporcione un destructor.
Do not override object.Finalize. Instead, provide a destructor.
Utilice la sintaxis de destructor para especificar las instrucciones que se deben ejecutar cuando se destruya el objeto.
Para obtener más información, vea Sintaxis de destructores en C# y C++.
El código siguiente genera el error CS0249:

// CS0249.cs
class MyClass
{
protected override void Finalize() // CS0249
// try the following line instead
// ~MyClass()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0250


Mensaje de error
No llame directamente al método Finalize de la clase base. Se llama automáticamente desde el destructor.
Do not directly call your base class Finalize method. It is called automatically from your destructor.
Un programa no puede intentar forzar la eliminación de los recursos de la clase base.
Para obtener más información vea Métodos y destructores Finalize.
El código siguiente genera el error CS0250:

// CS0250.cs
class B
{
}

class C : B
{
~C()
{
base.Finalize(); // CS0250
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0254


Mensaje de error
El lado derecho de una asignación de instrucción fixed puede no ser una expresión de conversión
The right hand side of a fixed statement assignment may not be a cast expression
El lado derecho de una expresión fixed puede que no utilice una conversión. Para obtener más información, vea
Código no seguro y punteros (Guía de programación de C#).
El código siguiente genera el error CS0254:

// CS0254.cs
// compile with: /unsafe
class Point
{
public uint x, y;
}
class FixedTest
{
unsafe static void SquarePtrParam (int* p)
{
*p *= *p;
}

unsafe public static void Main()


{
Point pt = new Point();
pt.x = 5;
pt.y = 6;

fixed (int* p = (int*)&pt.x) // CS0254


// try the following line instead
// fixed (uint* p = &pt.x)
{
SquarePtrParam ((int*)p);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0255


Mensaje de error
stackalloc no se puede utilizar en un bloque catch o finally
stackalloc may not be used in a catch or finally block
La palabra clave stackalloc no se puede utilizar en un bloque catch o finally. Para obtener más información, vea
Excepciones y control de excepciones (Guía de programación de C#).
El código siguiente genera el error CS0255:

// CS0255.cs
// compile with: /unsafe
using System;

public class TestTryFinally


{
public static unsafe void Test()
{
int i = 123;
string s = "Some string";
object o = s;

try
{
// Conversion is not valid; o contains a string not an int
i = (int) o;
}

finally
{
Console.Write("i = {0}", i);
int* fib = stackalloc int[100]; // CS0255
}
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0260


Mensaje de error
Falta el modificador parcial en la declaración de tipo 'tipo'; ya existe otra declaración parcial de este tipo
Missing partial modifier on declaration of type 'type'; another partial declaration of this type exists
Este error indica que se ha encontrado más de una declaración de clase con el mismo nombre, y que por lo menos una de
estas declaraciones se ha declarado como parcial, pero no todas ellas. Si su intención es definir una clase en varias partes,
todas estas partes deberán declararse con la palabra clave partial. Este error también se produce si se crea una clase nueva
que, accidentalmente, tiene el mismo nombre que una clase parcial declarada en otro lugar del mismo espacio de nombres.
El código siguiente genera el error CS0260:

// CS0260.cs
class C // CS0260
{
}

partial class C
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0261


Mensaje de error
Las declaraciones parciales de 'tipo' deben ser todas del tipo class, struct o interface
Partial declarations of 'type' must be all classes, all structs, or all interfaces
Este error aparece si se declara un tipo parcial con un tipo diferente de construcción en distintos lugares. Para obtener más
información, vea Definiciones de clase parciales (Guía de programación de C#).
En el código siguiente se genera el error CS0261:

// CS0261.cs
partial class A // CS0261 – A declared as a class here, but as a struct below
{
}

partial struct A
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0262


Mensaje de error
Las declaraciones parciales de 'tipo' tienen modificadores de accesibilidad conflictivos
Partial declarations of 'type' have conflicting accessibility modifiers
Este error se produce si un tipo parcial tiene modificadores incoherentes como public, private, protected, internal o abstract.
Estos modificadores deben ser coherentes en todas las declaraciones parciales correspondientes a ese tipo. Para obtener más
información, vea Definiciones de clase parciales (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0262:

// CS0262.cs
class A
{
public partial class C // CS0262
{
}
private partial class C
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0263


Mensaje de error
Las declaraciones parciales de 'tipo' no deben especificar clases base diferentes
Partial declarations of 'type' must not specify different base classes
Cuando defina un tipo en declaraciones parciales, especifique los mismos tipos base en cada una de las declaraciones
parciales. Para obtener más información, vea Definiciones de clase parciales (Guía de programación de C#).
En el código siguiente se genera el error CS0263:

// CS0263.cs
// compile with: /target:library
class B1
{
}
class B2
{
}
partial class C : B1 // CS0263 – is the base class B1 or B2?
{
}

partial class C : B2
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0264


Mensaje de error
Las declaraciones parciales de 'tipo' deben tener los mismos nombres de parámetros de tipo en el mismo orden
Partial declarations of 'type' must have the same type parameter names in the same order
Este error aparece si está definiendo un tipo genérico en declaraciones parciales y los parámetros de tipo no guardan la
coherencia en el nombre u orden a lo largo de todas las declaraciones parciales. Para evitar este error, compruebe los
parámetros de tipo en cada declaración parcial y asegúrese de que utiliza el mismo nombre y orden de parámetros. Para
obtener más información, vea Definiciones de clase parciales (Guía de programación de C#) y
Parámetros de tipos genéricos (Guía de programación de C#).
Ejemplo
En el siguiente ejemplo se genera el error CS0264:

// CS0264.cs

partial class MyClass<T> // CS0264


{
}

partial class MyClass <MyType>


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0265


Mensaje de error
Las declaraciones parciales de 'tipo' tienen restricciones incoherentes para el parámetro de tipo 'parámetro de tipo'
Partial declarations of 'type' have inconsistent constraints for type parameter 'type parameter'
Este error aparece cuando se define una clase genérica como clase parcial, de manera que sus definiciones parciales aparecen
en más de un lugar, y las restricciones en el tipo genérico son incoherentes o diferentes en dos o más lugares. Si especifica las
restricciones en más de un lugar, todas ellas deben ser idénticas. La solución más sencilla es especificar las restricciones en un
lugar y omitirlas en todas las demás partes. Para obtener más información, vea
Definiciones de clase parciales (Guía de programación de C#) y
Restricciones de tipos de parámetros (Guía de programación de C#).
En el código siguiente se genera el error CS0265.
Ejemplo
En este código, las definiciones de clase parciales se encuentran todas en un único archivo, pero también podrían hallarse
diseminadas en varios archivos.

// CS0265.cs
public class GenericsErrors
{
interface IFace1 { }
interface IFace2 { }
partial class PartialBadBounds<T> where T : IFace1 { } // CS0265
partial class PartialBadBounds<T> where T : IFace2 { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0266


Mensaje de error
No se puede convertir implícitamente el tipo 'tipo' en 'tipo' Ya existe una conversión explícita (compruebe si le falta una
conversión)
Cannot implicitly convert type 'type1' to 'type2'. An explicit conversion exists (are you missing a cast?)
Este error se produce cuando existe código que intenta convertir dos tipos que implícitamente no se pueden convertir, como
una asignación de un tipo base a un tipo derivado al que le falta una conversión explícita. Para obtener más información, vea
Operadores de conversión (Guía de programación de C#).
El código siguiente genera el error CS0266:

// CS0266.cs
class MyClass
{
public static void Main()
{
object obj = "MyString";
// Cannot implicitly convert 'object' to 'MyClass'
MyClass myClass = obj; // CS0266
// Try this line instead
// MyClass c = ( MyClass )obj;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0267


Mensaje de error
El modificador parcial sólo puede aparecer inmediatamente antes de 'class', 'struct' o 'interface'
The partial modifier can only appear immediately before 'class', 'struct', or 'interface'
La posición del modificador parcial era incorrecta en la declaración de la clase, estructura o interfaz. Para corregir el error,
reordene los modificadores. Para obtener más información, vea Definiciones de clase parciales (Guía de programación de C#).
El código siguiente genera el error CS0267:

// CS0267.cs
public partial class MyClass
{
public MyClass()
{
}
}

partial public class MyClass // CS0267


// Try this line instead:
// public partial class MyClass
{
public void Foo()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0268


Mensaje de error
El tipo importado 'tipo' no es válido. Contiene una dependencia de clase base circular.
Imported type 'type' is invalid. It contains a circular base class dependency.
Este error aparece si un tipo importado de otro lenguaje tiene una dependencia de clase base circular. Dicho tipo no se puede
utilizar en un programa escrito en C#. Para resolver este error, compruebe los tipos importados de otros lenguajes en
cualquiera de los módulos o ensamblados a los que se haga referencia.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0269


Mensaje de error
Uso del parámetro out sin asignar 'parámetro'
Use of unassigned out parameter 'parameter'
El compilador no pudo comprobar que el parámetro out se hubiera asignado a un valor antes de utilizarlo; es posible que su
valor no estuviera definido al asignarlo. Asegúrese de inicializar los parámetros out antes de tener acceso a sus valores. Si
necesita utilizar el valor de la variable que se ha pasado, utilice un parámetro ref en su lugar. Para obtener más información,
vea Pasar parámetros (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0269:

// CS0269.cs
class C
{
public static void F(out int i)
// Try this instead:
// public static void F(ref int i)
{
int k = i; // CS0269
i = 1;
}

public static void Main()


{
int myInt;
F(out myInt);
}
}

También se puede producir si la inicialización de una variable tiene lugar en un bloque try y el compilador no puede
comprobar si éste se ejecutará de forma correcta:

// CS0269b.cs
class C
{
public static void F(out int i)
{
try
{
// Assignment occurs, but compiler can't verify it
i = 1;
}
catch
{
}

int k = i; // CS0269
i = 1;
}

public static void Main()


{
int myInt;
F(out myInt);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0270


Mensaje de error
El tamaño de la matriz no se puede especificar en una declaración de variable (intente inicializar con una expresión 'new')
Array size cannot be specified in a variable declaration (try initializing with a 'new' expression)
Este error aparece cuando se especifica un tamaño como parte de una declaración de matriz. Para resolver el error, utilice la
expresión de operador new.
En el siguiente ejemplo se genera el error CS0270:

// CS0270.cs
// compile with: /t:module

public class Test


{
int[10] a; // CS0270
// To resolve, use the following line instaead:
// int[] a = new int[10];
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0271


Mensaje de error
La propiedad o indizador 'propiedad/indizador' no se puede utilizar en este contexto porque el descriptor de acceso get es
inaccesible
The property or indexer 'property/indexer' cannot be used in this context because the get accessor is inaccessible
Este error aparece cuando intenta tener acceso a un descriptor de acceso get inaccesible. Para resolver este error, aumente la
accesibilidad del descriptor de acceso o cambie la ubicación de la llamada. Para obtener más información, vea
Accesibilidad del descriptor de acceso y Propiedades (Guía de programación de C#).
En el ejemplo siguiente se genera el error CS0271:

// CS0271.cs
public class MyClass
{
public int Property
{
private get { return 0; }
set { }
}

public int Property2


{
get { return 0; }
set { }
}
}

public class Test


{
public static void Main(string[] args)
{
MyClass c = new MyClass();
int a = c.Property; // CS0271
int b = c.Property2; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0272


Mensaje de error
La propiedad o indizador 'propiedad/indizador' no se puede utilizar en este contexto porque el descriptor de acceso set es
inaccesible
The property or indexer 'property/indexer' cannot be used in this context because the set accessor is inaccessible
Este error aparece cuando el código del programa no tiene acceso al descriptor de acceso set. Para resolverlo, aumente la
accesibilidad del descriptor de acceso o cambie la ubicación de llamada. Para obtener más información, vea
Accesibilidad del descriptor de acceso asimétrico (Guía de programación de C#).
Ejemplo
El siguiente ejemplo genera el error CS0272:

// CS0272.cs
public class MyClass
{
public int Property
{
get { return 0; }
private set { }
}
}

public class Test


{
static void Main()
{
MyClass c = new MyClass();
c.Property = 10; // CS0272
// To resolve, remove the previous line
// or use an appropriate modifier on the set accessor.
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0273


Mensaje de error
El modificador de accesibilidad del descriptor de acceso 'descriptor_de_acceso_de_propiedad' debe ser más restrictivo que la
propiedad o el indizador 'propiedad'
The accessibility modifier of the 'property_accessor' accessor must be more restrictive than the property or indexer 'property'
El modificador de accesibilidad del descriptor de acceso set/get debe ser más restrictivo que la propiedad o el indizador
'propiedad/indizador'
Este error se produce cuando se declara una propiedad o un indizador con un modificador de acceso que es menos restrictivo
que el modificador de acceso de uno de sus descriptores de acceso. Para resolverlo, utilice el modificador de acceso apropiado
en la propiedad o en el descriptor de acceso set. Para obtener más información, vea Accesibilidad del descriptor de acceso.
Ejemplo
Este ejemplo contiene una propiedad interna con un método set interno. El ejemplo siguiente genera el error CS0273.

// CS0273.cs
// compile with: /target:library
public class MyClass
{
internal int Property
{
get { return 0; }
internal set {} // CS0273
// try the following line instead
// private set {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0274


Mensaje de error
No se pueden especificar modificadores de accesibilidad para ambos descriptores de acceso de la propiedad o del indizador
'propiedad/indizador'
Cannot specify accessibility modifiers for both accessors of the property or indexer 'property/indexer'
Este error aparece cuando declara una propiedad o indizador con modificadores de acceso en ambos descriptores de acceso.
Para resolver este error, utilice un modificador de acceso sólo en uno de los dos descriptores de acceso. Para obtener más
información, vea Accesibilidad del descriptor de acceso.
En el siguiente ejemplo se genera el error CS0274:

// CS0274.cs
public class MyClass
{
public int Property // CS0274
{
public get { return 0; }
protected set { }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0275


Mensaje de error
'descriptor de acceso': no se pueden utilizar modificadores de accesibilidad en descriptores de acceso de una interfaz
'accessor': accessibility modifiers may not be used on accessors in an interface
Este error se produce cuando se utiliza un modificador de acceso en cualquiera de los descriptores de acceso de una propiedad
o de un indizador en una interfaz. Para resolverlo, quite el modificador de acceso.
Ejemplo
El siguiente ejemplo genera el error CS0275:

// CS0275.cs
public interface MyInterface
{
int Property
{
get;
internal set; // CS0275
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0276


Mensaje de error
'propiedad/indizador': sólo se pueden utilizar modificadores de accesibilidad en descriptores de acceso si la propiedad o
indizador tiene tanto un descriptor de acceso get como set
'property/indexer': accessibility modifiers on accessors may only be used if the property or indexer has both a get and a set
accessor
Este error se produce cuando se declara una propiedad o un indizador con un solo descriptor de acceso y se utiliza un
modificador de acceso en el descriptor de acceso. Para resolverlo, quite el modificador de acceso o agregue otro descriptor de
acceso.
Ejemplo
El siguiente ejemplo genera el error CS0276:

// CS0276.cs
public class MyClass
{
public int Property
{
protected set { } // CS0276
}
public int Property2
{
internal get { } // CS0276
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0277


Mensaje de error
'clase' no implementa el miembro de interfaz 'miembro de interfaz'. 'descriptor de acceso de clase' no es público
'class' does not implement interface member 'accessor'. 'class accessor' is not public
Este error se produce cuando se intenta implementar una propiedad de una interfaz, pero la implementación del descriptor de
acceso de la propiedad de la clase no es pública. Los métodos que implementan miembros de interfaz tienen que tener
accesibilidad pública. Para resolverlo, quite el modificador de acceso del descriptor de acceso de la propiedad.
Ejemplo
El ejemplo siguiente genera el error CS0277:

// CS0277.cs
public interface MyInterface
{
int Property
{
get;
set;
}
}

public class MyClass : MyInterface // CS0277


{
public int Property
{
get { return 0; }
// Try this instead:
//set { }
protected set { }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0281


Mensaje de error
Se concedió acceso de confianza a 'Nombre_de_ensamblado1', pero el ensamblado de salida se denomina
'Nombre_de_ensamblado2'. Intente agregar una referencia a 'Nombre_de_ensamblado1' o cambiar el nombre del ensamblado
de salida para que coincida.
Friend access was granted to 'AssemblyName1', but the output assembly is named 'AssemblyName2'. Try adding a reference
to 'AssemblyName1' or changing the output assembly name to match.
El acceso de confianza es una nueva función de Common Language Runtime (CLR) que permite que un ensamblado vea los
tipos no públicos de otro ensamblado. Este error se produce cuando el ensamblado que concede acceso de tipo amigo
especifica un nombre incorrecto para el ensamblado al que se concede el acceso. Para obtener más información, vea
Ensamblados de confianza (Guía de programación de C#).
Ejemplo
La secuencia siguiente de ejemplos de código generará el error CS0281.
Los archivos utilizados para crear los ensamblados con nombre seguro se generan como sigue:
sn -d CS0281.snk
sn -k CS0281.snk
sn -i CS0281.snk CS0281.snk
sn -pc CS0281.snk key.publickey
sn -tp key.publickey

// CS0281.cs
// compile with: /target:library /keyfile:CS0281.snk
public class A {}

// CS0281_b.cs
// compile with: /target:library /keyfile:CS0281.snk /reference:CS0281.dll
[assembly:System.Runtime.CompilerServices.InternalsVisibleTo("CS0281 , PublicKey=0024000004
8000009400000006020000002400005253413100040000010001004b2d4d56af7c50be2fcbbf97cb880b9e73ad8
4467a587191fef63aadc118a96cecf9d508cd679c907b6e20f71684300bdc2c0a851019af0c96b29bf8f1339753
276041aefd67db46139e6348b3a12f29537b4dc6c2c19829df2c9ed6803f3c63c3b84cfa2728849386aea575c54
3a5f70fa85793d2946f15f7fe1ccb0c5e8fe0")]
class B : A {}

El código siguiente genera el error CS0281.


Observe que este ejemplo crea un archivo de resultados con el mismo nombre que el archivo de resultados del primer
ejemplo. Para resolverlo, no cambie los atributos de ensamblado del componente y agregue la clase C.

// CS0281_c.cs
// compile with: /target:library /out:CS0281.dll /keyfile:CS0281.snk /reference:CS0281_b.dl
l
// CS0281 expected
[assembly:System.Reflection.AssemblyVersion("3")]
[assembly:System.Reflection.AssemblyCulture("en-us")]
class C : B {}
public class A {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0283


Mensaje de error
El tipo 'tipo' no se puede declarar como const
The type 'type' cannot be declared const
El tipo especificado en una declaración de constante debe ser byte, char, short, int, long, float, double, decimal, bool,
string, un tipo de enumeración o un tipo de referencia asignado a un valor null. Cada expresión constante debe dar un valor
del tipo destino o de un tipo que se pueda convertir en el tipo destino mediante conversión implícita.
Ejemplo
El siguiente ejemplo genera el error CS0283.

// CS0283.cs
struct MyTest
{
}
class MyClass
{
// To resolve the error but retain the "const-ness",
// change const to readonly.
const MyTest test = new MyTest(); // CS0283

public static int Main() {


return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0304


Mensaje de error
No se puede crear ninguna instancia del tipo de variable 'tipo' porque no tiene la restricción new()
Cannot create an instance of the variable type 'type' because it does not have the new() constraint
Este error se produce si se utiliza new para crear una instancia de una variable de tipo y esa variable de tipo no especifica la
restricción new(). No se puede utilizar new para invocar directamente el constructor de un tipo desconocido, a menos que se
utilice la restricción new() para garantizar la existencia de un constructor predeterminado. Si no puede utilizar la restricción
new, considere la posibilidad de utilizar una expresión typeof para tener acceso al constructor deseado.
El código siguiente genera el error CS0304:

// CS0304.cs
// compile with: /target:library
class C<T>
{
T t = new T(); // CS0304
}

La instrucción new de este formulario tampoco se permite en los métodos de clase:

// CS0304_2.cs
// compile with: /target:library
class C<T>
{
public void f()
{
T t = new T(); // CS0304
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0305


Mensaje de error
El uso del tipo genérico 'tipo genérico' requiere 'número' argumentos de tipo
Using the generic type 'generic type' requires 'number' type arguments
Este error aparece cuando no se ha encontrado el número esperado de argumentos de tipo. Para resolver el error C0305,
utilice el número necesario de argumentos de tipo.
Ejemplo
El código siguiente genera el error CS0305.

// CS0305.cs
public class MyList<T> {}
public class MyClass<T> {}

class MyClass
{
public static void Main()
{
MyList<MyClass, MyClass> list1 = new MyList<MyClass>(); // CS0305
MyList<MyClass> list2 = new MyList<MyClass>(); // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0306


Mensaje de error
El tipo 'tipo' no se puede utilizar como argumento de tipo
The type 'type' may not be used as a type argument
No se permite el tipo utilizado como un tipo de parámetro. Esto podría deberse a que el tipo es un tipo de puntero.
En el código siguiente se genera el error CS0306:

// CS0306.cs
class C<T>
{
}

class M
{
// CS0306 – int* not allowed as a type parameter
C<int*> f;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0307


Mensaje de error
'construcción' 'identificador' no se puede utilizar con argumentos de tipo
The 'construct' 'identifier' cannot be used with type arguments
La construcción indicada no era un tipo o un método, que son las únicas estructuras que admiten argumentos genéricos. Quite
los argumentos de tipo entre corchetes angulares. Si se necesita un argumento genérico, declare la construcción genérica
como un tipo o método genérico.
El código siguiente genera el error CS0307:

// CS0307.cs
class C
{
public int P { get { return 1; } }
public static void Main()
{
C c = new C();
int p = c.P<int>(); // CS0307 – C.P is a property
// Try this instead
// int p = c.P;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0308


Mensaje de error
El 'identificador' de tipo o método no genérico no se puede utilizar con argumentos de tipo.
The non-generic type-or-method 'identifier' cannot be used with type arguments.
El método o el tipo no es genérico, pero se utilizó con argumentos de tipo. Para evitar este error, quite los corchetes angulosos
y escriba argumentos, o vuelva a declarar el método o el tipo como un tipo o método genérico.
El ejemplo siguiente genera el error CS3008:

// CS0308a.cs
class MyClass
{
public void F() {}
public static void Main()
{
F<int>(); // CS0308 – F is not generic.
// Try this instead:
// F();
}
}

El ejemplo siguiente también genera el error CS3008: Para resolver el error, utilice la directiva "using
System.Collections.Generic".

// CS0308b.cs
// compile with: /t:library
using System.Collections;
// To resolve, uncomment the following line:
// using System.Collections.Generic;
public class MyStack<T>
{
// Store the elements of the stack:
private T[] items = new T[100];
private int stack_counter = 0;

// Define the iterator block:


public IEnumerator<T> GetEnumerator() // CS0308
{
for (int i = stack_counter - 1 ; i >= 0; i--)
yield return items[i];
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0309


Mensaje de error
El tipo 'nombre_de_tipo' se debe poder convertir en 'tipo_de_restricción' para utilizarlo como parámetro 'parámetro' en el tipo
o método genéricos 'generic'
The type 'typename' must be convertible to 'constraint type' in order to use it as parameter 'parameter' in the generic type or
method 'generic'
Cuando se utiliza una clase o un método genéricos, se deben respetar las restricciones aplicadas al tipo genérico con la palabra
clave where. Este error se produce cuando se infringen las restricciones. Para corregirlo, debe pasarse un tipo diferente a la
clase o al método genéricos, o bien modificarse las restricciones.
El ejemplo siguiente genera CS0309, puesto que B no implementa I y C<T> especifica en sus restricciones que T debe
implementar I:

// CS0309.cs
using System;
interface I
{
}

class C<T> where T : I


{
}

class B
{
}

class CMain
{
public static void Main()
{
Console.WriteLine(new C<B>()); // CS0309
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0310


Mensaje de error
El tipo 'nombretipo' debe tener un constructor sin parámetros público para utilizarlo como parámetro 'parámetro' en el tipo o
método genérico 'genérico'
The type 'typename' must have a public parameterless constructor in order to use it as parameter 'parameter' in the generic
type or method 'generic'
El tipo o método genérico define una nueva restricción en su cláusula where, por lo que cualquier tipo debe tener un
constructor sin parámetros público para utilizarlo como argumento de tipo de dicho tipo o método genérico. Para evitar este
error, asegúrese de que el tipo tiene el constructor correcto, o bien modifique la cláusula de restricción del tipo o método
genérico.
Ejemplo
En el código siguiente se genera el error CS0310:

// CS0310.cs
using System;

class G<T> where T : new()


{
T t;

public G()
{
t = new T();
Console.WriteLine(t);
}
}

class B
{
private B() { }
// Try this instead:
// public B() { }
}

class CMain
{
public static void Main()
{
G<B> g = new G<B>(); // CS0310
Console.WriteLine(g.ToString());
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0400


Mensaje de error
El tipo o nombre del espacio de nombres 'identificador' no se pudo encontrar en el espacio de nombres global (compruebe si
falta una referencia de ensamblado)
The type or namespace name 'identifier' could not be found in the global namespace (are you missing an assembly reference?)
El identificador cuyo ámbito está delimitado por el operador de ámbito global (::) no se ha encontrado en el espacio de
nombres global. Puede deberse a que falte una referencia de ensamblado que contenga el identificador o a que el identificador
se haya declarado en una clase o espacio de nombres diferente del espacio de nombres global. Este error también se puede
producir si no se declara o se escribe incorrectamente un identificador de ámbito global.
Para evitarlo, busque la declaración del identificador, compruebe que esté escrita correctamente y, si se encuentra en un
ensamblado distinto, asegúrese de que tiene la referencia de ensamblado apropiada. Si el identificador se declara dentro de
otro tipo o espacio de nombres, utilice el nombre completo después del operador ::. El código siguiente genera el error
CS0400:

// CS0400.cs
class C
{
public static void Main()
{
// CS0400 - D could not be found
// in the global namespace.
global::D d = new global::D();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0401


Mensaje de error
La restricción new() debe ser la última restricción especificada
The new() constraint must be the last constraint specified
Cuando utilice varias restricciones, enumere todas las demás restricciones antes de la restricción new().
Ejemplo
En el código siguiente se genera el error CS0401.

// CS0401.cs
// compile with: /target:library
using System;
class C<T> where T : new(), IDisposable {} // CS0401

class D<T> where T : IDisposable


{
static void F<U>() where U : new(), IDisposable{} // CS0401
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0403


Mensaje de error
No se puede convertir null en el parámetro de tipo 'parámetro de tipo' porque podría ser un tipo de valor. Utilice default('T') en
su lugar.
Cannot convert null to type parameter 'type parameter' because it could be a value type. Consider using default('T') instead.
No se puede asignar null al tipo desconocido indicado porque podría ser un tipo de valor, que no admite la asignación de null.
Si la clase genérica no está destinada a aceptar tipos de valores, utilice la restricción de tipo de clase. Si puede aceptar tipos de
valor, como los tipos integrados, puede ser conveniente sustituir la asignación a null por la expresión default(T), como se
muestra en el siguiente ejemplo.
Ejemplo
El código siguiente genera el error CS0403.

// CS0403.cs
// compile with: /target:library
class C<T>
{
public void f()
{
T t = null; // CS0403
T t2 = default(T); // OK
}
}

class D<T> where T : class


{
public void f()
{
T t = null; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0404


Mensaje de error
'<' inesperado: los atributos no pueden ser genéricos
'<' unexpected : attributes cannot be generic
En los atributos no se permiten parámetros de tipo genérico. Quite el parámetro de tipo y los corchetes angulares.
El código siguiente genera el error CS0404:

// CS0404.cs
[MyAttrib<int>] // CS0404
class C
{
public static void Main()
{

}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0405


Mensaje de error
Restricción 'restricción' duplicada para el parámetro de tipo 'parámetro de tipo'
Duplicate constraint 'constraint' for type parameter 'type parameter'
Dos de las restricciones de la declaración genérica son idénticas. Para eliminar el error, quite la duplicada.
El código siguiente genera el error CS0405:

// CS0405.cs
interface I
{
}

class C<T> where T : I, I // CS0405.cs


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0406


Mensaje de error
La restricción de tipo de clase 'restricción' debe ir delante de cualquier otra restricción
The class type constraint 'constraint' must come before any other constraints
Cuando un método o tipo genérico tiene una restricción de tipo de clase, dicha restricción debe mostrarse primero. Para evitar
este error, mueva la restricción de tipo de clase al principio de la lista de restricciones.
Ejemplo
En el código siguiente se genera el error CS0406.

// CS0406.cs
// compile with: /target:library
interface I {}
class C {}
class D<T> where T : I, C {} // CS0406
class D2<T> where T : C, I {} // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS0407


Mensaje de error
'tipo de valor devuelto de método' es un tipo de valor devuelto equivocado
'return-type method' has the wrong return type
El método no es compatible con el tipo de delegado. Los tipos de argumentos coinciden, pero el tipo de valor devuelto no es el
correcto para ese delegado. Para evitar este error, utilice un método diferente, cambie el tipo de valor devuelto del método o
cambie el tipo de valor devuelto del delegado.
Ejemplo
El código siguiente genera el error CS0407:

// CS0407.cs
public delegate int MyDelegate();
class C
{
MyDelegate d;
public C()
{
d = new MyDelegate(F); // OK: F returns int
d = new MyDelegate(G); // CS0407 – G doesn't return int
}

public int F()


{
return 1;
}

public void G()


{
}

public static void Main()


{
C c1 = new C();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0409


Mensaje de error
Ya se ha especificado una cláusula de restricciones para el parámetro de tipo 'parámetro de tipo'. Todas las restricciones
correspondientes a un parámetro de tipo se deben especificar en una sola cláusula where.
A constraint clause has already been specified for type parameter 'type parameter'. All of the constraints for a type parameter
must be specified in a single where clause.
Se han encontrado varias cláusulas de restricción (cláusulas where) para un mismo parámetro de tipo. Quite la cláusula where
incorrecta o corrija las cláusulas where de modo que haya un parámetro de tipo único para cada cláusula.

// CS0409.cs
interface I
{
}

class C<T1, T2> where T1 : I where T1 : I // CS0409 – T1 used twice


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0410


Mensaje de error
Ninguna sobrecarga de 'método' tiene el parámetro y los tipos de valor devuelto correctos
No overload for 'method' has the correct parameter and return types
Este error aparece si intenta crear instancias de un delegado con una función que tiene tipos de parámetro incorrectos. Los
tipos de parámetro del delegado deben coincidir con los de la función que está asignando al delegado.
Ejemplo
En el código siguiente se genera el error CS0410:

// CS0410.cs
// compile with: /langversion:ISO-1

class Test
{
delegate void D(double d );
static void F(int i) { }

static void Main()


{
D d = new D(F); // CS0410
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0411


Mensaje de error
Los argumentos de tipo para el método 'método' no se pueden inferir a partir del uso. Intente especificar los argumentos de
tipo explícitamente.
The type arguments for method 'method' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Este error se produce cuando se llama a un método genérico sin proporcionar explícitamente los argumentos de tipo y el
compilador no es capaz de deducir cuáles se pretende utilizar. Para evitarlo, agregue los argumentos de tipo que desee utilizar
entre corchetes angulares.
Ejemplo
El código siguiente genera el error CS0411:

// CS0411.cs
class C
{
void G<T>()
{
}

public static void Main()


{
G(); // CS0411
// Try this instead:
// G<int>();
}
}

Otros casos posibles en que puede producirse este error incluyen cuando el parámetro es null, puesto que no tiene ninguna
información de tipo:

// CS0411b.cs
class C
{
public void F<T>(T t) where T : C
{
}

public static void Main()


{
C c = new C();
c.F(null); // CS0411
}
}

Otro caso se produce cuando uno o varios parámetros requieren una conversión:

// CS0411c.cs

class C
{
void F<T>(T t1, T t2)
{
}
public static void Main()
{
C c = new C();
c.F(1, 2L); // CS0411 -- is T int or long?
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0412


Mensaje de error
'genérico': un parámetro o variable local no puede tener el mismo nombre que un parámetro de tipo de método
'generic': a parameter or local variable cannot have the same name as a method type parameter
Hay un conflicto de nombre entre el parámetro de tipo de un método genérico y una variable local del método, o uno de los
parámetros del método. Para evitar este error, cambie el nombre de los parámetros o variables locales incompatibles.
Ejemplo
En el código siguiente se genera el error CS0412:

// CS0412.cs
using System;

class C
{
// Parameter name is the same as method type parameter name
public void G<T>(int T) // CS0412
{
}
public void F<T>()
{
// Method local variable name is the same as method type
// parameter name
double T = 0.0; // CS0412
Console.WriteLine(T);
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0413


Mensaje de error
El parámetro de tipo 'parámetro de tipo' no se puede utilizar con el operador 'as' porque no tiene ninguna restricción de tipo
de clase ni una restricción 'class'
The type parameter 'type parameter' cannot be used with the 'as' operator because it does not have a class type constraint nor
a 'class' constraint
Este error aparece si un tipo genérico utiliza el operador as, pero dicho tipo genérico no tiene una restricción de tipo de clase.
Sólo se permite el operador as con tipos de referencia, por lo que el parámetro de tipo debe restringirse para garantizar que
no es un tipo de valor. Para evitar este error, utilice una restricción de tipo de clase o una restricción de tipo de referencia.
Esto se debe a que el operador as podría devolver null, que no es un valor permitido para un tipo de valor y el parámetro de
tipo debe tratarse como un tipo de valor a menos que sea una restricción de tipo de clase o una restricción de tipo de
referencia.
Ejemplo
El código siguiente genera el error CS0413.

// CS0413.cs
// compile with: /target:library
class A {}
class B : A {}

class CMain
{
A a = null;
public void G<T>()
{
a = new A();
System.Console.WriteLine (a as T); // CS0413
}

// OK
public void H<T>() where T : A
{
a = new A();
System.Console.WriteLine (a as T);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0415


Mensaje de error
El atributo 'IndexerName' sólo es válido en un indizador que no sea una declaración de miembro de interfaz explícita
The 'IndexerName' attribute is valid only on an indexer that is not an explicit interface member declaration
Este error se produce cuando se utiliza un atributo IndexerName en un indizador que es una implementación explícita de una
interfaz. Se puede evitar quitando el nombre de interfaz de la declaración del indizador, si es posible. Para obtener más
información, vea IndexerNameAttribute (Clase).
El código siguiente genera el error CS0415:

// CS0415.cs
using System;
using System.Runtime.CompilerServices;

public interface IA
{
int this[int index]
{
get;
set;
}
}

public class A : IA
{
[IndexerName("Item")] // CS0415
int IA.this[int index]
// Try this line instead:
// public int this[int index]
{
get { return 0; }
set { }
}

static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0416


Mensaje de error
'parámetro de tipo': un argumento de atributo no puede utilizar parámetros de tipo
'type parameter': an attribute argument cannot use type parameters
Se ha utilizado un parámetro de tipo como argumento de atributo, lo que no está permitido. Utilice un tipo no genérico.
El código siguiente genera el error CS0416:

// CS0416.cs
public class MyAttribute : System.Attribute
{
public MyAttribute(System.Type t)
{
}
}

class G<T>
{

[MyAttribute(typeof(G<T>))] // CS0416
public void F()
{
}

}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0417


Mensaje de error
'identificador': no se pueden proporcionar argumentos cuando se cree una instancia de un tipo variable
'identifier': cannot provide arguments when creating an instance of a variable type
Este error aparece si una llamada al operador new de un parámetro de tipo tiene argumentos. El único constructor al que
puede llamarse mediante el operador new en un tipo de parámetro desconocido es un constructor sin argumentos. Si necesita
llamar a otro constructor, considere utilizar una restricción de tipo de clase o restricción de interfaz.
Ejemplo
En el siguiente ejemplo se genera el error CS0417:

// CS0417
class C<T> where T : new()
{
T type = new T(1); // CS0417
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0418


Mensaje de error
'nombre de clase': una clase abstract no puede ser sealed ni static
'class name': an abstract class cannot be sealed or static
No se puede utilizar una clase abstract para crear objetos a menos que se trate de clases derivadas de ella, por lo que no tiene
ningún sentido que sea sealed. Tampoco tiene sentido que una clase abstract sea estática; las clases abstractas están diseñadas
para admitir una jerarquía de objetos que utilizará la clase abstracta como clase base.
Ejemplo
En el código siguiente se genera el error CS0418:

// CS0418.cs
public abstract sealed class C // CS0418
{
}

sealed static class S // CS0418


{
}

public class MyClass


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0423


Mensaje de error
Dado que 'clase' tiene el atributo ComImport, 'método' debe ser extern o abstract
Since 'class' has the ComImport attribute, 'method' must be extern or abstract
Especificar el atributo ComImport implica que la implementación para la clase se importará de un módulo COM. Pueden no
definirse métodos adicionales.
En el código siguiente se genera el error CS0423:

// CS0423.cs

using System.Runtime.InteropServices;

[
ComImport,
Guid("7ab770c7-0e23-4d7a-8aa2-19bfad479829")
]
class ImageProperties
{
public static void Main() // CS0423
{
ImageProperties i = new ImageProperties();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0424


Mensaje de error
'clase': una clase con el atributo ComImport no puede especificar ninguna clase base
'class': a class with the ComImport attribute cannot specify a base class
Especificar el atributo ComImportAttribute implica que la implementación para la clase se importará de un módulo COM. No
se permite agregar métodos adicionales ni campos heredados de la clase base a la implementación definida en el módulo
COM.
El código siguiente genera el error CS0424:

// CS0424.cs
// compile with: /target:library
using System.Runtime.InteropServices;
public class A {}
[ ComImport, Guid("7ab770c7-0e23-4d7a-8aa2-19bfad479829") ]
class B : A {} // CS0424 error
Referencia de Visual C#: errores y advertencias

Error del compilador CS0425


Mensaje de error
Las restricciones para el parámetro de tipo 'parámetro de tipo' del método 'método' deben coincidir con las restricciones del
parámetro de tipo 'parámetro de tipo' del método de interfaz 'método.' Utilice una implementación de interfaz explícita en su
lugar.
The constraints for type parameter 'type parameter' of method 'method' must match the constraints for type parameter 'type
parameter' of interface method 'method'. Consider using an explicit interface implementation instead.
Este error aparece si se reemplaza un método genérico virtual de una clase derivada y las restricciones del método de la clase
derivada no coinciden con las restricciones del método de la clase base. Para evitar este error, asegúrese de que la cláusula
where es idéntica en ambas declaraciones, o implemente la interfaz explícitamente.

Ejemplo
En el siguiente ejemplo se genera el error CS0425:

// CS0425.cs

class C1
{
}

class C2
{
}

interface IBase
{
void F<ItemType>(ItemType item) where ItemType : C1;
}

class Derived : IBase


{
public void F<ItemType>(ItemType item) where ItemType : C2 // CS0425
{
}
}

class CMain
{
public static void Main()
{
}
}

Las restricciones no tienen que ser una coincidencia literal, siempre que el conjunto de restricciones tenga el mismo
significado. Por ejemplo, lo siguiente es correcto:

// CS0425b.cs
interface J<Z>
{
}
interface I<S>
{
void F<T>(S s, T t) where T: J<S>, J<int>;
}

class C : I<int>
{
public void F<X>(int s, X x) where X : J<int>
{
}
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0426


Mensaje de error
El nombre de tipo 'identificador' no existe en el tipo 'tipo'
The type name 'identifier' does not exist in the type 'type'
No se encontró el nombre de tipo en el tipo especificado. Compruebe la ortografía de los nombres utilizados y asegúrese de
que el tipo al que se hace referencia tenga el miembro esperado.
El código siguiente genera el error CS0426:

// CS0426.cs

class C
{
}

class D
{
public static void Main()
{
C.A a; // CS0426
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0428


Mensaje de error
No se puede convertir el grupo de métodos 'Identificador' en tipo no delegado 'tipo'. ¿Intentó invocar el método?
Cannot convert method group 'Identifier' to non-delegate type 'type'. Did you intend to invoke the method?
Este error aparece al convertir un grupo de métodos en un tipo no delegado o al intentar invocar un método sin utilizar los
paréntesis.
Ejemplo
En el código siguiente se genera el error CS0428:

// CS0428.cs

delegate object Del1();


delegate int Del2();
public class C
{
public static C Method() { return null; }
public int Foo() { return 1; }

public static void Main()


{
C c = Method; // CS0428, C is not a delegate type.
int i = (new C()).Foo; // CS0428, int is not a delegate type.

Del1 d1 = Method; // OK, assign to the delegate type.


Del2 d2 = (new C()).Foo; // OK, assign to the delegate type.
// or you might mean to invoke method
// C c = Method();
// int i = (new C()).Foo();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0430


Mensaje de error
El alias externo 'alias' no se especificó en una opción /reference
The extern alias 'alias' was not specified in a /reference option
Este error aparece cuando se encuentra el alias externo pero no se ha especificado el alias como una referencia en la línea de
comandos. Para resolver el error CS0430, compile con /reference.
Ejemplo
// CS0430_a.cs
// compile with: /target:library
public class MyClass {}

Al compilar con /reference:MyType=cs0430_a.dll para hacer referencia al archivo DLL creado en el ejemplo anterior se
resuelve este error. El código siguiente genera el error CS0430.

// CS0430_b.cs
extern alias MyType; // CS0430
public class Test
{
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0431


Mensaje de error
No se puede utilizar el alias 'identificador' con '::' porque hace referencia a un tipo. Utilice '.' en su lugar.
Cannot use alias 'identifier' with '::' since the alias references a type. Use '.' instead.
Ha utilizado "::" con un alias que hace referencia a un tipo. Para resolver este error, utilice el operador ".".
El código siguiente genera el error CS0431.

// CS0431.cs
using A = Outer;

public class Outer


{
public class Inner
{
public static void Meth() {}
}
}

public class MyClass


{
public static void Main()
{
A::Inner.Meth(); // CS0431
A.Inner.Meth(); // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0432


Mensaje de error
No se encontró el alias 'identificador'
Alias 'identifier' not found
Este error se produce cuando se utiliza "::" a la derecha de un identificador que no es un alias. Para resolver el error, utilice "."
en su lugar.
El siguiente ejemplo genera el error CS0432:

// CS0432.cs
namespace A {
public class B {
public static void Meth() { }
}
}
public class Test
{
public static void Main()
{
A::B.Meth(); // CS0432
// To resolve, use the following line instead:
// A.B.Meth();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0433


Mensaje de error
El tipo NombreTipo1 existe tanto en NombreTipo2 como en NombreTipo3
The type TypeName1 exists in both TypeName2 and TypeName3
Dos ensamblados diferentes a los que la aplicación hace referencia contienen el mismo espacio de nombres y tipo, lo que
produce ambigüedad.
Para resolver este error, utilice la característica de alias de la opción de compilador
/reference (Importar metadatos) (Opciones del compilador de C#) o no haga referencia a uno de los ensamblados.
Ejemplo
Este código crea el archivo DLL con la primera copia del tipo ambiguo.

// CS0433_1.cs
// compile with: /target:library
namespace TypeBindConflicts
{
public class AggPubImpAggPubImp {}
}

Este código crea el archivo DLL con la segunda copia del tipo ambiguo.

// CS0433_2.cs
// compile with: /target:library
namespace TypeBindConflicts
{
public class AggPubImpAggPubImp {}
}

En el siguiente ejemplo se genera el error CS0433.

// CS0433_3.cs
// compile with: /reference:cs0433_1.dll /reference:cs0433_2.dll
using TypeBindConflicts;
public class Test
{
public static void Main()
{
AggPubImpAggPubImp n6 = new AggPubImpAggPubImp(); // CS0433
}
}

En el siguiente ejemplo se muestra cómo utilizar la característica de alias de la opción de compilador /reference para resolver
este error CS0433.

// CS0433_4.cs
// compile with: /reference:cs0433_1.dll /reference:TypeBindConflicts=cs0433_2.dll
using TypeBindConflicts;
public class Test
{
public static void Main()
{
AggPubImpAggPubImp n6 = new AggPubImpAggPubImp();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0434


Mensaje de error
El espacio de nombres NombreEspaciodenombres1 de NombreEspaciodenombres2 entra en conflicto con el tipo
NombreTipo1 en NombreEspaciodenombres3.
The namespace NamespaceName1 in NamespaceName2 conflicts with the type TypeName1 in NamespaceName3
Este error aparece cuando el tipo importado y el espacio de nombres importado tienen el mismo nombre completo. Cuando se
hace referencia a dicho nombre, el compilador no puede distinguir entre los dos.
En el siguiente código se genera el error CS0434.
Ejemplo
Este código crea la primera copia del tipo con el nombre completo idéntico.

// CS0434_1.cs
// compile with: /t:library
namespace TypeBindConflicts
{
namespace NsImpAggPubImp
{
public class X { }
}
}

Este código crea la segunda copia del tipo con el nombre completo idéntico.

// CS0434_2.cs
// compile with: /t:library
namespace TypeBindConflicts {
// Conflicts with another import (import2.cs).
public class NsImpAggPubImp { }
// Try this instead:
// public class UniqueClassName { }
}

Este código hace referencia al tipo con el nombre completo idéntico.

// CS0434.cs
// compile with: /r:cs0434_1.dll /r:cs0434_2.dll
using TypeBindConflicts;
public class Test
{
public TypeBindConflicts.NsImpAggPubImp.X n2 = null; // CS0434
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0438


Mensaje de error
El tipo 'tipo' en 'módulo_2' entra en conflicto con el espacio de nombres 'espacio de nombres' en 'módulo_2'.
The type 'type' in 'module_1' conflicts with the namespace 'namespace' in 'module_2'.
Este error aparece cuando un tipo de un archivo de código fuente entra en conflicto con un espacio de nombres de otro
archivo de código. Esto pasa normalmente cuando alguno de ellos o ambos provienen de un módulo agregado. Para resolver
el error, cambie el tipo o el espacio de nombres que produjo el conflicto.
En el siguiente ejemplo se genera el error CS0438:
Compile este archivo primero:

// CS0438_1.cs
// compile with: /target:module
public class Util
{
public class A { }
}

A continuación, compile este archivo:

// CS0438_2.cs
// compile with: /target:module
namespace Util
{
public class A { }
}

Y después, compile este archivo:

// CS0438_3.cs
// compile with: /addmodule:CS0438_1.netmodule /addmodule:CS0438_2.netmodule
using System;
public class Test
{
public static void Main() {
Console.WriteLine(typeof(Util.A)); // CS0438
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0439


Mensaje de error
Una declaración de alias externa debe preceder al resto de elementos de espacio de nombres
An extern alias declaration must precede all other namespace elements
Este error se produce cuando una declaración extern figura detrás de otro elemento, como, por ejemplo, de una declaración
using, en el mismo espacio de nombres. Las declaraciones extern deben situarse antes de todos los demás elementos del
espacio de nombres.
Ejemplo
El siguiente ejemplo genera el error CS0439:

// CS0439.cs
using System;
extern alias MyType; // CS0439
// To resolve the error, make the extern alias the first line in the file.

public class Test


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0441


Mensaje de error
'clase': una clase no puede ser static y sealed
'class': a class cannot be both static and sealed
Este error aparece cuando se declara una clase que es static y sealed al mismo tiempo. Las clases static son sealed por
definición, de modo que el modificador sealed no es necesario. Para resolverlo, utilice sólo un modificador.
El siguiente ejemplo genera el error CS0441:

// CS0441.cs
sealed static class MyClass { } // CS0441
Referencia de Visual C#: errores y advertencias

Error del compilador CS0442


Mensaje de error
'Propiedad': las propiedades abstractas no pueden tener descriptores de acceso privados
'Property': abstract properties cannot have private accessors
Este error aparece cuando utiliza el modificador de acceso "private" para modificar un descriptor de acceso abstracto. Para
resolver el error, utilice un modificador de acceso diferente o haga que la propiedad no sea abstracta.
Ejemplo
En el código siguiente se genera el error CS0442:

// CS0442.cs
public abstract class MyClass
{
public abstract int AbstractProperty
{
get;
private set; // CS0442
// Try this instead:
// set;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0443


Mensaje de error
Error de sintaxis, se esperaba un valor
Syntax error, value expected
Este error aparece cuando hace referencia a una matriz sin especificar un valor para el índice de matriz.
Ejemplo
En el código siguiente se genera el error CS0443.

// CS0443.cs
using System;
class MyClass
{
public static void Main()
{
int[,] x = new int[1,5];
if (x[] == 5) {} // CS0443
// if (x[0, 0] == 5) {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0445


Mensaje de error
No se puede modificar el resultado de una conversión unboxing
Cannot modify the result of an unboxing conversion
El resultado de una conversión unboxing es una variable temporal y el compilador evita que se modifiquen estas variables
porque cualquier modificación desaparecería al desaparecer la variable temporal. Para corregirlo, utilice un tipo de valor para
almacenar la expresión intermedia. De este modo podrá asignar un valor al tipo de valor.
El código siguiente genera el error CS0455:

// CS0445.CS
public struct Point
{
public int x;
public static void SetX(object obj, int x)
{
((Point)obj).x = x; // CS0445
}
}
class UnboxingTest{public static void Main(){}}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0446


Mensaje de error
Foreach no puede funcionar en un 'Método o Delegado'. ¿Intentó invocar el 'Método o Delegado'?
Foreach cannot operate on a 'Method or Delegate'. Did you intend to invoke the 'Method or Delegate'?
Este error se produce al especificar un método sin paréntesis o un método anónimo sin paréntesis en la parte de la instrucción
foreach donde normalmente colocaría una clase de colección. Tenga en cuenta que es válido, aunque no habitual, colocar una
llamada de método en dicha ubicación, si el método devuelve una clase de colección.
Ejemplo
En el siguiente código se generará el error CS0446.

// CS0446.cs
using System;
class Tester
{
static void Main()
{
int[] intArray = new int[5];
foreach (int i in M) { } // CS0446
}
static void M() { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0447


Mensaje de error
Los atributos no se pueden utilizar en argumentos de tipo, sólo en parámetros de tipo
Attributes cannot be used on type arguments, only on type parameters
Este error aparece cuando aplica un atributo a un argumento de tipo que aparece en una instrucción de llamada. Es aceptable
aplicar un atributo a un parámetro de tipo en una instrucción de declaración de método o clase como la siguiente:

class C<[some attribute] T> {…}

En la siguiente línea de código se generará este error. Se supone que la clase C, definida en la línea anterior de código, tiene un
método estático denominado MyStaticMethod.

C<[some attribute] T>.MyStaticMethod();

Ejemplo
En el siguiente código se genera el error CS0447.

// CS0447.cs
using System;
namespace Test41
{
public interface I<A>
{
void Meth<B>();
}
public class B : I<int>
{
void I<[Test] int>.Meth<X>() { } // CS0447
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0448


Mensaje de error
El tipo de valor devuelto para el operador ++ o -- debe ser el tipo contenedor o derivarse de éste
The return type for ++ or -- operator must be the containing type or derived from the containing type
Cuando se reemplazan los operadores ++ o --, deben devolver el mismo tipo que el tipo contenedor o devolver otro tipo que
se derive de él.
Ejemplo
El código siguiente genera el error CS0448.

// CS0448.cs
class C5
{
public static int operator ++(C5 c) { return null; } // CS0448
public static C5 operator --(C5 c) { return null; } // OK
public static void Main() {}
}

El código siguiente genera el error CS0448.

// CS0448_b.cs
public struct S
{
public static S? operator ++(S s) { return new S(); } // CS0448
public static S? operator --(S s) { return new S(); } // CS0448
}

public struct T
{
// OK
public static T operator --(T t) { return new T(); }
public static T operator ++(T t) { return new T(); }

public static T? operator --(T? t) { return new T(); }


public static T? operator ++(T? t) { return new T(); }
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0449


Mensaje de error
Las restricciones 'class' o 'struct' deben ir antes que cualquier otra restricción
The 'class' or 'struct' constraint must come before any other constraints
Las restricciones del parámetro de tipo de un tipo o método genérico deben efectuarse en un orden concreto: primero class o
struct si las hay; a continuación las restricciones de interfaz y, por último, las de constructor. Este error lo provoca una
restricción class o struct que no aparece en primer lugar. Para resolverlo, reordene las cláusulas de restricción.
Ejemplo
El código siguiente genera el error CS0449.

// CS0449.cs
// compile with: /target:library
interface I {}
public class C4
{
public void F1<T>() where T : class, struct, I {} // CS0449
public void F2<T>() where T : I, struct {} // CS0449
public void F3<T>() where T : I, class {} // CS0449

// OK
public void F4<T>() where T : class {}
public void F5<T>() where T : struct {}
public void F6<T>() where T : I {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0450


Mensaje de error
'Nombre de parámetro de tipo': no se pueden especificar una clase de restricción y la restricción 'class' o 'struct'
'Type Parameter Name': Cannot specify both a constraint class and the 'class' or 'struct' constraint
Si el parámetro de tipo está restringido por la restricción de tipo de estructura, lógicamente resulta contradictorio que también
esté restringido por un tipo de clase determinado, puesto que estructuras y clases son categorías mutuamente excluyentes. Si
un parámetro de tipo está restringido por una restricción de tipo de clase específica, por definición está restringido por la
restricción de tipo de clase; por tanto, utilizar dicha restricción sería redundante.
Ejemplo
// CS0450.cs
// compile with: /t:library
public class GenericsErrors
{
public class B { }
public class G3<T> where T : struct, B { } // CS0450
// To resolve, use the following line instead:
// public class G3<T> where T : B { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0451


Mensaje de error
La restricción 'new () ' no se puede utilizar con la restricción 'struct'
The 'new()' constraint cannot be used with the 'struct' constraint
Al especificar las restricciones en el tipo de un genérico, la restricción new() sólo puede utilizarse con restricciones de tipo de
clase, restricciones de tipo de interfaz, restricciones de tipo de referencia y restricciones de parámetro de tipo, pero no con
restricciones de tipo de valor.
Ejemplo
El siguiente ejemplo genera el error CS0451.

// CS0451.cs
using System;
public class C4
{
public void F4<T>() where T : struct, new() {} // CS0451
}
// OK
public class C5
{
public void F5<T>() where T : struct {}
}

public class C6
{
public void F6<T>() where T : new() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0452


Mensaje de error
El tipo 'nombre del tipo' debe ser un tipo de referencia para poder utilizarlo como parámetro 'nombre del parámetro' en el
tipo o método genérico 'identificador de genérico'
The type 'type name' must be a reference type in order to use it as parameter 'parameter name' in the generic type or method
'identifier of generic'
Este error se produce cuando se pasa un tipo de valor como struct o int como parámetro a un tipo o método genérico que
tiene una restricción de tipo de referencia.
Ejemplo
El código siguiente genera el error CS0452.

// CS0452.cs
using System;
public class BaseClass<S> where S : class { }
public class Derived1 : BaseClass<int> { } // CS0452
public class Derived2<S> : BaseClass<S> where S : struct { } // CS0452
Referencia de Visual C#: errores y advertencias

Error del compilador CS0453


Mensaje de error
El tipo 'Nombre de tipo' debe ser un tipo de valor distinto de null para poder utilizarlo como parámetro 'Nombre de
parámetro' en el tipo o método genérico 'Identificador genérico'
The type 'Type Name' must be a non-nullable value type in order to use it as parameter 'Parameter Name' in the generic type
or method 'Generic Identifier'
Este error aparece cuando utiliza un argumento de tipo sin valor para crear instancias de un tipo o método genérico que tiene
la restricción value en él. También puede aparecer cuando utiliza un argumento de tipo con valor que acepta valores null. Vea
las últimas dos líneas de código en el siguiente ejemplo.
Ejemplo
El código siguiente genera este error.

// CS0453.cs
using System;
public class HV<S> where S : struct { }
public class H1 : HV<string> { } // CS0453
public class H2 : HV<H1> { } // CS0453
public class H3<S> : HV<S> where S : class { } // CS0453
public class H4 : HV<int?> { } // CS0453
public class H5 : HV<Nullable<Nullable<int>>> { } // CS0453
Referencia de Visual C#: errores y advertencias

Error del compilador CS0454


Mensaje de error
Dependencia de restricción circular que requiere 'Parámetro de tipo 1' y 'Parámetro de tipo 2'
Circular constraint dependency involving 'Type Parameter 1' and 'Type Parameter 2'
Este error se produce porque, en algún punto, un parámetro de tipo hace referencia a un segundo parámetro que, a su vez,
hace referencia al primero. Para corregirlo, interrumpa la dependencia circular quitando una de las restricciones. Tenga en
cuenta que la dependencia de restricción circular puede ser indirecta.
Ejemplo
El código siguiente genera el error CS0454.

// CS0554
using System;
public class GenericsErrors
{
public class G4<T> where T : T { } // CS0454
}

El ejemplo siguiente muestra una dependencia circular entre dos restricciones de tipo.

public class Gen<T,U> where T : U where U : T // CS0454


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0455


Mensaje de error
El parámetro de tipo 'nombre del parámetro de tipo' hereda las restricciones conflictivas 'Nombre de restricción 1' y 'Nombre
de restricción 2'
Type parameter 'Type Parameter Name' inherits conflicting constraints 'Constraint Name 1' and 'Constraint Name 2'
Dos motivos habituales por los que se obtiene este error son la configuración de restricciones para que el parámetro de tipo se
derive de dos clases no relacionadas, o para que se derive al mismo tiempo de una restricción de tipo de referencia o tipo de
clase y una restricción de tipo de valor o tipo struct. Para resolver este error, evite este conflicto en la jerarquía de herencia.
Ejemplo
En el siguiente código se genera el error CS0455.

// CS0455.cs
using System;

public class GenericsErrors {


public class B { }
public class B2 { }
public class G6<T> where T : B { public class N<U> where U : B2, T { } } // CS0455
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0456


Mensaje de error
El parámetro de tipo 'Nombre del parámetro de tipo 1' tiene la restricción 'struct'; por tanto, 'Nombre del parámetro de tipo 1'
no se puede utilizar como restricción para 'Nombre del parámetro de tipo 2'
Type parameter 'Type Parameter Name 1' has the 'struct' constraint so 'Type Parameter Name 1' cannot be used as a
constraint for 'Type Parameter Name 2'
Se sellan implícitamente las restricciones de tipo de valor, por lo que no se pueden utilizar dichas restricciones como
restricciones en un segundo parámetro de tipo. Esto se debe a que no se pueden reemplazar los tipos de valor. Para resolver
este error, coloque una restricción de tipo de valor directamente en el segundo parámetro de tipo, en lugar de hacerlo
indirectamente por medio del primer parámetro de tipo.
Ejemplo
El código siguiente genera el error CS0456.

// CS0456.cs
// compile with: /target:library
public class GenericsErrors
{
public class G5<T> where T : struct
{
public class N<U> where U : T {} // CS0456
public class N2<U> where U : struct {} // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0457


Mensaje de error
Conversiones ambiguas 'Nombre de método de conversión 1' y 'Nombre de método de conversión 2' definidas por el usuario
al realizar la conversión de 'Nombre de tipo 1' a 'Nombre de tipo 2'
Ambiguous user defined conversions 'Conversion method name 1' and 'Conversion method name 2' when converting from
'type name 1' to 'type name 2'
Son aplicables dos métodos de conversión y el compilador no puede decidir cuál utilizar.
Un escenario que puede provocar este error es el siguiente:
Desea convertir la clase A en la clase B, donde A y B no están relacionadas.
A se deriva de A0 y existe un método que convierte A0 en B.
B tiene una subclase B1 y existe un método que convierte A en B1.
El compilador asigna la misma prioridad a ambos métodos de conversión, porque la primera conversión proporciona el mejor
tipo de destino y la segunda ofrece el mejor tipo de origen. Puesto que el compilador no puede elegir, se genera este error.
Para resolverlo, escriba un nuevo método explícito para efectuar la conversión de A en B.
Otro escenario que provoca este error es la existencia de dos métodos que conviertan A en B. Para corregirlo, especifique qué
conversión se debe utilizar mediante una conversión explícita.
Ejemplo
El código siguiente genera el error CS0457.

// CS0457.cs
using System;
public class A { }

public class G0 { }
public class G1<R> : G0 { }

public class H0 {
public static implicit operator G0(H0 h) {
return new G0();
}
}
public class H1<R> : H0 {
public static implicit operator G1<R>(H1<R> h) {
return new G1<R>();
}
}
public class Test
{
public static void F0(G0 g) { }
public static void Main()
{
H1<A> h1a = new H1<A>();
F0(h1a); // CS0457
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0459


Mensaje de error
No se puede adquirir la dirección de la variable local de sólo lectura
Cannot take the address of a read-only local variable
Hay tres escenarios habituales en el lenguaje C# que generan variables locales de sólo lectura: foreach, using y fixed. En
ninguno de estos casos se puede escribir en la variable local de sólo lectura ni utilizar su dirección. Se genera este error cuando
el compilador detecta que se está intentando utilizar la dirección de una variable local de sólo lectura.
Ejemplo
El siguiente ejemplo genera el error CS0459 cuando se intenta utilizar la dirección de una variable local de sólo lectura en un
bucle foreach y en un bloque de instrucciones fixed.

// CS0459.cs
// compile with: /unsafe

class A
{
public unsafe void M1()
{
int[] ints = new int[] { 1, 2, 3 };
foreach (int i in ints)
{
int *j = &i; // CS0459
}

fixed (int *i = &_i)


{
int **j = &i; // CS0459
}
}

private int _i = 0;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0460


Mensaje de error
Las restricciones para métodos de reemplazo y de implementación de interfaz explícita se heredan del método base; por tanto,
no se pueden especificar directamente
Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be
specified directly
Cuando un método genérico que forma parte de una clase derivada reemplaza un método de la clase base, no se pueden
especificar restricciones en el método reemplazado. El método de reemplazo de la clase derivada hereda las restricciones del
método de la clase base.
Ejemplo
El código siguiente genera el error CS0460.

// CS0460.cs
// compile with: /target:library
class BaseClass
{
BaseClass() { }
}

interface I
{
void F1<T>() where T : BaseClass;
void F2<T>() where T : struct;
void F3<T>() where T : BaseClass;
}

class ExpImpl : I
{
void I.F1<T>() where T : BaseClass {} // CS0460
void I.F2<T>() where T : class {} // CS0460
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0462


Mensaje de error
Los miembros heredados 'miembro1' y 'miembro2' tienen la misma firma en el tipo 'tipo'; por tanto, no se pueden reemplazar
The inherited members 'member1' and 'member2' have the same signature in type 'type', so they cannot be overridden
Este error se produce con la introducción de genéricos. Normalmente, no puede haber dos versiones de un método en una
clase con la misma firma. Sin embargo, cuando se usan genéricos se puede especificar un método genérico que podría
duplicar a otro si se crea una instancia con un tipo concreto.
Ejemplo
Cuando se crea una instancia de C<int>, se crean dos versiones del método F con la misma firma. Por tanto, al efectuarse el
reemplazo de la clase D, no se puede determinar a cuál de ellos se aplica el reemplazo.
El código siguiente genera el error CS0462.

// CS0462.cs
// compile with: /target:library
class C<T>
{
public virtual void F(T t) {}
public virtual void F(int t) {}
}

class D : C<int>
{
public override void F(int t) {} // CS0462
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0463


Mensaje de error
No se pudo realizar la evaluación de la expresión de la constante decimal y se produjo un error: 'error'
Evaluation of the decimal constant expression failed with error: 'error'
Este error se produce cuando una expresión de la constante decimal se desborda en tiempo de compilación.
Normalmente, los errores de desbordamiento se producen en tiempo de ejecución. En este caso, definió la expresión de la
constante de tal manera que el compilador pudo evaluar el resultado y detectar que se iba a producir un desbordamiento.
Ejemplo
El código siguiente genera el error CS0463.

// CS0463.cs
using System;
class MyClass
{
public static void Main()
{
const decimal myDec = 79000000000000000000000000000.0m + 79000000000000000000000000
000.0m; // CS0463
Console.WriteLine(myDec.ToString());
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0466


Mensaje de error
'method1' no debe tener un parámetro params, ya que 'method2' no lo tiene
'method1' should not have a params parameter since 'method2' does not
No se puede utilizar el parámetro params en un miembro de clase si la interfaz implementada no lo utiliza.
Ejemplo
El código siguiente genera el error CS0466.

// CS0466.cs
interface I
{
void F1(params int[] a);
void F2(int[] a);
}

class C : I
{
void I.F1(params int[] a) {}
void I.F2(params int[] a) {} // CS0466
void I.F2(int[] a) {} // OK

public static void Main()


{
I i = (I) new C();

i.F1(new int[] {1, 2} );


i.F2(new int[] {1, 2} );
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0468


Mensaje de error
Ambigüedad entre el tipo 'type1' y el tipo 'type2'
Ambiguity between type 'type1' and type 'type2'
Este error se genera cuando hay dos tipos con el mismo nombre completo en el ensamblado que se compila. Esto podría
suceder si ambos están en módulos agregados o si uno está en un módulo agregado y otro en el código fuente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0470


Mensaje de error
El método 'método' no puede implementar el descriptor de acceso de interfaz 'descriptor de acceso' para el tipo 'tipo'. Utilice
una implementación de interfaz explícita.
Method 'method' cannot implement interface accessor 'accessor' for type 'type'. Use an explicit interface implementation.
Este error se genera cuando un descriptor de acceso intenta implementar una interfaz. Se debe utilizar una implementación de
interfaz explícita.
Ejemplo
El código siguiente genera el error CS0470.

// CS0470.cs
// compile with: /target:library
interface I
{
int P { get; }
}

class MyClass : I
{
public int get_P() { return 0; } // CS0470
public int P2 { get { return 0;} } // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0471


Mensaje de error
La variable 'variable' no es un método genérico. Si desea una lista de expresiones, utilice paréntesis alrededor de la expresión
<.
The variable 'variable' is not a generic method. If you intended an expression list, use parentheses around the < expression.
Este error se genera cuando el código contiene una lista de expresiones sin paréntesis.
Ejemplo
En el siguiente ejemplo se genera el error CS0471.

// CS0471.cs
// compile with: /t:library
class Test
{
public void F(bool x, bool y) {}
public void F1()
{
int a = 1, b = 2, c = 3;
F(a<b, c>(3)); // CS0471
// To resolve, try the following instead:
// F((a<b), c>(3));
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0500


Mensaje de error
'miembro de clase' no puede declarar un cuerpo porque está marcado como abstract
'class member' cannot declare a body because it is marked abstract
Un método abstract no puede contener su implementación.
El código siguiente genera el error CS0500:

// CS0500.cs
namespace x
{
abstract public class clx
{
abstract public void f(){} // CS0500
// try the following line instead
// abstract public void f();
}

public class cly


{
public static int Main()
{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0501


Mensaje de error
'función miembro' debe declarar un cuerpo porque no está marcada como abstract o extern
'member function' must declare a body because it is not marked abstract or extern
Los métodos no abstractos deben tener su correspondiente implementación.
El código siguiente genera el error CS0501:

// CS0501.cs
// compile with: /target:library
public class clx
{
public void f(); // CS0501 declared not defined
public void g() {} // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0502


Mensaje de error
'miembro' no puede ser abstract y sealed
'member' cannot be both abstract and sealed
Un miembro de una clase no puede ser abstract y sealed al mismo tiempo.
El código siguiente genera el error CS0502:

// CS0502.cs
public class B
{
abstract public void F();
}

public class C : B
{
abstract sealed override public void F() // CS0502
{
}
}

public class CMain


{
public static void Main()
{ }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0503


Mensaje de error
El método abstract 'método' no se puede marcar como virtual
The abstract method 'method' cannot be marked virtual
Es redundante marcar un método miembro a la vez como abstract y virtual, ya que abstract implica virtual.
El código siguiente genera el error CS0503:

// CS0503.cs
namespace x
{
abstract public class clx
{
abstract virtual public void f(); // CS0503
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0504


Mensaje de error
La constante 'variable' no se puede marcar como static
The constant 'variable' cannot be marked static
Si una variable es const, también es static. Si se desea una variable const y static, sólo es necesario declarar la variable como
const; si sólo se desea una variable static, únicamente debe marcarse como static.
El código siguiente genera el error CS0504:

// CS0504.cs
namespace x
{
abstract public class clx
{
static const int i = 0; // CS0504, cannot be both static and const
abstract public void f();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0505


Mensaje de error
'miembro1': no se puede reemplazar porque 'miembro2' no es una función
'member1': cannot override because 'member2' is not a function
Una declaración de clase intentó reemplazar un no-método en una clase base. Los reemplazos deben coincidir con el tipo de
miembro. Si se busca tener un método con el mismo nombre que un método de una clase base, se debe usar new (en lugar de
override) en la declaración del método en la clase base.
El código siguiente genera el error CS0505:

// CS0505.cs
// compile with: /target:library
public class clx
{
public int i;
}

public class cly : clx


{
public override int i() { return 0; } // CS0505
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0506


Mensaje de error
'función1': no puede reemplazar el miembro heredado 'función2' porque no está marcado como "virtual", "abstract" u
"override"
'function1' : cannot override inherited member 'function2' because it is not marked "virtual", "abstract", or "override"
Se reemplazó un método que no está marcado explícitamente como virtual, abstractu override.
El código siguiente genera el error CS0506:

// CS0506.cs
namespace MyNameSpace
{
abstract public class ClassX
{
public int i = 0;
public int f()
{
return 0;
}
// Try the following definition for f() instead:
// abstract public int f();
}

public class ClassY : ClassX


{
public override int f() // CS0506
{
return 0;
}

public static int Main()


{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0507


Mensaje de error
'función1': no se puede cambiar los modificadores de acceso al reemplazar el miembro heredado 'función2' de acceso 'acceso'
'function1' : cannot change access modifiers when overriding 'access' inherited member 'function2'
Se realizó un intento de cambiar la especificación de acceso en un reemplazo de método.
Ejemplo
El código siguiente genera el error CS0507.

// CS0507.cs
abstract public class clx
{
virtual protected void f() {}
}

public class cly : clx


{
public override void f() {} // CS0507
public static void Main() {}
}

El error CS0507 también puede aparecer si una clase intenta reemplazar un método marcado como protected internal
definido en metadatos a los que se hace referencia. En esta situación, el método que reemplaza se debería marcar como
protected.

// CS0507_b.cs
// compile with: /target:library
abstract public class clx
{
virtual protected internal void f() {}
}

El código siguiente genera el error CS0507.

// CS0507_c.cs
// compile with: /reference:cs0507_b.dll
public class cly : clx
{
protected internal override void f() {} // CS0507
// try the following line instead
// protected override void f() {} // OK

public static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0508


Mensaje de error
'Tipo 1': el tipo de valor devuelto debe ser 'Tipo 2' para que coincida con el miembro reemplazado 'Nombre del miembro'
'Type 1': return type must be 'Type 2' to match overridden member 'Member Name'
Se intentó cambiar el tipo de valor devuelto en un reemplazo de método. Para resolver este error, asegúrese de que ambos
métodos declaren el mismo tipo de valor devuelto.
Ejemplo
El código siguiente genera el error CS0508.

// CS0508.cs
// compile with: /target:library
abstract public class Clx
{
public int i = 0;
// Return type is int.
abstract public int F();
}

public class Cly : Clx


{
public override double F()
{
return 0.0; // CS0508
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0509


Mensaje de error
'clase1': no puede derivar del tipo sealed 'clase2'
'class1' : cannot derive from sealed type 'class2'
Una clase sealed no puede actuar como clase base. Las estructuras son sealed de forma predeterminada.
El código siguiente genera el error CS0509:

// CS0509.cs
// compile with: /target:library
sealed public class clx {}
public class cly : clx {} // CS0509
Referencia de Visual C#: errores y advertencias

Error del compilador CS0513


Mensaje de error
'función' es abstract pero está incluida en la clase nonabstract 'clase'
'function' is abstract but it is contained in nonabstract class 'class'
Un método no puede ser un miembro abstract de una clase nonabstract.
El código siguiente genera el error CS0513:

// CS0513.cs
namespace x
{
public class clx
{
abstract public void f(); // CS0513, abstract member of nonabstract class
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0514


Mensaje de error
'constructor': el constructor estático no puede tener ninguna llamada de constructor 'this' o 'base' explícita
'constructor' : static constructor cannot have an explicit 'this' or 'base' constructor call
No se permite llamar a this en el constructor estático porque a éste se le llama automáticamente antes de crear cualquier
instancia de la clase. Además, los constructores estáticos no se heredan y no pueden ser llamados directamente.
Para obtener más información, vea this (Referencia de C#) y base (Referencia de C#).
Ejemplo
El ejemplo siguiente genera el error CS0514:

// CS0514.cs
class A
{
static A() : base(0) // CS0514
{
}

public A(object o)
{
}
}

class B
{
static B() : this(null) // CS0514
{
}

public B(object o)
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0515


Mensaje de error
'función': no se permiten modificadores de acceso en constructores estáticos
'function' : access modifiers are not allowed on static constructors
Un constructor no puede tener un modificador de acceso.
Ejemplo
El código siguiente genera el error CS0515:

// CS0515.cs
public class Clx
{
public static void Main()
{
}
}

public class Clz


{
public static Clz() // CS0515, remove public keyword
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0516


Mensaje de error
El constructor 'constructor' no se puede llamar a sí mismo
Constructor 'constructor' can not call itself
Un programa no puede llamar de forma recursiva a constructores.
El código siguiente genera el error CS0516:

// CS0516.cs
namespace x
{
public class clx
{
public clx() : this() // CS0516, delete "this()"
{
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0517


Mensaje de error
'clase' no tiene clase base y no puede llamar a un constructor base
'class' has no base class and cannot call a base constructor
El error CS0517 sólo puede producirse cuando el Common Language Runtime de .NET Framework compila el código fuente
de la clase de objeto, que es la única clase que no posee clase base.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0518


Mensaje de error
El tipo predefinido 'tipo' no está definido ni importado
Predefined type 'type' is not defined or imported
La principal causa de este problema es que el proyecto no importa mscorlib.dll, que define todo el espacio de nombres System.
Esto puede deberse a una de las razones siguientes:
Se ha especificado la opción /nostdlib del compilador de línea de comandos. La opción /nostdlib evita la importación de
mscorlib.dll. Utilice esta opción si desea definir o crear un espacio de nombres System específico del usuario.
Se hace referencia a un archivo mscorlib.dll incorrecto.
La instalación de Visual Studio .NET o de Common Language Runtime de .NET Framework está dañada.
Quedan componentes residuales de una instalación previa que son incompatibles con la última instalación.
Para solucionar este problema, realice una de las acciones siguientes:
No especifique la opción /nostdlib en el compilador de la línea de comandos.
Asegúrese de que el proyecto hace referencia al archivo mscorlib.dll correcto.
Vuelva a instalar Common Language Runtime de .NET Framework (si ninguna de las soluciones anteriores resolvió el
problema).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0520


Mensaje de error
Tipo predefinido 'nombre' declarado incorrectamente
Predefined type 'name' is declared incorrectly
Uno o varios archivos necesarios para el compilador no se encontraron. Reinstale el Common Language Runtime de .NET
Framework.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0522


Mensaje de error
'constructor': las estructuras no pueden llamar a constructores de clase base
'constructor' : structs cannot call base class constructors
Una estructura (struct) no puede llamar a un constructor de clase base; quite la llamada al constructor de clase base.
El código siguiente genera el error CS0522:

// CS0522.cs
public class clx
{
public clx(int i)
{
}

public static void Main()


{
}
}

public struct cly


{
public cly(int i):base(0) // CS0522
// try the following line instead
// public cly(int i)
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0523


Mensaje de error
El miembro de estructura 'campo de estructura2' del tipo 'estructura1' crea un ciclo en el diseño de la estructura
Struct member 'struct2 field' of type 'struct1' causes a cycle in the struct layout
Las definiciones de dos estructuras incluyen referencias recursivas. Cambie las definiciones de estructura (struct) para que
ninguna de ellas se defina a sí misma en la otra. Esta limitación sólo se aplica a las estructuras, puesto que las estructuras son
tipos de valor. Cuando emplee referencias recursivas, declare sus tipos como clases.
El código siguiente genera el error CS0523:

// CS0523.cs
// compile with: /target:library
struct RecursiveLayoutStruct1
{
public RecursiveLayoutStruct2 field;
}

struct RecursiveLayoutStruct2
{
public RecursiveLayoutStruct1 field; // CS0523
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0524


Mensaje de error
'tipo': las interfaces no pueden declarar tipos
'type' : interfaces cannot declare types
Una interfaz no puede contener un tipo definido por el usuario; sólo debe contener métodos y propiedades.
Ejemplo
El código siguiente genera el error CS0524:

// CS0524.cs
public interface Clx
{
public class Cly // CS0524, delete user-defined type
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0525


Mensaje de error
Las interfaces no pueden incluir campos
Interfaces cannot contain fields
Una interfaz puede contener métodos y propiedades, pero no campos.
El código siguiente genera el error CS0525:

// CS0525.cs
namespace x
{
public interface clx
{
public int i; // CS0525
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0526


Mensaje de error
Las interfaces no pueden incluir constructores
Interfaces cannot contain constructors
No es posible definir constructores para interfaces. Un método se considera un constructor si tiene el mismo nombre que la
clase y ningún tipo de valor devuelto.
El código siguiente genera el error CS0526:

// CS0526.cs
namespace x
{
public interface clx
{
public clx() // CS0526
{
}
}

public class cly


{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0527


Mensaje de error
El tipo 'tipo' de la lista de interfaces no es una interfaz
Type 'type' in interface list is not an interface
Es posible que una estructura (struct) o interfaz se deriven de otra interfaz, pero no de cualquier otro tipo.
El código siguiente genera el error CS0527:

// CS0527.cs
// compile with: /target:library
public struct clx : int {} // CS0527 int not an interface
Referencia de Visual C#: errores y advertencias

Error del compilador CS0528


Mensaje de error
'interfaz' ya aparece en la lista de interfaces
'interface' is already listed in interface list
Una lista de herencia de interfaz incluye un duplicado. Una interfaz sólo se puede especificar una vez en la lista de herencia.
El código siguiente genera el error CS0528:

// CS0528.cs
namespace x
{
public interface a
{
}

public class b : a, a // CS0528


{
public void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0529


Mensaje de error
La interfaz heredada 'interfaz1' crea un ciclo en la jerarquía de la interfaz 'interfaz2'
Inherited interface 'interface1' causes a cycle in the interface hierarchy of 'interface2'
La lista de herencia de una interfaz incluye una referencia directa o indirecta a sí misma. Una interfaz no se puede derivar de sí
misma.
El código siguiente genera el error CS0529:

// CS0529.cs
namespace x
{
public interface a
{
}
public interface b : a, c
{
}

public interface c : b // CS0529, b inherits from c


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0531


Mensaje de error
'miembro': los miembros de la interfaz no pueden tener una definición
'member' : interface members cannot have a definition
Los métodos que se declaran en una interfaz se deben implementar en una clase que se derive de ella en lugar de en la propia
interfaz.
El código siguiente genera el error CS0531:

// CS0531.cs
namespace x
{
public interface clx
{
int xclx() // CS0531, cannot define xclx
// Try the following declaration instead:
// int xclx();
{
return 0;
}
}

public class cly


{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0533


Mensaje de error
'miembro de clase derivada' oculta el miembro abstracto heredado 'miembro de clase base'
'derived-class member' hides inherited abstract member 'base-class member'
Un método de la clase base está oculto. Compruebe la sintaxis de su declaración para averiguar si es correcta.
Para obtener más información, vea base.
El código siguiente genera el error CS0533:

// CS0533.cs
namespace x
{
abstract public class a
{
abstract public void f();
}

abstract public class b : a


{
new abstract public void f(); // CS0533
// try the following lines instead
// override public void f()
// {
// }

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0534


Mensaje de error
'función1' no implementa el miembro abstracto heredado 'función2'
'function1' does not implement inherited abstract member 'function2'
Se requiere de una clase que implemente todos los miembros abstract de la clase base, a no ser que la clase también sea
abstracta.
El código siguiente genera el error CS0534:

// CS0534.cs
namespace x
{
abstract public class clx
{
public abstract void f();
}

public class cly : clx // CS0534, no override for clx::f


{
// uncomment the following sample override to resolve CS0534
// override public void f()
// {
// }

public static int Main()


{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0535


Mensaje de error
'clase' no implementa el miembro de interfaz 'miembro'.
'class' does not implement interface member 'member'
Una clase se deriva de una interfaz, pero la clase no implementa uno o varios de los miembros de su interfaz. Una clase debe
implementar todos los miembros de las interfaces de las cuales se deriva, o bien declararse como abstract.
Ejemplo
El código siguiente genera el error CS0535.

// CS0535.cs
public interface A
{
void F();
}

public class B : A {} // CS0535 A::F is not implemented

// OK
public class C : A {
public void F() {}
public static void Main() {}
}

El código siguiente genera el error CS0535.

// CS0535_b.cs
using System;
class C : IDisposable {} // CS0535

// OK
class D : IDisposable {
void IDisposable.Dispose() {}
public void Dispose() {}
static void Main() {
using (D d = new D()) {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0536


Mensaje de error
'clase' no implementa el miembro de interfaz 'miembro de interfaz'. 'miembro de clase' es estático, no público, o tiene un tipo
de valor devuelto incorrecto.
'class' does not implement interface member 'interface member'. 'class member' is static, not public, or has the wrong return
type
' clase ' no implementa el miembro de interfaz ' miembro1 '. ' miembro2 ' es estático, no público, o tiene un tipo de
valor devuelto incorrecto.
El compilador no detectó una implementación de un miembro de interfaz. Puede haber presente una declaración que casi
implemente el miembro de interfaz. Compruebe la posible existencia de los siguientes errores de sintaxis en la declaración del
miembro de interfaz:
Se omitió la palabra clave public.
El tipo de valor devuelto no coincide.
Está presente la palabra clave static.
El código siguiente genera el error CS0536:

// CS0536.cs
public interface a
{
void f();
}

public class b : a
{
public static int f() // CS0536
// try the following line instead
// public void f()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0537


Mensaje de error
La clase System.Object no puede tener una clase base o implementar una interfaz
The class System.Object cannot have a base class or implement an interface
El error CS0537 se produce al volver a generar las bibliotecas de clases System en los casos en que Object se deriva de otra
clase. Se trata de un error muy improbable. Si se produce, no derive Object de una clase o interfaz: es la raíz de la jerarquía de
clases de .NET Framework completa y, como tal, no debe derivarse de nada.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0538


Mensaje de error
'nombre' en la declaración explícita de la interfaz no es una interfaz
'name' in explicit interface declaration is not an interface
Se intentó declarar explícitamente una interfaz, pero no se especificó ninguna interfaz.
El código siguiente genera el error CS0538:

// CS0538.cs
interface MyIFace
{
void F();
}

public class MyClass


{
public void G()
{
}
}

class C: MyIFace
{
void MyIFace.F()
{
}

void MyClass.G() // CS0538, MyClass not an interface


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0539


Mensaje de error
'miembro' en la declaración explícita de la interfaz no es un miembro de interfaz
'member' in explicit interface declaration is not a member of interface
Se intentó declarar explícitamente un miembro de interfaz que no existe. Se debe eliminar la declaración o cambiarla para que
haga referencia a un miembro de interfaz válido.
El código siguiente genera el error CS0539:

// CS0539.cs
namespace x
{
interface I
{
void m();
}

public class clx : I


{
void I.x() // CS0539
{
}

public static int Main()


{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0540


Mensaje de error
'miembro de interfaz': el tipo contenedor no implementa la interfaz 'interfaz'
'interface member' : containing type does not implement interface 'interface'
Se intentó implementar un miembro de interfaz en una clase que no se deriva de la interfaz. Se debe eliminar la
implementación del miembro de interfaz o agregar la interfaz a la lista de clases base de la clase.
Ejemplo
El código siguiente genera el error CS0540.

// CS0540.cs
interface I
{
void m();
}

public class Clx


{
void I.m() {} // CS0540
}

// OK
public class Cly : I
{
void I.m() {}
public static void Main() {}
}

El código siguiente genera el error CS0540.

// CS0540_b.cs
using System;
class C {
void IDisposable.Dispose() {} // CS0540
}
class D : IDisposable {
void IDisposable.Dispose() {}
public void Dispose() {}
static void Main() {
using (D d = new D()) {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0541


Mensaje de error
'declaración': la declaración explícita de la interfaz sólo se puede declarar en una clase o estructura
'declaration' : explicit interface declaration can only be declared in a class or struct
Se encontró una declaración explícita de interfaz fuera de una clase o estructura (struct).
El código siguiente genera el error CS0541:

// CS0541.cs
namespace x
{
interface IFace
{
void F();
}

interface IFace2 : IFace


{
void IFace.F(); // CS0541
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0542


Mensaje de error
'tipo definido por el usuario': los nombres de los miembros no pueden coincidir con sus tipos envolventes
'user-defined type' : member names cannot be the same as their enclosing type
Se utilizó un nombre más de una vez en la misma construcción. Este error puede producirse al colocar sin darse cuenta un tipo
de valor devuelto en un constructor.
El código siguiente genera el error CS0542:

// CS0542.cs
class F
{
// Remove void from F() to resolve the problem.
void F() // CS0542, same name as the class
{
}
}

class MyClass
{
public static void Main()
{
}
}

Si la clase se denomina 'Item' y tiene un indizador declarado como this, puede producirse este error, ya que se dará el nombre
'Item' a un indizador predeterminado en el código emitido, lo que provoca el conflicto.

// CS0542b.cs
class Item
{
public int this[int i] // CS0542
{
get
{
return 0;
}
}
}
class CMain
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0543


Mensaje de error
'enumeración': el valor del enumerador es demasiado grande para ajustarse a su tipo
'enumeration' : the enumerator value is too large to fit in its type
El valor asignado a un elemento en una enumeración se encuentra fuera del intervalo del tipo de datos.
El código siguiente genera el error CS0543:

// CS0543.cs
namespace x
{
enum I : byte
{a = 255, b, c} // CS0543
public class clx
{
public static int Main()
{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0544


Mensaje de error
'reemplazo de propiedad': no se puede reemplazar porque 'no propiedad' no es una propiedad
'property override': cannot override because 'non-property' is not a property
Se intentó reemplazar un tipo de datos no de propiedad como una propiedad, lo cual no está permitido.
El código siguiente genera el error CS0544:

// CS0544.cs
// compile with: /target:library
public class a
{
public int i;
}

public class b : a
{
public override int i { // CS0544
// try the following line instead
// public new int i {
get
{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0545


Mensaje de error
'función': no se puede reemplazar porque 'propiedad' no tiene un descriptor de acceso get reemplazable
'function' : cannot override because 'property' does not have an overridable get accessor
Se intentó definir un reemplazo para un descriptor de acceso de propiedad sin que la clase base tenga dicha definición para
reemplazarla. Se puede resolver el error de la siguiente forma:
Agregando un descriptor de acceso set en la clase base.
Quitando el descriptor de acceso set de la clase derivada.
Ocultando la propiedad de clase base, agregando la palabra clave new en la propiedad de la clase derivada.
Convirtiendo en virtual la propiedad de clase base.
Para obtener más información, vea Utilizar propiedades (Guía de programación de C#) y
Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0545.

// CS0545.cs
// compile with: /target:library
// CS0545
public class a
{
public virtual int i
{
set {}

// Uncomment the following line to resolve.


// get { return 0; }
}
}

public class b : a
{
public override int i
{
get { return 0; }
set {} // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0546


Mensaje de error
'descriptor de acceso': no se puede reemplazar porque 'propiedad' no tiene un descriptor de acceso set reemplazable
'accessor' : cannot override because 'property' does not have an overridable set accessor
Se intentó reemplazar uno de los métodos de descriptor de acceso para una propiedad, pero dio un error porque no se puede
reemplazar el descriptor de acceso. Se puede resolver el error de la siguiente forma:
Agregando un descriptor de acceso set en la clase base.
Quitando el descriptor de acceso set de la clase derivada.
Ocultando la propiedad de clase base, agregando la palabra clave new en la propiedad de la clase derivada.
Convirtiendo en virtual la propiedad de clase base.
Para obtener más información, vea Declaración de propiedades y Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0546.

// CS0546.cs
// compile with: /target:library
public class a
{
public virtual int i
{
get
{
return 0;
}
}

public virtual int i2


{
get
{
return 0;
}

set {}
}
}

public class b : a
{
public override int i
{
set {} // CS0546 error no set
}
public override int i2
{
set {} // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0547


Mensaje de error
'propiedad': la propiedad o indizador no pueden tener el tipo void
'property' : property or indexer cannot have void type
void no es válido como valor devuelto para una propiedad.
Para obtener más información, vea Propiedades.
El código siguiente genera el error CS0547:

// CS0547.cs
public class a
{
public void i // CS0547
// Try the following declaration instead:
// public int i
{
get
{
return 0;
}
}
}

public class b : a
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0548


Mensaje de error
'propiedad': la propiedad o indizador deben tener, al menos, un descriptor de acceso
'property' : property or indexer must have at least one accessor
Una propiedad debe tener al menos un método descriptor de acceso (get o set).
Para obtener más información, vea Declaración de propiedades y Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0548.

// CS0548.cs
// compile with: /target:library
public class b
{
public int MyProp {} // CS0548

public int MyProp2 // OK


{
get
{
return 0;
}
set {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0549


Mensaje de error
'función' es un nuevo miembro virtual en una clase sealed 'clase'
'function' is a new virtual member in sealed class 'class'
Una clase sealed no se puede utilizar como clase base. Por consiguiente, es inútil tener un método virtual en una clase sealed.
El código siguiente genera el error CS0549:

// CS0549.cs
// compile with: /target:library
sealed public class MyClass
{
virtual public void TestMethod() {} // CS0549
public void TestMethod2() {} // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0550


Mensaje de error
'descriptor de acceso' agrega un descriptor de acceso que no se encuentra en el miembro de interfaz 'propiedad'
'accessor' adds an accessor not found in interface member 'property'
La implementación de una propiedad en una clase derivada contiene un descriptor de acceso que no está especificado en la
interfaz base.
Para obtener más información, vea Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0550.

// CS0550.cs
namespace x
{
interface ii
{
int i
{
get;
// add the following accessor to resolve this CS0550
// set;
}
}

public class a : ii
{
int ii.i
{
get
{
return 0;
}
set {} // CS0550 no set in interface
}

public static void Main() {}


}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0551


Mensaje de error
El descriptor de acceso 'descriptor de acceso' falta en la implementación explícita de la interfaz 'implementación'
Explicit interface implementation 'implementation' is missing accessor 'accessor'
Una clase que implementa explícitamente la propiedad de una interfaz debe implementar todos los descriptores de acceso que
define la interfaz.
Para obtener más información, vea Declaración de propiedades y Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0551.

// CS0551.cs
// compile with: /target:library
interface ii
{
int i
{
get;
set;
}
}

public class a : ii
{
int ii.i { set {} } // CS0551

// OK
int ii.i
{
set {}
get { return 0; }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0552


Mensaje de error
'rutina de conversión': conversión a/de la interfaz definida por el usuario
'conversion routine' : user defined conversion to/from interface
No se puede crear una conversión definida por el usuario a una interfaz o desde una interfaz. Si se requiere la rutina de
conversión, se puede resolver el error convirtiendo la interfaz en clase o derivando una clase de la interfaz.
El código siguiente genera el error CS0552:

// CS0552.cs
public interface ii
{
}

public class a
{
// delete the routine to resolve CS0552
public static implicit operator ii(a aa) // CS0552
{
return new ii();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0553


Mensaje de error
'rutina de conversión': conversión a/de la clase base definida por el usuario
'conversion routine' : user defined conversion to/from base class
Las conversiones definidas por el usuario en valores de una clase base no están permitidas; no es necesario este tipo de
operador.
El código siguiente genera el error CS0553:

// CS0553.cs
namespace x
{
public class ii
{
}
public class a : ii
{
// delete the conversion routine to resolve CS0553
public static implicit operator ii(a aa) // CS0553
{
return new ii();
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0554


Mensaje de error
'rutina de conversión': conversión a/de la clase derivada definida por el usuario
'conversion routine' : user defined conversion to/from derived class
Las conversiones definidas por el usuario de una clase derivada no están permitidas; no es necesario este tipo de operador.
Vea el capítulo 6 de la especificación del lenguaje C# para obtener más información sobre las conversiones definidas por el
usuario.
El código siguiente genera el error CS0554:

// CS0554.cs
namespace x
{
public class ii
{
// delete the conversion routine to resolve CS0554
public static implicit operator ii(a aa) // CS0554
{
return new ii();
}
}

public class a : ii
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0555


Mensaje de error
Un operador definido por el usuario no puede adquirir un objeto de tipo envolvente ni convertirlo en un objeto de tipo
envolvente
User-defined operator cannot take an object of the enclosing type and convert to an object of the enclosing type
Las conversiones definidas por el usuario de una clase envolvente no están permitidas; no es necesario este tipo de operador.
El código siguiente genera el error CS0555:

// CS0555.cs
public class MyClass
{
// delete the following operator to resolve this CS0555
public static implicit operator MyClass(MyClass aa) // CS0555
{
return new MyClass();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0556


Mensaje de error
La conversión definida por el usuario debe realizarse en el tipo envolvente o desde éste
User-defined conversion must convert to or from the enclosing type
Una rutina de conversión definida por el usuario debe realizarse en la clase que contiene la rutina o desde ésta.
El código siguiente genera el error CS0556:

// CS0556.cs
namespace x
{
public class ii
{
public class iii
{
public static implicit operator int(byte aa) // CS0556
// try the following line instead
// public static implicit operator int(iii aa)
{
return 0;
}
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0557


Mensaje de error
Conversión definida por el usuario en el tipo 'clase'
Duplicate user-defined conversion in type 'class'
No se permiten rutinas de conversión duplicadas en una clase.
En el ejemplo siguiente se genera el error CS0557:

// CS0557.cs
namespace x
{
public class ii
{
public class iii
{
public static implicit operator int(iii aa)
{
return 0;
}

// CS0557, delete duplicate


public static explicit operator int(iii aa)
{
return 0;
}
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0558


Mensaje de error
El operador 'operador' definido por el usuario debe declararse como static y public
User-defined operator 'operator' must be declared static and public
Los modificadores de acceso static y public deben especificarse ambos en los operadores definidos por el usuario.
El código siguiente genera el error CS0558:

// CS0558.cs
namespace x
{
public class ii
{
public class iii
{
static implicit operator int(iii aa) // CS0558, add public
{
return 0;
}
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0559


Mensaje de error
El tipo de parámetro para el operador ++ o -- debe ser el tipo contenedor
The parameter type for ++ or -- operator must be the containing type
La declaración de método para la sobrecarga de un operador debe seguir ciertas normas. Para los operadores ++ y --, se
requiere que el parámetro sea del mismo tipo que provoca la sobrecarga del operador.
Ejemplo
El código siguiente genera el error CS0559:

// CS0559.cs
// compile with: /target:library
public class iii
{
public static implicit operator int(iii x)
{
return 0;
}

public static implicit operator iii(int x)


{
return null;
}

public static int operator ++(int aa) // CS0559


// try the following line instead
// public static iii operator ++(iii aa)
{
return (iii)0;
}
}

El código siguiente genera el error CS0559.

// CS0559_b.cs
// compile with: /target:library
public struct S
{
public static S operator ++(S? s) { return new S(); } // CS0559
public static S operator --(S? s) { return new S(); } // CS0559
}

public struct T
{
// OK
public static T operator --(T t) { return new T(); }
public static T operator ++(T t) { return new T(); }
public static T? operator --(T? t) { return new T(); }
public static T? operator ++(T? t) { return new T(); }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0562


Mensaje de error
El parámetro de un operador unario debe ser el tipo contenedor
The parameter of a unary operator must be the containing type
La declaración de método para la sobrecarga de un operador debe seguir ciertas normas. Para obtener más información, vea
Operadores sobrecargables y Ejemplo Operator Overloading.
Ejemplo
El código siguiente genera el error CS0562:

// CS0562.cs
public class iii
{
public static implicit operator int(iii x)
{
return 0;
}

public static implicit operator iii(int x)


{
return null;
}

public static iii operator +(int aa) // CS0562


// try the following line instead
// public static iii operator +(iii aa)
{
return (iii)0;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0563


Mensaje de error
Uno de los parámetros de un operador binario debe ser el tipo contenedor
One of the parameters of a binary operator must be the containing type
La declaración de método para la sobrecarga de operador debe seguir ciertas normas. Para obtener más información, vea
Operadores sobrecargables y Ejemplo Operator Overloading.
Ejemplo
El código siguiente genera el error CS0563:

// CS0563.cs
public class iii
{
public static implicit operator int(iii x)
{
return 0;
}
public static implicit operator iii(int x)
{
return null;
}
public static int operator +(int aa, int bb) // CS0563
// Use the following line instead:
// public static int operator +(int aa, iii bb)
{
return 0;
}
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0564


Mensaje de error
El operador de desplazamiento sobrecargado debe tener el tipo del primer operando, que es el tipo contenedor, y el tipo del
segundo operando, que debe ser int
Overloaded shift operator must have the type of the first operand be the containing type, and the type of the second operand
must be int.
Se intentó sobrecargar un operador de desplazamiento (<< or >>) mediante operandos con tipos incorrectos. El primer
operando debe ser el tipo y el segundo debe ser del tipo int.
El código siguiente genera el error CS0564:

// CS0564.cs
using System;
class C
{
public static int operator << (C c1, C c2) // CS0564
// To correct, change second operand to int, like so:
// public static int operator << (C c1, int c2)
{
return 0;
}
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0567


Mensaje de error
Las interfaces no pueden contener operadores
Interfaces cannot contain operators
No se permite el uso de operadores en definiciones de interfaz.
El código siguiente genera el error CS0567:

// CS0567.cs
interface IA
{
int operator +(int aa, int bb); // CS0567
}

class Sample
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0568


Mensaje de error
Las estructuras no pueden contener constructores explícitos sin parámetros
Structs cannot contain explicit parameterless constructors
Cada estructura (struct) ya posee un constructor predeterminado que inicializa el objeto con el valor cero. Por lo tanto, los
constructores que se pueden crear para una estructura deben tomar uno o varios parámetros.
El código siguiente genera el error CS0568:

// CS0568.cs
public struct ClassY
{
public int field1;
public ClassY(){} // CS0568, cannot have no param constructor
// Try following instead:
// public ClassY(int i)
// {
// field1 = i;
// }
}

public class ClassX


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0569


Mensaje de error
'método2': no se puede reemplazar 'método1' porque el lenguaje no lo admite
'method2' : cannot override 'method1' because it is not supported by the language
Este error se produce al derivar de una clase base que se escribió en otro lenguaje y cuando el compilador no admite el
método que se está intentando reemplazar.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0570


Mensaje de error
'clase' no es compatible con el lenguaje
'class' is not supported by the language
Este error se produce al utilizar metadatos importados que se generaron con otro compilador. El código creado intenta utilizar
un miembro de clase que el compilador no es capaz de procesar.
Ejemplo
El programa C++ siguiente utiliza un atributo, RequiredAttributeAttribute, que otros lenguajes no pueden utilizar.

// CPP0570.cpp
// compile with: /clr /LD

using namespace System;


using namespace System::Runtime::CompilerServices;

namespace CS0570_Server {
[RequiredAttributeAttribute(Int32::typeid)]
public ref struct Scenario1 {
int intVar;
};

public ref struct CS0570Class {


Scenario1 ^ sc1_field;

property virtual Scenario1 ^ sc1_prop {


Scenario1 ^ get() { return sc1_field; }
}

Scenario1 ^ sc1_method() { return sc1_field; }


};
};

El código siguiente genera el error CS0570.

// CS0570.cs
// compile with: /reference:CPP0570.dll
using System;
using CS0570_Server;
public class C {
public static int Main() {
CS0570Class r = new CS0570Class();
r.sc1_field = null; // CS0570
object o = r.sc1_prop; // CS0570
r.sc1_method(); // CS0570
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0571


Mensaje de error
'función': no se puede llamar explícitamente al operador o al descriptor de acceso
'function' : cannot explicitly call operator or accessor
Ciertos operadores tienen nombres internos. Por ejemplo, op_Increment es el nombre interno del operador ++. No se debe
utilizar o llamar explícitamente a tales nombres de método.
El código siguiente genera el error CS0571:

// CS0571.cs
public class MyClass
{
public static MyClass operator ++ (MyClass c)
{
return null;
}

public static int prop


{
get
{
return 1;
}
set
{
}
}

public static void Main()


{
op_Increment(null); // CS0571
// use the increment operator as follows
// MyClass x = new MyClass();
// x++;

set_prop(1); // CS0571
// try the following line instead
// prop = 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0572


Mensaje de error
'tipo': no se puede hacer referencia a un tipo a través de una expresión; pruebe con 'ruta_al_tipo'
'type' : cannot reference a type through an expression; try 'path_to_type' instead
Se intentó obtener acceso a un miembro de una clase mediante un identificador, lo cual no está permitido en esta situación.
El código siguiente genera el error CS0572:

// CS0572.cs
using System;
class C
{
public class Inner
{
public static int v = 9;
}
}

class D : C
{
public static void Main()
{
C cValue = new C();
Console.WriteLine(cValue.Inner.v); // CS0572
// try the following line instead
// Console.WriteLine(C.Inner.v);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0573


Mensaje de error
'declaración de campo': no se permiten inicializadores de campo de instancia en las estructuras
'field declaration' : cannot have instance field initializers in structs
No puede inicializar un campo de instancia de una estructura (struct). Los campos de los tipos de valor se inicializarán en sus
valores predeterminados y los campos de tipo de referencia lo harán en null.
Ejemplo
El código siguiente genera el error CS0573:

// CS0573.cs
namespace x
{
public class clx
{
public static void Main()
{
}
}

public struct cly


{
clx a = new clx(); // CS0573
// clx a; // OK
int i = 7; // CS0573
// int i; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0574


Mensaje de error
El nombre del destructor debe coincidir con el nombre de la clase
Name of destructor must match name of class
El nombre del destructor debe ser el nombre de clase precedido por una tilde (~).
El código siguiente genera el error CS0574:

// CS0574.cs
namespace x
{
public class iii
{
~iiii() // CS0574
{
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0575


Mensaje de error
Sólo los tipos de clase pueden contener destructores
Only class types can contain destructors
Una estructura (struct) no puede contener un destructor.
El código siguiente genera el error CS0575:

// CS0575.cs
namespace x
{
public struct iii
{
~iii() // CS0575
{
}

public static void Main()


{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0576


Mensaje de error
El espacio de nombres 'espacio de nombres' contiene una definición que entra en conflicto con el alias 'identificador'
Namespace 'namespace' contains a definition conflicting with alias 'identifier'
Se intentó usar el mismo espacio de nombres dos veces.
Ejemplo
El código siguiente genera el error CS0576:

// CS0576.cs
using SysIO = System.IO;
public class SysIO
{
public void MyMethod() {}
}

public class Test


{
public static void Main()
{
SysIO.Stream s; // CS0576
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0577


Mensaje de error
El atributo Conditional no es válido en 'función' porque es un constructor, destructor, operador o la implementación explícita
de una interfaz
The Conditional attribute is not valid on 'function' because it is a constructor, destructor, operator, or explicit interface
implementation
Conditional no puede aplicarse a los métodos especificados.
Por ejemplo, algunos atributos no se pueden utilizar en una definición explícita de una interfaz. El código siguiente genera el
error CS0577:

// CS0577.cs
// compile with: /target:library
interface I
{
void m();
}

public class MyClass : I


{
[System.Diagnostics.Conditional("a")] // CS0577
void I.m() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0578


Mensaje de error
El atributo Conditional no es válido en 'función' porque su tipo de valor devuelto no es void
The Conditional attribute is not valid on 'function' because its return type is not void
No se puede aplicar ConditionalAttribute a un método que tiene un tipo de valor devuelto diferente de void. El motivo de ello
es que puede requerirse cualquier otro tipo de valor devuelto para un método en otra parte del programa.
Ejemplo
En el ejemplo siguiente se genera el error CS0578. Para resolver este error se debe eliminar ConditionalAttribute o cambiar
el valor devuelto del método a void.

// CS0578.cs
// compile with: /target:library
public class MyClass
{
[System.Diagnostics.ConditionalAttribute("a")] // CS0578
public int TestMethod()
{
return 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0579


Mensaje de error
Atributo 'atributo' duplicado
Duplicate 'attribute' attribute
No es posible especificar el mismo atributo más de una vez, a menos que el atributo especifique AllowMultiple=true en su
valor de AttributeUsage.
Ejemplo
El siguiente ejemplo genera el error CS0579.

// CS0579.cs
using System;
public class MyAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.All,AllowMultiple=true)]
public class MyAttribute2 : Attribute
{
}

public class z
{
[MyAttribute, MyAttribute] // CS0579
public void zz()
{
}

[MyAttribute2, MyAttribute2] // OK
public void zzz()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0582


Mensaje de error
El atributo Conditional no es válido en los miembros de interfaz
The Conditional not valid on interface members
ConditionalAttribute no es válido en un miembro de interfaz.
El código siguiente genera el error CS0582:

// CS0582.cs
// compile with: /target:library
using System.Diagnostics;
interface MyIFace
{
[ConditionalAttribute("DEBUG")] // CS0582
void zz();
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0583


Mensaje de error
Error interno del compilador ('dirección completa'): probablemente la causa sea 'causa'.
Internal Compiler Error ('address'): likely culprit is 'culprit'
Cree un archivo de informe sobre el error con la opción '/bugreport' y envíelo a su contacto para la resolución de problemas.
Use la opción /bugreport del compilador para detectar el problema.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0584


Mensaje de error
Error interno del compilador: fase 'fase' símbolo 'símbolo'
Internal Compiler Error: stage 'stage' symbol 'symbol'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
ése no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0585


Mensaje de error
Error interno del compilador: fase 'fase'
Internal Compiler Error: stage 'stage'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
ése no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0586


Mensaje de error
Error interno del compilador: fase 'fase'
Internal Compiler Error: stage 'stage'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
ése no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0587


Mensaje de error
Error interno del compilador: fase 'fase'
Internal Compiler Error: stage 'stage'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
éste no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0588


Mensaje de error
Error interno del compilador: fase 'LEX'
Internal Compiler Error: stage 'LEX'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
éste no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0589


Mensaje de error
Error interno del compilador: fase 'PARSE'
Internal Compiler Error: stage 'PARSE'
Intente determinar si se están produciendo errores en el compilador debido a que no puede analizar una sintaxis inesperada. Si
ése no fuera el caso, intente Obtener ayuda del Servicio de soporte técnico de Microsoft (Visual Studio).
Referencia de Visual C#: errores y advertencias

Error del compilador CS0590


Mensaje de error
Los operadores definidos por el usuario no pueden devolver un valor void
User-defined operators cannot return void
El propósito de un operador definido por el usuario es devolver un objeto.
El código siguiente genera el error CS0590:

// CS0590.cs
namespace x
{
public class a
{
public static void operator+(a A1, a A2) // CS0590
{
}

// try the following user-defined operator


/*
public static a operator+(a A1, a A2)
{
return A2;
}
*/

public static int Main()


{
return 1;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0591


Mensaje de error
Valor no válido para el argumento del atributo 'atributo'
Invalid value for argument to 'attribute' attribute
Se pasó a un atributo un argumento no válido o dos argumentos mutuamente excluyentes.
Ejemplo
El código siguiente genera el error CS0591:

// CS0591.cs
using System;

[AttributeUsage(0)] // CS0591
class I: Attribute
{
}

public class a
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0592


Mensaje de error
El atributo 'atributo' no es válido en este tipo declarativo. Sólo es válido en declaraciones 'tipo'.
Attribute 'attribute' is not valid on this declaration type. It is valid on 'type' declarations only.
Se aplicó un atributo a una declaración para la que no estaba previsto.
Ejemplo
El código siguiente genera el error CS0592:

// CS0592.cs
using System;

[AttributeUsage(AttributeTargets.Interface)]
public class MyAttribute : Attribute
{
}

[MyAttribute]
public class A // CS0592, MyAttribute is not valid for a class
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0594


Mensaje de error
La constante de punto flotante está fuera del intervalo del tipo 'tipo'
Floating-point constant is outside the range of type 'type'
Se asignó un valor a una variable de punto flotante que es demasiado grande para las variables de este tipo de datos. Vea
Tabla de tipos integrales para obtener información sobre el intervalo de valores permitidos en los tipos de datos.
El código siguiente genera el error CS0594:

// CS0594.cs
namespace MyNamespace
{
public class MyClass
{
public static void Main()
{
float f = 6.77777777777E400; // CS0594, value too large
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0596


Mensaje de error
El atributo Guid se debe especificar con el atributo ComImport
The Guid attribute must be specified with the ComImport attribute
El atributo Guid se debe especificar con el atributo ComImport.
El código siguiente genera el error CS0596:

// CS0596.cs
using System.Runtime.InteropServices;

namespace x
{
[ComImport] // CS0596
// try the following line to resolve this CS0596
// [ComImport, Guid("00000000-0000-0000-0000-000000000001")]
public class a
{
}

public class b
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0599


Mensaje de error
Valor no válido para el argumento 'argumento' del atributo con nombre
Invalid value for named attribute argument 'argument'
Se pasó un argumento no válido a un atributo.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0601


Mensaje de error
El atributo DllImport se debe especificar en un método marcado como 'static' y 'extern'.
The DllImport attribute must be specified on a method marked 'static' and 'extern'
Se utilizó el atributo DllImport en un método que no tenía las palabras clave de acceso correctas.
El código siguiente genera el error CS0601:

// CS0601.cs
using System.Runtime.InteropServices;
using System.Text;

public class C
{
[DllImport("KERNEL32.DLL")]
extern int GetCurDirectory(int bufSize, StringBuilder buf); // CS0601
// Try the following line instead:
// static extern int GetCurDirectory(int bufSize, StringBuilder buf);
}

public class MainClass


{
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0609


Mensaje de error
No se puede establecer el atributo IndexerName en un indizador marcado como override
Cannot set the IndexerName attribute on an indexer marked override
El atributo de nombre (IndexerNameAttribute) no se puede aplicar a una propiedad indizada que actúa de reemplazo
(override). Para obtener más información, vea Indizadores.
El código siguiente genera el error CS0609:

// CS0609.cs
using System;
using System.Runtime.CompilerServices;

public class idx


{
public virtual int this[int iPropIndex]
{
get
{
return 0;
}
set
{
}
}
}

public class MonthDays : idx


{
[IndexerName("MonthInfoIndexer")] // CS0609, delete to resolve this CS0609
public override int this[int iPropIndex]
{
get
{
return 0;
}
set
{
}
}
}

public class test


{
public static void Main( string[] args )
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0610


Mensaje de error
El campo o la propiedad no pueden ser del tipo 'tipo'
Field or property cannot be of type 'type'
Existen algunos tipos que no pueden utilizarse como campos o propiedades. En estos tipos se incluyen System.ArgIterator y
System.TypedReference.
Los siguientes ejemplos generan CS0610 como resultado de usar System.TypedReference como un campo:

// CS0610.cs
public class MainClass
{
System.TypedReference i; // CS0610
public static void Main ()
{
}

public static void Test(System.TypedReference i) // OK


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0611


Mensaje de error
Los elementos de matriz no pueden ser del tipo 'tipo'
Array elements cannot be of type 'type'
Existen algunos tipos que no pueden utilizarse como tipos de una matriz. En estos tipos se incluyen System.TypedReference
y System.ArgIterator.
Los siguientes ejemplos generan CS0611 por utilizar System.TypedReference como un elemento de matriz:

// CS0611.cs
public class a
{
public static void Main()
{
System.TypedReference[] ao = new System.TypedReference [10]; // CS0611
// try the following line instead
// int[] ao = new int[10];
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0616


Mensaje de error
'clase' no es una clase de atributo
'class' is not an attribute class
Se intentó utilizar una clase sin atributo en un bloque de atributos. Todos los tipos de atributos tienen que heredarse desde
System.Attribute.
Ejemplo
El código siguiente genera el error CS0616.

// CS0616.cs
// compile with: /target:library
[CMyClass(i = 5)] // CS0616
public class CMyClass {}

El código siguiente muestra cómo se puede definir un atributo:

// CreateAttrib.cs
// compile with: /target:library
using System;

[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface)]
public class MyAttr : Attribute
{
public int Name = 0;
public int Count = 0;

public MyAttr (int iCount, int sName)


{
Count = iCount;
Name = sName;
}
}

[MyAttr(5, 50)]
class Class1 {}

[MyAttr(6, 60)]
interface Interface1 {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0617


Mensaje de error
'referencia' no es un argumento de atributo con nombre válido. Los argumentos de atributo con nombre deben ser campos
que no sean propiedades readonly, static, const o propiedades read-write que sean public y no static.
'reference' is not a valid named attribute argument. Named attribute arguments must be fields which are not readonly, static,
or const, or read-write properties which are public and not static.
Se intentó obtener acceso a un miembro private de una clase de atributo.
Ejemplo
El código siguiente genera el error CS0617.

// CS0617.cs
using System;
[AttributeUsage(AttributeTargets.Struct |
AttributeTargets.Class |
AttributeTargets.Interface)]
public class MyClass : Attribute
{
public int Name;

public MyClass (int sName)


{
Name = sName;
Bad = -1;
Bad2 = -1;
}

public readonly int Bad;


public int Bad2;
}

[MyClass(5, Bad=0)] class Class1 {} // CS0617


[MyClass(5, Bad2=0)] class Class2 {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0619


Mensaje de error
'miembro' está obsoleto: 'texto'
'member' is obsolete: 'text'
Se marcó un miembro de clase con el atributo Obsolete, de manera que se emitirá un mensaje de error cuando se haga
referencia al miembro de clase.
El código siguiente genera el error CS0619:

// CS0619.cs
using System;

public class C
{
[Obsolete("Use newMethod instead", true)] // generates an error on use
public static void m()
{
}

// this is the method you should be using


public static void newMethod()
{
}
}

class MyClass
{
public static void Main()
{
C.m(); // CS0619
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0620


Mensaje de error
Los indizadores no pueden tener un tipo void
Indexers can't have void type
El tipo de valor devuelto de un indizador no puede ser void. Un indizador debe devolver un valor.
El código siguiente genera el error CS0620:

// CS0620.cs
class MyClass
{
public static void Main()
{
MyClass test = new MyClass();
System.Console.WriteLine(test[2]);
}

void this [int intI] // CS0620, return type cannot be void


{
get
{
// will need to return some value
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0621


Mensaje de error
'miembro': los miembros virtuales o abstractos no pueden ser privados
'member' : virtual or abstract members cannot be private
No se permiten miembros privados virtual o abstract.
El código siguiente genera el error CS0621:

// CS0621.cs
abstract class MyClass
{
private virtual void DoNothing1() // CS0621
{
}

private abstract void DoNothing2(); // CS0621

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0622


Mensaje de error
Sólo se pueden utilizar expresiones de inicializador de matriz como asignación a tipos de matriz. Pruebe a utilizar una
expresión new en su lugar.
Can only use array initializer expressions to assign to array types. Try using a new expression instead.
Se utilizó una sintaxis que sólo es válida para inicializar una matriz en la declaración de un tipo no de matriz.
Ejemplo
El código siguiente genera el error CS0622:

// CS0622.cs
using System;

public class Test


{
public static void Main ()
{
Test t = { new Test() }; // CS0622
// Try the following instead:
// Test[] t = { new Test() };
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0623


Mensaje de error
Matriz
Array
Se inicializó incorrectamente una matriz.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0625


Mensaje de error
'campo': los tipos de campo de instancia marcados con StructLayout(LayoutKind.Explicit) deben tener un atributo FieldOffset.
'field': instance field types marked with StructLayout(LayoutKind.Explicit) must have a FieldOffset attribute
Cuando se marca una estructura con un atributo StructLayout explícito, todos los campos de la estructura deben tener el
atributo FieldOffset. Para obtener más información, vea StructLayoutAttribute (Clase).
El código siguiente genera el error CS0625:

// CS0625.cs
// compile with: /target:library
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct A
{
public int i; // CS0625 not static; an instance field
}

// OK
[StructLayout(LayoutKind.Explicit)]
struct B
{
[FieldOffset(5)]
public int i;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0629


Mensaje de error
El miembro condicional 'miembro' no puede implementar el miembro de interfaz 'miembro de clase base' en el tipo 'Nombre
de tipo'
Conditional member 'member' cannot implement interface member 'base class member' in type 'Type Name'
El atributo Conditional no puede utilizarse en la implementación de una interfaz.
El código siguiente genera el error CS0629:

// CS0629.cs
interface MyInterface
{
void MyMethod();
}

public class MyClass : MyInterface


{
[System.Diagnostics.Conditional("debug")]
public void MyMethod() // CS0629, remove the Conditional attribute
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0631


Mensaje de error
ref y out no son válidos en este contexto
ref and out are not valid in this context
La declaración de una propiedad de indizador no puede incluir el uso de los parámetros ref u out.
Ejemplo
El código siguiente genera el error CS0631:

// CS0631.cs
public class MyClass
{
public int this[ref int i] // CS0631
// try the following line instead
// public int this[int i]
{
get
{
return 0;
}
}
}

public class MyClass2


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0633


Mensaje de error
El argumento pasado al atributo 'atributo' debe ser un identificador válido
The argument to the 'attribute' attribute must be a valid identifier
Cualquier argumento que se pase a los atributos ConditionalAttribute o IndexerNameAttribute debe ser un identificador válido.
Esto significa que no puede contener caracteres como "+" que no sean válidos cuando aparecen en identificadores.
Ejemplo
En este ejemplo se genera el error CS0633 mediante ConditionalAttribute. El código siguiente genera el error CS0633.

// CS0633a.cs
#define DEBUG
using System.Diagnostics;
public class Test
{
[Conditional("DEB+UG")] // CS0633
// try the following line instead
// [Conditional("DEBUG")]
public static void Main() { }
}

En este ejemplo se genera el error CS0633 mediante IndexerNameAttribute.

// CS0633b.cs
// compile with: /target:module
#define DEBUG
using System.Runtime.CompilerServices;
public class Test
{
[IndexerName("Invalid+Identifier")] // CS0633
// try the following line instead
// [IndexerName("DEBUG")]
public int this[int i]
{
get { return i; }
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0634


Mensaje de error
'arg': el argumento sólo es válido para el cálculo de referencias de tipo System.Interop.UnmanagedType.CustomMarshaller
'arg' : argument only valid for marshal of type System.Interop.UnmanagedType.CustomMarshaller
Uno de los argumentos que se han pasado al atributo Marshal sólo se pueden utilizar cuando el formato del cálculo de
referencias es System.Interop.UnmanagedType.CustomMarshaller.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0635


Mensaje de error
'atributo': System.Interop.UnmanagedType.CustomMarshaller requiere argumentos con nombre ComType y Marshal
'attribute' : System.Interop.UnmanagedType.CustomMarshaller requires named arguments ComType and Marshal
Los argumentos ComType y Marshal deben especificarse cuando el formato de cálculo de referencias sea
System.Interop.UnmanagedType.CustomMarshaller.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0636


Mensaje de error
El atributo FieldOffset sólo se puede colocar en miembros de tipos marcados con StructLayout(LayoutKind.Explicit)
The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit)
Debe utilizar el atributo StructLayout(LayoutKind.Explicit) en la declaración de la estructura, si éste contiene algún
miembro marcado con el atributo FieldOffset. Para obtener más información, vea FieldOffset.
El código siguiente genera el error CS0636:

// CS0636.cs
using System;
using System.Runtime.InteropServices;

// To resolve the error, uncomment the following line:


// [StructLayout(LayoutKind.Explicit)]
struct Worksheet
{
[FieldOffset(4)]public int i; // CS0636
}

public class MainClass


{
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0637


Mensaje de error
El atributo FieldOffset no se permite en campos static ni const
The FieldOffset attribute is not allowed on static or const fields
El atributo FieldOffset no se puede usar en campos marcados como static o const.
El código siguiente genera el error CS0637:

// CS0637.cs
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
public class MainClass
{
[FieldOffset(3)] // CS0637
public static int i;
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0641


Mensaje de error
El atributo 'atributo' sólo es válido en clases derivadas de System.Attribute
'attribute' : attribute is only valid on classes derived from System.Attribute
Se usó un atributo que sólo puede utilizarse en una clase que se derive de System.Attribute.
El código siguiente genera el error CS0641:

// CS0641.cs
using System;

[AttributeUsage(AttributeTargets.All)]
public class NonAttrClass // CS0641
// try the following line instead
// public class NonAttrClass : Attribute
{
}

class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0643


Mensaje de error
'arg' es un argumento de atributo con nombre duplicado
'arg' duplicate named attribute argument
Se especificó dos veces un parámetro, arg, en un atributo definido por el usuario. Para obtener más información, vea
Atributos (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0643:

// CS0643.cs
using System;
using System.Runtime.InteropServices;

[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute : Attribute
{
public MyAttribute()
{
}

public int x;
}

[MyAttribute(x = 5, x = 6)] // CS0643, error setting x twice


// try the following line instead
// [MyAttribute(x = 5)]
class MyClass
{
}

public class MainClass


{
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0644


Mensaje de error
'clase1' no puede heredar de la clase especial 'clase2'
'class1' cannot inherit from special class 'class2'
Las clases no pueden heredar explícitamente de ninguna de las clases base siguientes:
System.Enum
System.ValueType
System.Delegate
System.Array
El compilador las utiliza como clases base implícitas. Por ejemplo, System.ValueType es la clase base implícita de estructuras.
El código siguiente genera el error CS0644:

// CS0644.cs
class MyClass : System.ValueType // CS0644
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0645


Mensaje de error
Identificador demasiado largo
Identifier too long
Un nombre de clase o de cualquier otro identificador no puede ser superior a 512 caracteres.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0646


Mensaje de error
No se puede especificar el atributo DefaultMember en un tipo que contenga un indizador
Cannot specify the DefaultMember attribute on a type containing an indexer
Si una clase u otro tipo especifica System.Reflection.DefaultMemberAttribute, no puede contener un indizador. Para
obtener más información, vea Propiedades.
El código siguiente genera el error CS0646:

// CS0646.cs
// compile with: /target:library
[System.Reflection.DefaultMemberAttribute("x")] // CS0646
class MyClass
{
public int this[int index] // an indexer
{
get
{
return 0;
}
}

public int x = 0;
}

// OK
[System.Reflection.DefaultMemberAttribute("x")]
class MyClass2
{
public int prop
{
get
{
return 0;
}
}

public int x = 0;
}
class MyClass3
{
public int this[int index] // an indexer
{
get
{
return 0;
}
}

public int x = 0;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0647


Mensaje de error
Error al emitir el atributo 'atributo' -- 'causa'
Error emitting 'attribute' attribute -- 'reason'
El código siguiente genera el error CS0647:

// CS0647.cs
using System.Runtime.InteropServices;

[Guid("z")] // CS0647, incorrect uuid format.


// try the following line instead
// [Guid("00000000-0000-0000-0000-000000000001")]
public class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0648


Mensaje de error
No se admite el tipo 'tipo' para este lenguaje
'type' is a type not supported by the language
Un conjunto de metadatos que se generó en otro lenguaje, posiblemente C++, contenía un tipo que no estaba marcado como
administrado. Hay información sobre este tipo incluida en los metadatos, pero el tipo no está disponible para los programas
escritos en C#.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0650


Mensaje de error
Error de sintaxis, declarador de matriz erróneo. Para declarar una matriz administrada, el especificador de rango precede al de
la variable. Para declarar un campo de búfer de tamaño fijo, utilice la palabra clave fixed delante del tipo de campo.
Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a
fixed size buffer field, use the fixed keyword before the field type.
Se declaró incorrectamente una matriz. Tenga en cuenta que la sintaxis de un búfer de tamaño fijo es diferente de la de una
matriz.
Ejemplo
El código siguiente genera el error CS0650.

// CS0650.cs
public class MyClass
{
public static void Main()
{
int myarray[2]; // CS0650

// OK
int[] myarray2 = new int[2] {1,2};
myarray2[0] = 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0653


Mensaje de error
No se puede aplicar la clase de atributo 'clase' porque es abstracta
Cannot apply attribute class 'class' because it is abstract
Una clase abstracta de atributo personalizado no se puede utilizar como atributo.
El código siguiente genera el error CS0653:

// CS0653.cs
using System;

public abstract class MyAttribute : Attribute


{
}

public class My2Attribute : MyAttribute


{
}

[My] // CS0653
// try the following line instead
// [My2]
class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0655


Mensaje de error
'parámetro' no es un argumento de atributo con nombre válido porque no es un tipo de parámetro de atributo válido
'parameter' is not a valid named attribute argument because it is not a valid attribute parameter type
Vea Atributos (Guía de programación de C#) para leer una explicación de los tipos de parámetros válidos para un atributo.
Ejemplo
El código siguiente genera el error CS0655:

// CS0655.cs
using System;

class MyAttribute : Attribute


{
// decimal is not valid attribute parameter type
public decimal d = 0;
public int e = 0;
}

[My(d = 0)] // CS0655


// Try the following line instead:
// [My(e = 0)]
class C
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0656


Mensaje de error
Falta el miembro 'objeto.miembro' que requiere el compilador
Missing compiler required member 'object.member'
Existe uno de los siguientes problemas:
La instalación de Common Language Runtime está dañada.
Hay una referencia a un ensamblado que define un tipo que también se encuentra en Common Language Runtime. Sin
embargo, el tipo de ensamblado no está definido en la forma en que el compilador de C# espera.
Compruebe las referencias para asegurarse de que está utilizando la versión correcta de Common Language Runtime.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0657


Mensaje de error
'modificador de atributo' no es una ubicación de atributos válida para esta declaración. Las ubicaciones de atributos válidas
son 'ubicación'
'attribute modifier' is not a valid attribute location for this declaration. Valid attribute locations for this declaration are 'location'
El compilador detectó un modificador de atributo en una ubicación no válida. Vea Destinos de atributos para obtener más
información.
El código siguiente genera el error CS0657:

// CS0657.cs
// compile with: /target:library
public class TestAttribute : System.Attribute {}
[return: Test] // CS0657 return not valid on a class
class Class1 {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0662


Mensaje de error
'método' no puede especificar sólo el atributo Out en un parámetro ref. Utilice los atributos In y Out, o bien no utilice ninguno.
'method' cannot specify only Out attribute on a ref parameter. Use both In and Out attributes, or neither.
Un método de interfaz tiene un parámetro que utiliza ref con sólo el atributo Out. Un parámetro ref que utilice el atributo Out
debe usar también el atributo In.
El código siguiente genera el error CS0662:

// CS0662.cs
using System.Runtime.InteropServices;

interface I
{
void method([Out] ref int i); // CS0662
// try one of the following lines instead
// void method(ref int i);
// void method([Out, In]ref int i);
}

class test
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0663


Mensaje de error
No puede definir métodos de sobrecarga que difieran sólo en ref y out.
Cannot define overloaded methods that differ only on ref and out.
No se permiten los métodos que únicamente se diferencian en el uso de ref y out en un parámetro.
El código siguiente genera el error CS0663:

// CS0663.cs
class TestClass
{
public static void Main()
{
}

public void Test(ref int i)


{
}

public void Test(out int i) // CS0663


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0664


Mensaje de error
El literal de tipo double no se puede convertir implícitamente en el tipo 'tipo'; utilice un sufijo 'sufijo' para crear un literal de
este tipo
Literal of type double cannot be implicitly converted to type 'type'; use an 'suffix' suffix to create a literal of this type
No se pudo completar una asignación; use un sufijo para corregir la instrucción. La documentación de cada tipo identifica el
sufijo que le corresponde.
El código siguiente genera el error CS0664:

// CS0664.cs
class M
{
static void Main()
{
decimal m = 1.0; // CS0664
// try the following line instead
// decimal m = 1.0M;
System.Console.WriteLine(m);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0666


Mensaje de error
'miembro': nuevo miembro protegido declarado en struct
'member' : new protected member declared in struct
Una estructura (struct) no puede ser abstract e, implícitamente, siempre es sealed. Para obtener más información, vea
Herencia (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS0666:

// CS0666.cs
class M
{
static void Main()
{
}
}

struct S
{
protected int x; // CS0666
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0667


Mensaje de error
La característica 'característica_no_válida' se dejó de utilizar. Utilice 'característica válida' en su lugar.
The feature 'invalid feature' is deprecated. Please use 'valid feature' instead'.
La característica que desea utilizar está en desuso. Actualice el código para utilizar la característica válida en su lugar.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0668


Mensaje de error
Dos indizadores tienen nombres distintos; el atributo IndexerName se debe utilizar con el mismo nombre en cada indizador de
un tipo
Two indexers have different names; the IndexerName attribute must be used with the same name on every indexer within a
type
Los valores pasados al atributo IndexerName deben ser los mismos para todos los indizadores de un tipo. Para obtener más
información sobre el atributo IndexerName, vea IndexerNameAttribute (Clase).
El código siguiente genera el error CS0668:

// CS0668.cs
using System;
using System.Runtime.CompilerServices;

class IndexerClass
{
[IndexerName("IName1")]
public int this [int index] // indexer declaration
{
get
{
return index;
}
set
{
}
}

[IndexerName("IName2")]
public int this [string s] // CS0668, change IName2 to IName1
{
get
{
return int.Parse(s);
}
set
{
}
}

void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0669


Mensaje de error
Una clase con el atributo ComImport no puede tener un constructor definido por el usuario
A class with the ComImport attribute cannot have a user-defined constructor
La capa de interoperabilidad COM de Common Language Runtime proporciona el constructor para las clases ComImport. Por
consiguiente, un objeto COM puede utilizarse como un objeto administrado en tiempo de ejecución.
El código siguiente genera el error CS0669:

// CS0669.cs
using System.Runtime.InteropServices;
[ComImport, Guid("00000000-0000-0000-0000-000000000001")]
class TestClass
{
TestClass() // CS0669, delete constructor to resolve
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0670


Mensaje de error
El campo no puede tener un tipo void
Field cannot have void type
Se declaró un campo con el tipo void.
El código siguiente genera el error CS0670:

// CS0670.cs
class C
{
void f; // CS0670
// try the following line instead
// public int f;

public static void Main()


{
C myc = new C();
myc.f = 0;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0673


Mensaje de error
System.Void no se puede utilizar en C#; utilice typeof(void) para obtener el objeto de tipo void.
System.Void cannot be used from C# -- use typeof(void) to get the void type object.
System.Void no puede usarse en C#.
El código siguiente genera el error CS0673:

// CS0673.cs
class MyClass
{
public static void Main()
{
System.Type t = typeof(System.Void); // CS0673
// try the following line instead
// System.Type t = typeof(void);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0674


Mensaje de error
No use 'System.ParamArrayAttribute'. Use la palabra clave 'params' en su lugar.
Do not use 'System.ParamArrayAttribute'. Use the 'params' keyword instead.
El compilador de C# No permite el uso de System.ParamArrayAttribute; utilice params en su lugar.
El código siguiente genera la advertencia CS0674:

// CS0674.cs
using System;
public class MyClass
{

public static void UseParams([ParamArray] int[] list) // CS0674


// try the following line instead
// public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}

public static void Main()


{
UseParams(1, 2, 3);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0677


Mensaje de error
'variable': un campo volátil no puede ser del tipo 'tipo'
'variable': a volatile field can not be of the type 'type'
Los campos declarados con la palabra clave volatile deben tener uno de los siguientes tipos:
Cualquier tipo de referencia
Cualquier tipo de puntero (en un contexto unsafe)
Los tipos sbyte, byte, short, ushort, int, uint, char, float o bool
Los tipos de enumeración basados en cualquiera de los tipos anteriores
El código siguiente genera el error CS0677:

// CS0677.cs
class TestClass
{
private volatile long i; // CS0677

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0678


Mensaje de error
'variable': un campo no puede ser tanto volátil como de sólo lectura
'variable': a field can not be both volatile and readonly
El uso de las palabras clave volatile y readonly se excluye mutuamente.
El código siguiente genera el error CS0678:

// CS0678.cs
using System;

class TestClass
{
private readonly volatile int i; // CS0678
// try the following line instead
// private volatile int i;

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0681


Mensaje de error
El modificador 'abstract' no es válido en los campos. Intente utilizar una propiedad en su lugar
The modifier 'abstract' is not valid on fields. Try using a property instead
No puede hacer que un campo sea abstracto. Sin embargo, puede tener una propiedad abstracta que tenga acceso al campo.
Ejemplo
En el código siguiente se genera el error CS0681:

// CS0681.cs
// compile with: /target:library
abstract class C
{
abstract int num; // CS0681
}

En su lugar, pruebe con el siguiente código:

// CS0681b.cs
// compile with: /target:library
abstract class C
{
public abstract int num
{
get;
set;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0682


Mensaje de error
'tipo1' no puede implementar 'tipo2' porque no es compatible con el lenguaje
'type1' cannot implement 'type2' because it is not supported by the language
Este error se produce cuando se intenta implementar una interfaz escrita en otro lenguaje y el compilador no es compatible
con ella.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0683


Mensaje de error
La implementación del método explícito 'métodoexplícito' no puede implementar 'método' porque es un descriptor de acceso
"'explicitmethod' explicit method implementation cannot implement 'method' because it is an accessor
El código siguiente genera la advertencia CS0683:

// CS0683.cs
interface IExample
{
int Test { get; }
}

class CExample : IExample


{
int IExample.get_Test() { return 0; } // CS0683
int IExample.Test { get{ return 0; } } // correct
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0685


Mensaje de error
El miembro condicional 'miembro' no puede tener ningún parámetro out
Conditional member 'member' cannot have an out parameter
Cuando se utiliza el atributo ConditionalAttribute en un método, ese método no puede tener un parámetro out. Esto se debe a
que el valor de la variable utilizada para el parámetro out no se definiría en caso de que al compilar la llamada al método el
resultado sea nada. Para evitar este error, quite el parámetro out de la declaración de método condicional o no utilice el
atributo Conditional.
Ejemplo
El código siguiente genera el error CS0685:

// CS0685.cs
using System.Diagnostics;

class C
{
[Conditional("DEBUG")]
void trace(out int i) // CS0685
{
i = 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0686


Mensaje de error
El descriptor de acceso 'descriptor de acceso' no puede implementar el miembro de interfaz 'miembro' para el tipo 'tipo'.
Utilice una implementación de interfaz explícita.
Accessor 'accessor' cannot implement interface member 'member' for type 'type'. Use an explicit interface implementation.
Sugerencia: este error se puede producir al implementar una interfaz que contiene nombres de métodos que están en conflicto
con los métodos generados automáticamente y asociados a una propiedad o un evento. Los métodos get/set correspondientes
a las propiedades se generan como get_propiedad y set_propiedad, y los métodos add/remove correspondientes a los eventos
se generan como add_evento y remove_evento. Si una interfaz contiene cualquiera de estos métodos, se produce un conflicto.
Para evitar este error, implemente los métodos mediante una implementación de interfaces explícita. Para ello, especifique la
función de la siguiente manera:

Interface.get_property() { /* */ }
Interface.set_property() { /* */ }

Ejemplo
El código siguiente genera el error CS0686:

// CS0686.cs
interface I
{
int get_P();
}

class C : I
{
public int P
{
get { return 1; } // CS0686
}
}
// But the following is valid:
class D : I
{
int I.get_P() { return 1; }
public static void Main() {}
}

Este error también se puede producir al declarar los eventos. La construcción del evento genera automáticamente los métodos
add_event y remove_event, que pueden estar en conflicto con los métodos del mismo nombre de una interfaz, como en el
ejemplo siguiente:

// CS0686b.cs
using System;
interface I
{
void add_OnMyEvent(EventHandler e);
}

class C : I
{
public event EventHandler OnMyEvent
{
add { } // CS0686
remove { }
}
}
// Correct (using explicit interface implementation):
class D : I
{
void I.add_OnMyEvent(EventHandler e) {}
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0687


Mensaje de error
El calificador de alias del espacio de nombres '::' siempre se resuelve en un tipo o espacio de nombres; por tanto, aquí no es
válido. Utilice '.' en su lugar.
The namespace alias qualifier '::' always resolves to a type or namespace so is illegal here. Consider using '.' instead.
Este error aparece si ha utilizado algo que el analizador ha interpretado como un tipo en un lugar inesperado. Un tipo o el
nombre del espacio de nombres sólo es válido en una expresión de acceso de miembro, utilizando el operador (.) de acceso de
miembro. Esto podría ocurrir si ha utilizado el operador de ámbito global (::) en otro contexto.
Ejemplo
En el código siguiente se genera el error CS0687:

// CS0687.cs

using M = Test;
using System;
public class Test
{
public static int x = 77;

public static void Main()


{
Console.WriteLine(M::x); // CS0687
// To resolve use the following line instead:
// Console.WriteLine(M.x);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0689


Mensaje de error
No se puede derivar de 'identificador' porque es un parámetro de tipo
Cannot derive from 'identifier' because it is a type parameter
Un parámetro de tipo no puede especificar clases base o interfaces para las clases genéricas. Se debe derivar de una interfaz o
clase específica o de una clase genérica específica, o bien incluir el tipo desconocido como miembro.
El código siguiente genera el error CS0689:

// CS0689.cs
class A<T> : T // CS0689
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0690


Mensaje de error
El archivo de entrada 'archivo' contiene metadatos no válidos.
Input file 'file' contains invalid metadata.
Puede abrir el archivo de metadatos, pero debido a algunos problemas de ubicación, los metadatos están dañados. Este error
es similar al CS0009, exceptuando que en este caso puede abrir el archivo de metadatos.
Un PE (Process Executable, ejecutable de proceso) es un archivo ejecutable.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0692


Mensaje de error
Parámetro de tipo duplicado 'identificador'
Duplicate type parameter 'identifier'
No se puede utilizar el mismo nombre más de una vez en una lista de parámetros de tipo. Cambie el nombre o quite los
parámetros de tipo duplicados.
Ejemplo
En el código siguiente se genera el error CS0692:

// CS0692.cs
// compile with: /target:library
class C <T, A, T> // CS0692
{
}

class D <T, T> // CS0692


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0694


Mensaje de error
El parámetro de tipo 'identificador' tiene el mismo nombre que el tipo contenedor o el método
Type parameter 'identifier' has the same name as the containing type, or method
Debe utilizar un nombre diferente para el parámetro de tipo, puesto que su nombre no puede ser idéntico al del tipo o método
que contiene el parámetro de tipo.
Ejemplo
El código siguiente genera el error CS0694.

// CS0694.cs
// compile with: /target:library
class C<C> {} // CS0694

Además del en caso anterior que se refiere a una clase genérica, este error se puede producir con un método:

// CS0694_2.cs
// compile with: /target:library
class A
{
public void F<F>(F arg); // CS0694
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0695


Mensaje de error
'tipo genérico' no puede implementar tanto 'interfaz genérica' como 'interfaz genérica', porque se pueden unificar para
algunas sustituciones de parámetros de tipo
'generic type' cannot implement both 'generic interface' and 'generic interface' because they may unify for some type
parameter substitutions
Este error se produce cuando una clase genérica implementa más de una parametrización de la misma interfaz genérica y
existe una substitución de parámetro de tipo que haría que ambas interfaces fuesen idénticas. Para evitar este error,
implemente sólo una de las interfaces o cambie los parámetros de tipo para evitar el conflicto.
El código siguiente genera el error CS0695:

// CS0695.cs
// compile with: /target:library

interface I<T>
{
}

class G<T1, T2> : I<T1>, I<T2> // CS0695


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0698


Mensaje de error
Un tipo genérico no puede derivar de 'clase' porque es una clase de atributo
A generic type cannot derive from 'class' because it is an attribute class
Cualquier clase que deriva de una clase de atributo es un atributo. No se permite que los atributos sean tipos genéricos.
El código siguiente genera el error CS0698:

// CS0698.cs
class C<T> : System.Attribute // CS0698
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0699


Mensaje de error
'genérico' no define el parámetro de tipo 'identificador'
'generic' does not define type parameter 'identifier'
Se ha utilizado un parámetro de tipo en una definición genérica no encontrada en la lista de declaraciones de los parámetros
de tipo para esa definición genérica. Esto puede suceder si se utiliza un nombre incoherente para el parámetro de tipo.
El código siguiente genera el error CS0699:

// CS0699.cs
class C<T> where U : I // CS0699 – U is not a valid type parameter
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0701


Mensaje de error
'identificador' no es una restricción válida. Un tipo utilizado como restricción debe ser una interfaz, una clase no sealed o un
parámetro de tipo.
'identifier' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
Este error aparece si se utiliza un tipo sealed como una restricción. Para resolver este error, utilice sólo tipos no sealed como
restricciones.
Ejemplo
El código siguiente genera el error CS0701.

// CS0701.cs
// compile with: /target:library
class C<T> where T : System.String {} // CS0701
class D<T> where T : System.Attribute {} // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS0702


Mensaje de error
La restricción no puede ser una clase especial 'identificador'
Constraint cannot be special class 'identifier'
Los tipos siguientes no se pueden utilizar como restricciones: System.Array, System.Delegate, System.Enum o
System.ValueType.

Ejemplo
El código siguiente genera el error CS0702:

// CS0702.cs
class C<T> where T : System.Array // CS0702
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0703


Mensaje de error
Accesibilidad incoherente: el tipo de restricción 'identificador' es menos accesible que 'identificador'
Inconsistent accessibility: constraint type 'identifier' is less accessible than 'identifier'
Una restricción no puede obligar al parámetro genérico a ser menos accesible que la propia clase genérica. En el siguiente
ejemplo, aunque se declara que la clase genérica C<T> es public, la restricción intenta forzar a T a que implemente una interfaz
interna. Incluso si estuviera permitido, sólo los clientes con acceso interno podrían crear el parámetro de la clase, de modo que,
en la práctica, sólo podrían utilizar la clase los clientes con acceso interno.
Para corregir este error, asegúrese de que el nivel de acceso de la clase genérica no sea menos restrictivo que las clases o
interfaces que aparecen en los límites.
El código siguiente genera el error CS0703:

// CS0703.cs
internal interface I {}
public class C<T> where T : I // CS0703 – I is internal; C<T> is public
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0704


Mensaje de error
No se pueden buscar miembros en 'tipo' porque es un tipo de parámetro
Cannot do member lookup in 'type' because it is a type parameter
No se puede especificar un tipo interno a través de un parámetro de tipo. Intente utilizar el tipo que desee explícitamente.
Ejemplo
En el código siguiente se genera el error CS0704:

// CS0704.cs
class B
{
public class I { }
}

class C<T> where T : B


{
T.I f; // CS0704 – member lookup on type parameter
// Try this instead:
// B.I f;
}

class CMain
{
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0706


Mensaje de error
Tipo de restricción no válida. Un tipo utilizado como restricción debe ser una interfaz, una clase no sealed o un parámetro de
tipo.
Invalid constraint type. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
Este error aparece cuando se utiliza una construcción no válida en una cláusula de restricción. Para evitar este error, utilice una
interfaz o clase no sealed en lugar de la construcción que produjo el error.
Ejemplo
En el código siguiente se genera el error CS0706.

// CS0706.cs
// compile with: /target:library
class A {}
class C<T> where T : int[] {} // CS0706
class D<T> where T : A {} // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS0708


Mensaje de error
'campo': no se pueden declarar miembros de instancia en una clase estática
'field': cannot declare instance members in a static class
Este error se produce si se declara un miembro no estático en una clase declarada como estática. No se puede crear instancias
de clases estáticas, por lo que las variables de instancia no serían significativas. La palabra clave static debe aplicarse a todos
los miembros de las clases estáticas.
El código siguiente genera el error CS0708:

// CS0708.cs
// compile with: /target:library
public static class C
{
int i; // CS0708
static int j; // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0709


Mensaje de error
'clase derivada': no se puede derivar de la clase estática 'clase base'
'derived class': cannot derive from static class 'base class'
No se puede crear ninguna instancia o derivar de una clase estática. Es decir, una clase estática no puede ser una clase base de
cualquier otra clase.
Ejemplo
El código siguiente genera el error CS0709.

// CS0709.cs
// compile with: /target:library
public static class Base {}
public class Derived : Base {} // CS0709
Referencia de Visual C#: errores y advertencias

Error del compilador CS0710


Mensaje de error
Las clases estáticas no pueden tener constructores de instancia
Static classes cannot have instance constructors
No puede crearse instancias de una clase estática, por lo tanto no necesita constructores. Para evitar este error, quite todos los
constructores de las clases estáticas; o bien, si está seguro de que quiere crear instancias, convierta la clase en no estática.
El código siguiente genera el error CS0710:

// CS0710.cs
public static class C
{
public C() // CS0710
{
}
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0711


Mensaje de error
Las clases estáticas no pueden contener destructores
Static classes cannot contain destructors
No puede crearse instancias de una clase estática, por lo tanto necesita constructores ni destructores. Para evitar este error,
quite todos los destructores de las clases estáticas; o bien, si está seguro de que quiere crear y destruir instancias, convierta la
clase en no estática.
El código siguiente genera el error CS0711:

// CS0711.cs
public static class C
{
~C() // CS0711
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0712


Mensaje de error
No puede crear ninguna instancia de la clase estática 'clase estática'
Cannot create an instance of the static class 'static class'
No es posible crear instancias de clases estáticas. Las clases estáticas están diseñadas para contener métodos y campos
estáticos, pero no se pueden crear instancias de ellas.
Ejemplo
En el código siguiente se genera el error CS0712:

// CS0712.cs
public static class SC
{
}
public class CMain
{
public static void Main()
{
SC sc = new SC(); // CS0712
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0713


Mensaje de error
La clase estática 'tipo estático' no se puede derivar del tipo 'tipo'. Las clases estáticas se deben derivar del objeto.
Static class 'static type' cannot derive from type 'type'. Static classes must derive from object.
Si se permitiera, la clase estática heredaría métodos y los miembros no estáticos de la clase base, de modo que ya no sería
estática. Por lo tanto, no se permite.
El código siguiente genera el error CS0713:

// CS0713.cs
public class Base
{
}

public static class Derived : Base // CS0713


{
}

public class CMain


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0714


Mensaje de error
'tipo estático': las clases estáticas no pueden implementar interfaces
'static type' : static classes cannot implement interfaces
Las interfaces pueden definir métodos no estáticos en objetos y, por tanto, no se pueden implementar mediante clases
estáticas. Para resolver este error, asegúrese de que su clase no intenta implementar ninguna interfaz.
Ejemplo
En el código siguiente se genera el error CS0714:

// CS0714.cs
interface I
{
}
public static class C : I // CS0714
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0715


Mensaje de error
'clase estática': las clases estáticas no pueden contener operadores definidos por el usuario
'static class' : static classes cannot contain user defined operators
Se están utilizando operadores definidos por el usuario en instancias de clases. No pueden crearse instancias de las clases
estáticas, por lo que no es posible utilizar operadores con dichas instancias. Por lo tanto, no está permitido el uso de
operadores definidos por el usuario en clases estáticas.
El código siguiente genera el error CS0715:

// CS0715.cs
public static class C
{
public static C operator+(C c) // CS0715
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0716


Mensaje de error
No se puede convertir en el tipo estático 'tipo'
Cannot convert to static type 'type'
Este error se produce si el código utiliza una conversión para convertir en un tipo estático. Puesto que no es posible que un
objeto sea una instancia de un tipo estático, la conversión en un tipo estático nunca puede ser significativa.
Ejemplo
El código siguiente genera el error CS0716:

// CS0716.cs

public static class SC


{
static void F() { }
}

public class Test


{
public static void Main()
{
object o = new object();
System.Console.WriteLine((SC)o); // CS0716
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0717


Mensaje de error
'clase estática': las clases estáticas no se pueden utilizar como restricciones
'static class': static classes cannot be used as constraints
Las clases estáticas no se pueden extender, puesto que sólo contienen miembros estáticos y no miembros de instancia. Al no
poder extenderse, no sirven como parámetros de tipo y restricciones: no puede existir ningún tipo que sea una especialización
de una clase estática.
Ejemplo
El código siguiente genera el error CS0717:

// CS0717.cs

public static class SC


{
public static void F()
{
}
}

public class G<T> where T : SC // CS0717


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0718


Mensaje de error
'tipo': los tipos estáticos no se pueden utilizar como argumentos genéricos
'type': static types cannot be used as generic arguments
Dado que no se pueden crear instancias de un tipo estático, no se puede utilizar como un argumento genérico. Para resolver
este error, quite el tipo estático del argumento genérico.
Ejemplo
En el código siguiente se genera el error CS0718:

// CS0718.cs
public static class SC
{
public static void F()
{
}
}

public class G<T>


{
}

public class CMain


{
public static void Main()
{
G<SC> gsc = new G<SC>(); // CS0718
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0719


Mensaje de error
'tipo': los elementos de matriz no pueden ser de tipo estático
'type': array elements cannot be of static type
Una matriz de tipo estático no tiene sentido, puesto que los elementos de las matrices son instancias y no se pueden crear
instancias de tipos estáticos.
El código siguiente genera el error CS0719:

// CS0719.cs
public static class SC
{
public static void F()
{
}
}

public class CMain


{
public static void Main()
{
SC[] sca = new SC[10]; // CS0719
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0720


Mensaje de error
'clase estática': no se pueden declarar indizadores en una clase estática
'static class': cannot declare indexers in a static class
Los indizadores no son significativos en las clases estáticas, puesto que sólo pueden utilizarse con instancias y éstas últimas no
se pueden crear de un tipo estático.
Ejemplo
El código siguiente genera el error CS0720:

// CS0720.cs

public static class Test


{
public int this[int index] // CS0720
{
get { return 1; }
set {}
}

static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0721


Mensaje de error
'tipo': los tipos estáticos no se pueden utilizar como parámetros
'type': static types cannot be used as parameters
Un tipo estático no es significativo como parámetro. Puesto que no se pueden crear instancias de los tipos estáticos, nunca se
podría pasar ninguna instancia como parámetro.
El código siguiente genera el error CS0721:

// CS0721.cs
public static class SC
{
}

public class CMain


{
public void F(SC sc) // CS0721
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0722


Mensaje de error
'tipo': los tipos estáticos no se pueden utilizar como tipos de valores devueltos
'type': static types cannot be used as return types
Un tipo estático no es significativo como tipo de valor devuelto, puesto que no se puede crear instancias de tipos estáticos.
El código siguiente genera el error CS0722:

// CS0722.cs
public static class SC
{
}

public class CMain


{
public SC F() // CS0722
{
return null;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0723


Mensaje de error
No se puede declarar la variable de tipo estático 'tipo'
Cannot declare variable of static type 'type'
No se pueden crear instancias de tipos estáticos.
En el código siguiente se genera el error CS0723:

// CS0723.cs
public static class SC
{
}

public class CMain


{
public static void Main()
{
SC sc = null; // CS0723
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0724


Mensaje de error
No se permite una instrucción throw sin argumentos dentro de una cláusula finally anidada dentro de la cláusula catch más
interior
A throw statement with no arguments is not allowed inside of a finally clause nested inside of the innermost catch clause
En el siguiente ejemplo se genera el error CS0724 debido a la instrucción throw dentro del bloque de cláusula finally.
Ejemplo
En el siguiente ejemplo se genera el error CS0724.

// CS0724.cs
using System;

class X
{
static void Test()
{
try
{
throw new Exception();
}
catch
{
try
{
}
finally
{
throw; // CS0724
}
}
}

static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0726


Mensaje de error
'especificador del formato' no es un especificador de formato válido
'format specifier' is not a valid format specifier
Este error aparece en el depurador. Cuando escribe un nombre de variable en una de las ventanas del depurador, puede
escribir a continuación una coma y, después, un especificador de formato. Algunos ejemplos de ello son myInt, h o
myString,nq. Este error surge cuando el compilador no reconoce el Especificadores de formato en C#.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0727


Mensaje de error
Especificador de formato no válido
Invalid format specifier
Este error se produce en el depurador. Cuando se escribe un nombre de variable en una de las ventanas del depurador, puede
ir seguido por una coma y, a continuación, por un especificador de formato. Algunos ejemplos de ello son: myInt, h; o
myString,nq. Este error se produce cuando el compilador no puede analizar lo que se ha escrito. Para resolverlo, escriba de
nuevo el nombre de variable seguido, si lo desea, por una coma y un especificador de formato válido.
Referencia de Visual C#: errores y advertencias

Error del compilador CS0729


Mensaje de error
Se define el tipo 'tipo' de este ensamblado, pero se especifica un reenviador de tipos para él
Type 'type' is defined in this assembly, but a type forwarder is specified for it
No se puede utilizar un reenviador de tipos para un tipo definido en el mismo ensamblado.
Ejemplo
El código siguiente genera el error CS0729.

// CS0729.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(TestClass))] // CS0729
class TestClass {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0730


Mensaje de error
No se puede reenviar el tipo 'tipo' porque es un tipo anidado de 'tipo'
Cannot forward type 'type' because it is a nested type of 'type'
Este error se genera cuando se intenta reenviar una clase anidada.
Ejemplo
El código siguiente genera el error CS0730. Está compuesto por dos archivos de código fuente. En primer lugar, compile el
archivo de biblioteca CS0730a.csy, a continuación, el archivo CS0730.cs que hace referencia al archivo de biblioteca.

// CS0730a.cs
// compile with: /t:library
public class Outer
{
public class Nested {}
}

// CS0730.cs
// compile with: /t:library /r:CS0730a.dll
using System.Runtime.CompilerServices;

[assembly:TypeForwardedToAttribute(typeof(Outer.Nested))] // CS0730

[assembly:TypeForwardedToAttribute(typeof(Outer))] // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS0731


Mensaje de error
El reenviador del tipo 'tipo' en el ensamblado 'ensamblado' crea un ciclo
The type forwarder for type 'type' in assembly 'assembly' causes a cycle
Este error sólo puede aparecer con metadatos importados formados incorrectamente. No puede aparecer sólo con código
fuente C#.
Ejemplo
El código siguiente genera el error CS0731. El ejemplo consta de tres archivos:
1. Circular.IL
2. Circular2.IL
3. CS0731.cs
En primer lugar, compile los archivos .IL como bibliotecas y, a continuación, compile el código .cs haciendo referencia a los dos
archivos.

// Circular.il
// compile with: /DLL /out=Circular.dll
.assembly extern circular2
{
.ver 0:0:0:0
}
.assembly extern circular3
{
.ver 0:0:0:0
}
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly Circular
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAtt
ribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.class extern forwarder Circular.Referenced.TypeForwarder
{
.assembly extern circular2
}
.module Circular.dll
// MVID: {880C2329-C915-42A0-83E9-9D10C3E6DBD0}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x04E40000
// ======== CLASS MEMBERS DECLARATION =========
.class public abstract auto ansi sealed beforefieldinit User
extends [mscorlib]System.Object
{
.method public hidebysig static class [circular2]Circular.Referenced.TypeForwarder
F() cil managed
{
.maxstack 1
newobj instance void [circular2]Circular.Referenced.TypeForwarder::.ctor()
ret
}
}

// Circular2.il
// compile with: /DLL /out=Circular2.dll
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 2:0:0:0
}
.assembly extern Circular
{
.ver 0:0:0:0
}
.assembly circular2
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAtt
ribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.class extern forwarder Circular.Referenced.TypeForwarder
{
.assembly extern Circular
}
.module circular2.dll
// MVID: {8B3BE5C8-DBE1-49C4-BC72-DF35F0387C21}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x04E40000

// CS0731.cs
// compile with: /reference:circular.dll /reference:circular2.dll
// CS0731 expected
class A {
public static void Main() {
User.F();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0733


Mensaje de error
No se puede reenviar el tipo genérico, 'GenericType<>'
Cannot forward generic type, 'GenericType<>'
Ejemplo
En el siguiente ejemplo se genera el error CS0733. Compile el primer archivo como una biblioteca y, a continuación, haga
referencia a él cuando compile el segundo archivo.

// CS0733a.cs
// compile with: /target:library
public class GenericType<T>
{
}

// CS0733.cs
// compile with: /target:library /r:CS0733a.dll
[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(GenericType<int>))] //
CS0733
Referencia de Visual C#: errores y advertencias

Error del compilador CS0734


Mensaje de error
La opción /moduleassemblyname sólo se puede especificar al generar un tipo de destino de 'módulo'
The /moduleassemblyname option may only be specified when building a target type of 'module'
La opción del compilador /moduleassemblyname sólo se debe utilizar al generar un .netmodule. Para obtener más
información, vea
/moduleassemblyname (Especificar un ensamblado de confianza para el módulo) (Opción del compilador de C# ).
Para obtener más información sobre cómo generar un .netmodule, vea
/target:module (Crear un módulo para agregarlo a un ensamblado) (Opciones del compilador de C#).
Ejemplo
El código siguiente genera el error CS0734. Para resolver este problema, agregue /target:module a la compilación.

// CS0734.cs
// compile with: /moduleassemblyname:A
// CS0734 expected
public class Test {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1001


Mensaje de error
Se esperaba un identificador
Identifier expected
No se proporcionó un identificador. Por ejemplo, al declarar una enumeración, se deben especificar sus miembros.
El código siguiente genera el error CS1001:

// CS1001.cs
public class clx
{
enum splitch : int
{
'a', 'b' // CS1001, 'a' is not a valid int identifier
};

public static void Main()


{
}
}

Los nombres de los parámetros son obligatorios aunque el compilador no los utilice, por ejemplo, en una definición de
interfaz. Estos nombres son necesarios para que los programadores que utilicen la interfaz tengan información sobre lo que
significan los parámetros.

// CS1001-2.cs
// compile with: /target:library
interface IMyTest
{
void TestFunc1(int, int); // CS1001
}

class CMyTest : IMyTest


{
void IMyTest.TestFunc1(int a, int b)
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1002


Mensaje de error
Se esperaba ;
; expected
El compilador detectó la falta de un punto y coma.
El código siguiente genera el error CS1002:

// CS1002.cs
namespace x
{
abstract public class clx
{
int i // CS1002, missing semicolon

public static int Main()


{
return 0;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1003


Mensaje de error
Error sintáctico, se esperaba 'char'
Syntax error, 'char' expected
El compilador generará este error para varias condiciones diferentes de error. Revise el código para encontrar el error de
sintaxis.
El código siguiente genera el error CS1003:

// CS1003.cs
public class b
{
public static void Main()
{
int[] a;
a[); // CS1003
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1004


Mensaje de error
Modificador 'modificador' duplicado
Duplicate 'modifier' modifier
Se detectó un modificador duplicado, como un modificador access.
El código siguiente genera el error CS1004:

// CS1004.cs
public class clx
{
public public static void Main() // CS1004, two public keywords
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1007


Mensaje de error
Ya se ha definido el descriptor de acceso de la propiedad
Property accessor already defined
Cuando declare una propiedad, también debe declarar sus métodos del descriptor de acceso. Sin embargo, una propiedad no
puede tener más de un método de los descriptores de acceso get o set.
Ejemplo
El código siguiente genera el error CS1007:

// CS1007.cs
public class clx
{
public int MyProperty
{
get
{
return 0;
}
get // CS1007, this is the second get method
{
return 0;
}
}

public static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1008


Mensaje de error
Se esperaba el tipo byte, sbyte, short, ushort, int, uint, long o ulong
Type byte, sbyte, short, ushort, int, uint, long, or ulong expected
Ciertos tipos de datos, como las enumeraciones, sólo se pueden declarar para que contengan datos de un tipo determinado.
El código siguiente genera el error CS1008:

// CS1008.cs
abstract public class clx
{
enum splitch : char // CS1008, char not valid type for enums
{
x, y, z
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1009


Mensaje de error
Secuencia de escape no reconocida
Unrecognized escape sequence
Se encontró un carácter inesperado seguido de una barra invertida (\) en una cadena. El compilador espera uno de los
caracteres de escape válidos; vea caracteres de escape para obtener más información.
El código siguiente genera el error CS1009:

// CS1009-a.cs
class MyClass
{
static void Main()
{
string a = "\m"; // CS1009
// try the following line instead
// string a = "\t";
}
}

Un caso común en que se produce este error es el uso de la barra diagonal inversa en un nombre de archivo, por ejemplo:

string filename = "c:\myFolder\myFile.txt";

Para resolver este error, utilice "\\" o el literal de cadena entrecomillado y precedido por la @, como se muestra en el ejemplo
siguiente:

// CS1009-b.cs
class MyClass
{
static void Main()
{
string filename = "c:\myFolder\myFile.txt"; // CS1009
// try the one of the following lines instead
// string filename = "c:\\myFolder\\myFile.txt";
// string filename = @"c:\myFolder\myFile.txt";
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1010


Mensaje de error
Nueva línea en constante
Newline in constant
No se delimitó correctamente una cadena.
El código siguiente genera el error CS1010:

// CS1010.cs
class Sample
{
static void Main()
{
string a = "Hello World; // CS1010, add end quote
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1011


Mensaje de error
Literal de carácter vacío
Empty character literal
Se declaró un tipo char y se inicializó como null. La inicialización de un valor char debe especificar un carácter.
El código siguiente genera el error CS1011:

// CS1011.cs
class Sample
{
public char CharField = ''; // CS1011
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1012


Mensaje de error
Demasiados caracteres en literal de carácter
Too many characters in character literal
Se intentó inicializar una constante char con más de un carácter.
El error CS1012 también puede aparecer al hacer el enlace de datos. Por ejemplo, la línea siguiente generará un error:
<%# DataBinder.Eval(Container.DataItem, 'doctitle') %>

En su lugar, pruebe con la línea siguiente:


<%# DataBinder.Eval(Container.DataItem, "doctitle") %>

El código siguiente genera el error CS1012:

// CS1012.cs
class Sample
{
static void Main()
{
char a = 'xx'; // CS1012
char a2 = 'x'; // OK
System.Console.WriteLine(a2);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1013


Mensaje de error
Número no válido
Invalid number
El compilador detectó un número mal formado. Para obtener más información acerca de los tipos integrales, vea el
Tabla de tipos integrales (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS1013:

// CS1013.cs
class Sample
{
static void Main()
{
int i = 0x; // CS1013
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1014


Mensaje de error
Se esperaba un descriptor de acceso get o set
A get or set accessor expected
Se encontró una declaración de método en una declaración de propiedad. Sólo se pueden declarar los métodos get y set en
una propiedad.
Para obtener más información sobre propiedades, vea Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS1014.

// CS1014.cs
// compile with: /target:library
class Sample
{
public int TestProperty
{
get
{
return 0;
}
int z; // CS1014 not get or set
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1015


Mensaje de error
Se esperaba un tipo de objeto, cadena o clase
An object, string, or class type expected
Se intentó pasar un tipo de datos predefinido a un bloque catch. Sólo se pueden pasar a un bloque catch los tipos de datos
derivados de System.Exception. Para obtener más información sobre excepciones, vea
Instrucciones para el control de excepciones (Referencia de C#).
Ejemplo
El código siguiente genera el error CS1015:

// CS1015.cs
class Sample
{
static void Main()
{
try
{
}
catch(int) // CS1015, int is not derived from System.Exception
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1016


Mensaje de error
Se esperaba un argumento de atributo con nombre
Named attribute argument expected
Los argumentos de atributo sin nombre deben aparecer antes que los argumentos con nombre.
Ejemplo
El código siguiente genera el error CS1016:

// CS1016.cs
using System;

[AttributeUsage(AttributeTargets.Class)]
public class HelpAttribute : Attribute
{
public HelpAttribute(string url) // url is a positional parameter
{
m_url = url;
}

public string Topic = null; // Topic is a named parameter


private string m_url = null;
}

[HelpAttribute(Topic="Samples", "http://intranet/inhouse")] // CS1016


// try the following line instead
//[HelpAttribute("http://intranet/inhouse", Topic="Samples")]
public class MainClass
{
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1017


Mensaje de error
La instrucción try ya tiene un bloque catch vacío
Try statement already has an empty catch block
Un bloque catch que no toma ningún parámetro debe ser el último de una serie de bloques catch. Para obtener más
información sobre excepciones, vea Instrucciones para el control de excepciones (Referencia de C#).
Ejemplo
El código siguiente genera el error CS1017:

// CS1017.cs
using System;

namespace x
{
public class b : Exception
{
}

public class a
{
public static void Main()
{
try
{
}

catch // CS1017, must be last catch


{
}

catch(b)
{
throw;
}
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1018


Mensaje de error
Se esperaba la palabra clave 'this' o 'base'
Keyword 'this' or 'base' expected
El compilador encontró una declaración de constructor incompleta.
Ejemplo
En el ejemplo siguiente se genera el error CS1018 y se sugieren varias formas de resolver este error:

// CS1018.cs
public class C
{
}

public class a : C
{
public a(int i)
{
}

public a () : // CS1018
// possible resolutions:
// public a () resolves by removing the colon
// public a () : base() calls C's default constructor
// public a () : this(1) calls the assignment constructor of class a
{
}

public static int Main()


{
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1019


Mensaje de error
Se esperaba un operador unario sobrecargable
Overloadable unary operator expected
Hay un operador unario que devuelve un valor de otra clase. Si se desea esta conversión, se debe realizar una conversión
implicit o explicit.
El código siguiente genera el error CS1019:

// CS1019.cs
public class ii
{
int i
{
get
{
return 0;
}
}
}

public class a
{
public static a operator ii(a aa) // CS1019
// try the following line instead
//public static a operator ++(a aa)
{
return new a();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1020


Mensaje de error
Se esperaba un operador binario sobrecargable
Overloadable binary operator expected
Se intentó definir una sobrecarga de operador, pero el operador no era binario (con dos parámetros).
El código siguiente genera el error CS1020:

// CS1020.cs
public class iii
{
public static int operator ++(iii aa, int bb) // CS1020, change ++ to +
{
return 0;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1021


Mensaje de error
La constante integral es demasiado extensa
Integral constant is too large
Se asignó un valor a un tipo integral que es mayor que el valor de entero sin signo de mayor tamaño posible.
El código siguiente genera el error CS1021:

// CS1021.cs
enum F : int
{
a=(int)2590000000000000000000 // CS1021
}

public class clx


{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1022


Mensaje de error
Se esperaba una definición de tipo o espacio de nombres, o el fin del archivo
Type or namespace definition, or end-of-file expected
Un archivo de código fuente carece de un par de llaves coincidentes.
El código siguiente genera el error CS1022:

// CS1022.cs
namespace x
{
}
} // CS1022
Referencia de Visual C#: errores y advertencias

Error del compilador CS1023


Mensaje de error
Una instrucción incrustada no puede ser una declaración o una instrucción con etiqueta
Embedded statement cannot be a declaration or labeled statement
Una instrucción incrustada, como las instrucciones que siguen a una instrucción if, no pueden contener declaraciones ni
instrucciones con etiqueta.
El código siguiente genera el error CS1023 dos veces:

// CS1023.cs
public class a
{
public static void Main()
{
if (1)
int i; // CS1023, declaration is not valid here

if (1)
xx : i++; // CS1023, labeled statement is not valid here
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1024


Mensaje de error
Se esperaba una directiva de preprocesador
Preprocessor directive expected
Una línea comenzaba con el símbolo de número (#), pero la cadena siguiente no era una directiva de preprocesador válida.
El código siguiente genera el error CS1024:

// CS1024.cs
#import System // CS1024
Referencia de Visual C#: errores y advertencias

Error del compilador CS1025


Mensaje de error
Se esperaba un comentario de una línea o un fin de línea
Single-line comment or end-of-line expected
Una línea con una directiva de preprocesador no puede tener un comentario multilínea.
El código siguiente genera el error CS1025:

#if true /* hello


*/ // CS1025
#endif // this is a good comment

También puede ocurrir el error CS1025 si se intenta utilizar una directiva de preprocesador no válida como se indica a
continuación:

// CS1025.cs
#define a

class Sample
{
static void Main()
{
#if a 1 // CS1025, invalid syntax
System.Console.WriteLine("Hello, World!");
#endif
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1026


Mensaje de error
Se esperaba )
) expected
Se ha encontrado una instrucción incompleta.
Una causa común para que se produzca este error es situar una instrucción, en vez de una expresión, dentro de una expresión
entre líneas en una página de ASP.NET. Por ejemplo, lo siguiente es incorrecto:

<%=new TimeSpan(DateTime.Now.Ticks - new DateTime(2001, 1, 1).Ticks).Days;%>

El siguiente fragmento es correcto:

<%=new TimeSpan(DateTime.Now.Ticks - new DateTime(2001, 1, 1).Ticks).Days %>

Se interpreta así:

<% Response.Write(new TimeSpan(DateTime.Now.Ticks - new DateTime(2001, 1, 1).Ticks).Days);


%>

El ejemplo siguiente genera el error CS1026:

// CS1026.cs
#if (a == b // CS1026, add closing )
#endif

class x
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1027


Mensaje de error
Se esperaba la directiva #endif
#endif directive expected
No se encontró una directiva de preprocesador #endif coincidente para una directiva #if. O bien, puede que el compilador
haya encontrado una directiva #endregion sin que hubiera una directiva #region coincidente dentro de un bloque #if.
El código siguiente genera el error CS1027:

// CS1027.cs
#if true // CS1027, uncomment next line to resolve
// #endif

namespace x
{
public class clx
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1028


Mensaje de error
Directiva de preprocesador inesperada
Unexpected preprocessor directive
Se encontró una directiva de preprocesador pero no se esperaba.
Por ejemplo, se encontró una directiva #endif sin que hubiera otra #if precedente.
El código siguiente genera el error CS1028:

// CS1028.cs
#endif // CS1028, no matching #if
namespace x
{
public class clx
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1029


Mensaje de error
#error: 'texto'
#error: 'text'
Muestra el texto de un error definido mediante la directiva #error.
El código siguiente muestra cómo crear un error definido por el usuario:

// CS1029.cs
class Sample
{
static void Main()
{
#error Let's give an error here // CS1029
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1031


Mensaje de error
Se esperaba un tipo
Type expected
Se esperaba un parámetro de tipo.
Ejemplo
El código siguiente genera el error CS1031:

// CS1031.cs
namespace x
{
public class ii
{
}

public class a
{
public static operator +(a aa) // CS1031
// try the following line instead
// public static ii operator +(a aa)
{
return new ii();
}

public static void Main()


{
e = new base; // CS1031, not a type
e = new this; // CS1031, not a type
e = new (); // CS1031, not a type
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1032


Mensaje de error
No se puede definir o anular la definición de símbolos de preprocesador después del primer símbolo del archivo
Cannot define/undefine preprocessor symbols after first token in file
Las directivas de preprocesador #define y #undef deben utilizarse al principio de un programa, antes que cualquier otra
palabra clave, como las que se usan en la declaración de espacio de nombres.
El código siguiente genera el error CS1032:

// CS1032.cs
namespace x
{
public class clx
{
#define a // CS1032, put before namespace
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1033


Mensaje de error
Se ha excedido el límite del compilador: el archivo no puede tener más de 'número' líneas
Compiler limit exceeded: File cannot exceed 'number' lines
Un archivo de código fuente excedía el número máximo permitido de líneas que el compilador es capaz de procesar. Para
resolver este error, cree dos o más archivos de código fuente a partir del archivo original. El número máximo de líneas es
268.435.454. Si está utilizando /debug, el uso de más de 16.707.566 dañará la información de depuración.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1034


Mensaje de error
Se ha excedido el límite del compilador: una línea no puede tener más de 'número' caracteres
Compiler limit exceeded: Line cannot exceed 'number' characters
El límite de caracteres permitido en una línea es de 16.777.214.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1035


Mensaje de error
Se encontró el fin del archivo y se esperaba '*/'
End-of-file found, '*/' expected
Un delimitador de apertura de comentario no coincide con un delimitador de cierre.
El código siguiente genera el error CS1035:

// CS1035.cs
public class a
{
public static void Main()
{
}
}
/* // CS1035, needs closing comment
Referencia de Visual C#: errores y advertencias

Error del compilador CS1036


Mensaje de error
Se esperaba ( o .
( or . expected
El código XML de un comentario doc está mal formado.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1037


Mensaje de error
Se esperaba un operador sobrecargable
Overloadable operator expected
Al especificar un comentario mediante /doc, el compilador encontró un vínculo no válido.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1038


Mensaje de error
Se esperaba la directiva #endregion
#endregion directive expected
Una directiva #region no tiene una directiva #endregion coincidente.
El código siguiente genera el error CS1038:

// CS1038.cs
#region testing

public class clx


{
public static void Main()
{
}
}
// CS1038
// uncomment the next line to resolve
// #endregion
Referencia de Visual C#: errores y advertencias

Error del compilador CS1039


Mensaje de error
Literal de cadena no terminado
Unterminated string literal
El compilador detectó un literal de cadena mal formado.
Ejemplo
El código siguiente genera el error CS1039. Para resolver el error, agregue el carácter de comilla de cierre (").

// CS1039.cs
public class MyClass
{
public static void Main()
{
string b = @"hello, world; // CS1039
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1040


Mensaje de error
Las directivas de preprocesador deben ser el primer carácter de una línea que no sea un espacio en blanco
Preprocessor directives must appear as the first non-whitespace character on a line
Se encontró una directiva de preprocesador en una línea y no era el primer símbolo (token) de la línea. Una directiva debe ser
el primer símbolo de la línea.
El código siguiente genera el error CS1040:

// CS1040.cs
/* Define a symbol, X */ #define X // CS1040

// try the following two lines instead


// /* Define a symbol, X */
// #define X
public class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1041


Mensaje de error
Se esperaba un identificador y 'palabra clave' es una palabra clave
Identifier expected, 'keyword' is a keyword
Se halló una palabra reservada del lenguaje C# en el lugar en que se esperaba un identificador. Reemplace la palabra clave con
un identificador especificado por el usuario.
Ejemplo
El código siguiente genera el error CS1041:

// CS1041a.cs
class MyClass
{
public void f(int long) // CS1041
// Try the following instead:
// public void f(int i)
{
}

public static void Main()


{
}
}

Cuando realice una importación desde otro lenguaje de programación que no tenga el mismo conjunto de palabras
reservadas, puede modificar el identificador reservado con el prefijo @, como se muestra en el ejemplo siguiente.
Un identificador que lleve el prefijo @ se denomina identificador literal.

// CS1041b.cs
class MyClass
{
public void f(int long) // CS1041
// Try the following instead:
// public void f(int @long)
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1043


Mensaje de error
Se esperaba { o ;
{ or ; expected
Se declaró incorrectamente un descriptor de acceso de propiedad. Para obtener más información, vea
Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS1043.

// CS1043.cs
// compile with: /target:library
public class MyClass
{
public int DoSomething
{
get return 1; // CS1043
set {}
}

// OK
public int DoSomething2
{
get { return 1;}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1044


Mensaje de error
No se puede utilizar más de un tipo en una instrucción for, using, fixed o de declaración
Cannot use more than one type in a for, using, fixed, or declaration statement
El compilador encontró una instrucción no válida.
El código siguiente genera el error CS1044:

// CS1044.cs
using System;

public class MyClass : IDisposable


{
public void Dispose()
{
Console.WriteLine("Res1.Dispose()");
}

public static void Main()


{
using (MyClass mc1 = new MyClass(),
MyClass mc2 = new MyClass()) // CS1044, remove an instantiation
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1055


Mensaje de error
Se esperaba un descriptor de acceso add o remove
An add or remove accessor expected
Si un evento no está declarado como un campo, debe definir funciones de descriptor de acceso add y remove.
El código siguiente genera el error CS1055:

// CS1055.cs
delegate void del();
class Test
{
public event del MyEvent
{
int i; // CS1055
// uncomment accessors and delete previous line to resolve
// add
// {
// MyEvent += value;
// }
// remove
// {
// MyEvent -= value;
// }
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1056


Mensaje de error
Carácter 'carácter' inesperado
Unexpected character 'character'
El compilador de C# encontró un carácter inesperado y no puede identificar el símbolo (token) que se está procesando
actualmente. Por ejemplo, si el compilador encuentra un carácter de euro en la mitad del procesamiento de un identificador, no
podrá clasificar el identificador, puesto que un carácter de euro sólo sería válido dentro de una cadena, y el compilador sabe
que no está procesando una cadena.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1501


Mensaje de error
Ninguna sobrecarga para el método 'método' acepta 'número' argumentos
No overload for method 'method' takes 'number' arguments
Se hizo una llamada a un método de clase, pero no hay una forma del método que tome el número requerido de argumentos.
Puede producirse el error CS1501 si se llama a un método en una clase de un ensamblado al que se hace referencia y si dicho
método posee valores predeterminados en uno o más de sus parámetros. C# no permite crear métodos con un valor
predeterminado en un parámetro, pero puede que otro lenguaje con el que se desarrolle código para el motor en tiempo de
ejecución sí lo haga. Si un parámetro (perteneciente a un método de un ensamblado al que se hace referencia) posee un valor
predeterminado, se debe llamar al método y pasarle explícitamente todos los parámetros.
También puede ocurrir el error CS1501 al asignar memoria a un delegado; en ese caso también se debe especificar el nombre
del método que representa el delegado, como se muestra en el segundo ejemplo siguiente.
Igualmente aparece este error si se intenta crear instancias de una clase derivada a partir de una clase base que no tiene
ningún constructor predeterminado pero, sí un constructor no predeterminado que toma uno o varios argumentos. Para
corregir el error, proporcione un constructor predeterminado de la clase base o utilice la palabra clave base (Referencia de C#)
para llamar al constructor de clase base correspondiente, como se muestra en el tercer ejemplo siguiente. Para obtener más
información, vea Utilizar constructores (Guía de programación de C#).
Ejemplo
En el código siguiente se genera el error CS1501.

// CS1501.cs
public class a
{
// declare the following constructor to resolve this CS1501
/*
public a(int i)
{
}
*/

public static void Main()


{
a aa = new a(2); // CS1501
}
}

En el código siguiente se genera el error CS1501.

// CS1501a.cs
using System;

delegate string func(int i); // declare the delegate


class a
{
static func dt; // class member-field of the declared delegate type
public static void Main()
{
dt = new func(); // CS1501
// try the following line instead
// dt = new func(z); // this works
x(dt);
}

public static string z(int j)


{
Console.WriteLine(j);
return j.ToString();
}

public static void x(func hello)


{
hello(8);
}
}

En el código siguiente se genera el error CS1501.

// CS1501b.cs
class Base
{
public Base(string s)
{
}
}
class Derived : Base
{ // CS1501
public Derived(string s)
{
}
// Try this instead:
// public Derived(string s) : base(s)
// {
// }

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1502


Mensaje de error
La mejor coincidencia de método sobrecargado para 'declaración' tiene algunos argumentos no válidos
The best overloaded method match for 'declaration' has some invalid arguments
Este error tiene lugar cuando los tipos de los argumentos que se pasan al método no coinciden con los tipos de los parámetros
de ese método. Si el método al que se llama está sobrecargado, ninguna de las versiones sobrecargadas tiene una firma que
corresponda con los tipos de los argumentos que se pasan.
Para solucionar este problema, realice una de las acciones siguientes:
Compruebe los tipos de los argumentos que se pasan. Asegúrese de que corresponden con los argumentos del método
al que está llamando.
Si fuese necesario, convierta cualquier parámetro que no tenga correspondencia, mediante la clase System.Convert.
Si fuese necesario, convierta cualquier parámetro que no coincida de modo que se corresponda con el tipo que el
método está esperando.
Si fuese necesario, defina otra versión sobrecargada del método para que coincida con los tipos de los parámetros que
se están enviado.
El código siguiente genera el error CS1502:

// CS1502.cs
namespace x
{
public class a
{
public a(char i)
// try the following constructor instead
// public a(int i)
{
}

public static void Main()


{
a aa = new a(2222); // CS1502
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1503


Mensaje de error
Argumento 'arg': no se puede convertir de 'tipo1' a 'tipo2'
Argument 'arg': cannot convert from 'type1' to 'type2'
El tipo de un argumento de un método no coincide con el tipo que se pasó al crear la instancia de la clase.
Vea CS1502 para leer una explicación sobre cómo resolver este error.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1504


Mensaje de error
No se pudo abrir el archivo de código fuente 'archivo' ('causa')
Source file 'file' could not be opened ('reason')
El compilador no pudo abrir o leer un archivo de código fuente. Puede que el archivo esté bloqueado por otra aplicación, o que
haya algún problema con el sistema operativo. Este mensaje incluye la razón del sistema operativo por la que el compilador no
puede abrir ni leer el archivo.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1507


Mensaje de error
No se puede vincular el archivo de recursos 'archivo' al generar un módulo
Cannot link resource file 'file' when building a module
Se ha usado /linkresource en la misma compilación con /target:module, lo cual no está permitido. Por ejemplo, las siguientes
opciones darían como resultado el error CS1507:

csc /linkresource:rf.resource /target:module in.cs

Sin embargo, se permite la incrustación de recursos (/resource).


Referencia de Visual C#: errores y advertencias

Error del compilador CS1508


Mensaje de error
El identificador de recurso 'identificador' ya se ha utilizado en este ensamblado
Resource identifier 'identifier' has already been used in this assembly
En una compilación, se ha pasado el mismo identificador (identifier) a dos o más opciones del compilador /resource o
/linkresource.
Por ejemplo, las siguientes opciones darían como resultado el error CS1508:

/resource:anyfile.bmp,DuplicatIdent /linkresource:a.bmp,DuplicatIdent
Referencia de Visual C#: errores y advertencias

Error del compilador CS1509


Mensaje de error
El archivo 'archivo' al que se hace referencia no es un ensamblado; utilice la opción '/addmodule' en su lugar
Referenced file 'file' is not an assembly; use '/addmodule' option instead
Se especificó para /reference un archivo de resultados (archivo de resultados 1) producido en una compilación que utiliza
/target:module (no posee un manifiesto de ensamblado). Por ello, en lugar de anexar un ensamblado al ensamblado del
programa actual, se agregará la información de metadatos del archivo de resultados 1 al ensamblado del programa actual.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1510


Mensaje de error
Un argumento ref u out debe ser una variable asignable
A ref or out argument must be an assignable variable
Sólo se puede pasar una variable como parámetro ref en una llamada a un método. Utilizar un valor ref es similar a pasar un
puntero.
Ejemplo
El código siguiente genera el error CS1510:

// CS1510.cs
public class C
{
public static int j = 0;
public static void mf(ref int j)
{
j++;
}

public static void Main ()


{
mf (ref 2); // CS1510, can't pass a number as a ref parameter
// try the following to resolve the error
// mf (ref j);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1511


Mensaje de error
La palabra clave 'base' no está disponible en ningún método estático
Keyword 'base' is not available in a static method
La palabra clave base se utilizó en un método static. Sólo se puede llamar a base en un constructor de instancia, método de
instancia o descriptor de acceso de instancia.
Ejemplo
El código siguiente genera el error CS1511.

// CS1511.cs
// compile with: /target:library
public class A
{
public int j = 0;
}

class C : A
{
public void Method()
{
base.j = 3; // base allowed here
}

public static int StaticMethod()


{
base.j = 3; // CS1511
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1512


Mensaje de error
La palabra clave 'base' no está disponible en el contexto actual
Keyword 'base' is not available in the current context
Se encontró la palabra clave base fuera de un método, propiedad o constructor.
El ejemplo siguiente genera el error CS1512:

// CS1512.cs
using System;

class Base {}

class CMyClass : Base


{
private String xx = base.ToString(); // CS1512
// Try putting this initialization in the constructor instead:
// public CMyClass()
// {
// xx = base.ToString();
// }

public static void Main()


{
CMyClass z = new CMyClass();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1513


Mensaje de error
Se esperaba }
} expected
El compilador esperaba una llave de cierre (}) pero no la encontró.
El código siguiente genera el error CS1513:

// CS1513
namespace y // CS1513, no close curly brace
{
class x
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1514


Mensaje de error
Se esperaba {
{ expected
El compilador esperaba una llave de apertura ({) pero no la encontró.
El código siguiente genera el error CS1514:

// CS1514.cs
namespace x
// CS1514, no open curly brace
Referencia de Visual C#: errores y advertencias

Error del compilador CS1515


Mensaje de error
Se esperaba 'in'
'in' expected
En una instrucción foreach, in, falta la parte "in".
Ejemplo
El código siguiente genera el error CS1515:

using System;

class Driver
{
static void Main()
{
int[] arr = new int[] {1, 2, 3};

// try the following line instead


// foreach (int x in arr)
foreach (int x arr) // CS1515, "in" is missing
{
Console.WriteLine(x);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1517


Mensaje de error
Expresión de preprocesador no válida
Invalid preprocessor expression
El compilador detectó una expresión de preprocesador no válida.
Para obtener más información, vea Directivas de preprocesador.
El código siguiente muestra algunas expresiones de preprocesador válidas y no válidas:

// CS1517.cs
#if symbol // OK
#endif
#if !symbol // OK
#endif
#if (symbol) // OK
#endif
#if true // OK
#endif
#if false // OK
#endif
#if 1 // CS1517
#endif
#if ~symbol // CS1517
#endif
#if * // CS1517
#endif

class x
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1518


Mensaje de error
Se esperaba una clase, un delegado, una enumeración, una interfaz o una estructura
Expected class, delegate, enum, interface, or struct
Se encontró una declaración no compatible en un espacio de nombres. Dentro de un espacio de nombres, el compilador sólo
acepta clases, estructuras, enumeraciones, interfaces, espacios de nombres y delegados.
Ejemplo
El código siguiente genera el error CS1518:

// CS1518.cs
namespace x
{
sealed class c1 {}; // OK
namespace f2 {}; // OK
sealed f3 {}; // CS1518
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1519


Mensaje de error
El símbolo 'símbolo' no es válido en una clase, estructura o declaración de miembro de interfaz
Invalid token 'token' in class, struct, or interface member declaration
Cualquier clase, estructura o declaración de miembro de interfaz que contenga modificadores no válidos antes del tipo,
producirá este error. Para corregir el error, quite los modificadores no válidos.
El código siguiente genera el error CS1519:

// CS1519.cs
public class IMyInterface
{
checked void f4(); // CS1519
// Remove "checked" from the line above.
lock void f5(); // CS1519
// Remove "lock" from the line above
namespace; // CS1519
// The line above should be removed entirely.
int i; // OK
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1520


Mensaje de error
Una clase, una estructura o un método de interfaz debe tener un tipo de valor devuelto
Class, struct, or interface method must have a return type
Un método que se declara en una clase, estructura o interfaz debe tener un tipo de valor devuelto explícito.
El código siguiente genera el error CS1520:

// CS1520a.cs
public class x
{
f7() // CS1520, needs return type
// try the following definition
// void f7()
{
}

public static void Main()


{
}
}

Este error también puede producirse cuando el formato de mayúsculas y minúsculas del nombre de un constructor es
diferente del de la declaración de clase o estructura, como ocurre en el siguiente ejemplo:

// CS1520b.cs
public class Class1
{
public class1() // CS1520, incorrect case
{
}
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1521


Mensaje de error
Tipo base no válido
Invalid base type
Una especificación de clase base está mal formada.
El código siguiente genera el error CS1521:

// CS1521.cs
class CMyClass
{
public static void Main()
{
}
}

class CMyClass1 : CMyClass // OK


{
}

class CMyClass2 : CMyClass[] // CS1521


{
}

class CMyClass3 : CMyClass* // CS1521


{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1524


Mensaje de error
Se esperaba catch o finally
Expected catch or finally
Un bloque try debe estar seguido de un bloque catch o finally.
Para obtener más información sobre excepciones, vea Instrucciones para el control de excepciones (Referencia de C#).
Ejemplo
El código siguiente genera el error CS1524:

// CS1524.cs
class x
{
public static void Main()
{
try
{
// Code here
}
catch
{
}
try
{
// Code here
}
finally
{
}
try
{
// Code here
}
} // CS1524, missing catch or finally
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1525


Mensaje de error
El término de la expresión 'carácter' no es válido
Invalid expression term 'character'
El compilador detectó un carácter no válido en una expresión.
El código siguiente genera el error CS1525:

// CS1525.cs
class x
{
public static void Main()
{
int i = 0;
i = i + // OK - identifier
'c' + // OK - character
(5) + // OK - parenthesis
[ + // CS1525, operator not a valid expression element
throw + // CS1525, keyword not allowed in expression
void; // CS1525, void not allowed in expression
}
}

Una etiqueta vacía también puede producir CS1525, como ocurre en el siguiente ejemplo:

// CS1525b.cs
using System;
public class MyClass
{
public static void Main()
{
goto FoundIt;
FoundIt: // CS1525
// Uncomment the following line to resolve:
// System.Console.Write("Hello");
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1526


Mensaje de error
Una expresión new requiere () o [] detrás del tipo
A new expression requires () or [] after type
El operador new, empleado para asignar memoria dinámicamente para un objeto, no se especificó correctamente.
Ejemplo
El código siguiente muestra cómo utilizar new para asignar espacio a una matriz y a un objeto.

// CS1526.cs
public class y
{
public static int i = 0;
public int myi = 0;
}

public class z
{
public static void Main()
{
y py = new y; // CS1526
y[] aoys = new y[10]; // Array of Ys

for (int i = 0; i < aoys.Length; i++)


aoys[i] = new y(); // an object of type y
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1527


Mensaje de error
Los elementos de espacio de nombres no se pueden declarar explícitamente como private, protected o protected internal
Namespace elements cannot be explicitly declared as private, protected, or protected internal
Las declaraciones de tipo en un espacio de nombres pueden tener acceso public o internal. Si no se especifica accesibilidad,
internal es el valor predeterminado.
El código siguiente genera el error CS1527:

// CS1527.cs
namespace Sample
{
private class C1 {}; // CS1527
protected class C2 {}; // CS1527
protected internal class C3 {}; // CS1527
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1528


Mensaje de error
Se esperaba ; o = (no se puede especificar argumentos de constructor en la declaración)
Expected ; or = (cannot specify constructor arguments in declaration)
Se formó una referencia a una clase como si se estuviera creando un objeto a partir de la clase. Por ejemplo, hubo un intento
de pasar una variable a un constructor. Utilice el operador new para crear un objeto de una clase.
El código siguiente genera el error CS1528:

// CS1528.cs
using System;

public class B
{
public B(int i)
{
_i = i;
}

public void PrintB()


{
Console.WriteLine(_i);
}

private int _i;


}

public class mine


{
public static void Main()
{
B b(3); // CS1528, reference is not an object
// try one of the following
// B b;
// or
// B bb = new B(3);
// bb.PrintB();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1529


Mensaje de error
Una cláusula using debe preceder al resto de los elementos de espacio de nombres, con la excepción de las declaraciones de
alias externos
A using clause must precede all other namespace elements except extern alias declarations
Las cláusulas using deben aparecer en primer lugar en un espacio de nombres.
Ejemplo
El código siguiente genera el error CS1529:

// CS1529.cs
namespace X
{
namespace Subspace
{
using Microsoft;

class SomeClass
{
};

using Microsoft; // CS1529, place before class definition


}

using System.Reflection; // CS1529, place before namespace 'Subspace'


}

using System; // CS1529, place at the beginning of the file


Referencia de Visual C#: errores y advertencias

Error del compilador CS1530


Mensaje de error
No se permite el uso de la palabra clave new en elementos de espacio de nombres
Keyword new not allowed on namespace elements
No es necesario especificar la palabra clave new en ninguna construcción existente en un espacio de nombres.
El código siguiente genera el error CS1530:

// CS1530.cs
namespace a
{
new class i // CS1530
{
}

// try the following instead


class ii
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1534


Mensaje de error
El operador binario sobrecargado 'operador' toma dos parámetros
Overloaded binary operator 'operator' takes two parameters
La definición de un operador sobrecargable binario toma dos parámetros.
El código siguiente genera el error CS1534:

// CS1534.cs
class MyClass
{
public static MyClass operator - (MyClass MC1, MyClass MC2, MyClass MC3) // CS1534
// try the following line instead
// public static MyClass operator - (MyClass MC1, MyClass MC2)
{
return new MyClass();
}

public static int Main()


{
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1535


Mensaje de error
El operador unario sobrecargado 'operador' toma un parámetro
Overloaded unary operator 'operator' takes one parameter
La definición de un operador sobrecargable unario toma un parámetro.
Ejemplo
El código siguiente genera el error CS1535:

// CS1535.cs
class MyClass
{
// uncomment the method parameter to resolve CS1535
public static MyClass operator ++ (/*MyClass MC1*/) // CS1535
{
return new MyClass();
}

public static int Main()


{
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1536


Mensaje de error
El tipo de parámetro 'void' no es válido
Invalid parameter type void
No es necesario ni válido especificar un parámetro void que no sea un puntero void.
El código siguiente genera el error CS1536:

// CS1536.cs
class a
{
public static int x( void ) // CS1536
// try the following line instead
// public static int x()
{
return 0;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1537


Mensaje de error
El alias using 'alias' aparece previamente en este espacio de nombres
The using alias 'alias' appeared previously in this namespace
Se definió dos veces un símbolo como alias de un espacio de nombres. Un símbolo sólo puede definirse una vez.
El código siguiente genera el error CS1537:

// CS1537.cs
namespace x
{
using System;
using Object = System.Object;
using Object = System.Object; // CS1537, delete this line to resolve
using System = System;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1540


Mensaje de error
No se puede obtener acceso al miembro protegido 'miembro' mediante un calificador del tipo 'tipo1'; el calificador debe ser
del tipo 'tipo2' (o derivado de éste)
Cannot access protected member 'member' via a qualifier of type 'type1'; the qualifier must be of type 'type2' (or derived from
it)
Aunque una clase derivada puede tener acceso a miembros protegidos de su clase base, no puede hacerlo a través de una
instancia de la clase base.
El código siguiente genera el error CS1540:

// CS1540.cs
public class Base
{
protected void func()
{
}
}

public class Derived : Base


{
public static void test(Base anotherInstance)
// the method declaration could be changed as follows
// public static void test(Derived anotherInstance)
{
anotherInstance.func(); // CS1540
}
}

public class Tester : Derived


{
public static void Main()
{
Base pBase = new Base();
// the allocation could be changed as follows
// Derived pBase = new Derived();
test(pBase);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1541


Mensaje de error
Opción de referencia no válida: 'símbolo' - no puede hacer referencia a directorios
Invalid reference option: 'symbol' — cannot reference directories
El compilador detectó un intento de especificar un directorio en lugar de un archivo concreto. Por ejemplo, al usar la opción
/reference del compilador se debe especificar un archivo, no es posible especificar un directorio.
Por ejemplo, al pasar /reference:c:\ al compilador se generaría el error CS1541.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1542


Mensaje de error
No se puede agregar 'dll' a este ensamblado porque ya es un ensamblado; utilice la opción '/R' en su lugar
'dll' cannot be added to this assembly because it already is an assembly; use '/R' option instead
El archivo al que se hizo referencia con la opción /addmodule del compilador no se generó con /target:module; utilice
/reference para hacer referencia al archivo en esta compilación.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1545


Mensaje de error
El lenguaje no admite la propiedad, el indizador o el evento 'propiedad'; intente llamar directamente a los métodos de
descriptor de acceso 'descriptor de acceso set' o 'descriptor de acceso get'
Property, indexer, or event 'property' is not supported by the language; try directly calling accessor methods 'set accessor' or
'get accessor'
El código desarrollado utiliza un objeto que posee un indizador predeterminado e intenta usar la sintaxis indizada. Para
resolver este error, llame al método de descriptor de acceso get o set de la propiedad.
Ejemplo
// CPP1545.cpp
// compile with: /clr /LD
// a Visual C++ program
using namespace System;
public ref struct Employee {
Employee( String^ s, int d ) {}

property String^ name {


String^ get() {
return nullptr;
}
}
};

public ref struct Manager {


property Employee^ Report [String^] {
Employee^ get(String^ s) {
return nullptr;
}

void set(String^ s, Employee^ e) {}


}
};

El código siguiente genera el error CS1545.

// CS1545.cs
// compile with: /r:CPP1545.dll
class x {
public static void Main() {
Manager Ed = new Manager();
Employee Bob = new Employee("Bob Smith", 12);
Ed.Report( Bob.name ) = Bob; // CS1545
Ed.set_Report( Bob.name, Bob); // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1546


Mensaje de error
El lenguaje no admite la propiedad, el indizador o el evento 'propiedad'; intente llamar directamente al método de descriptor
de acceso 'descriptor de acceso'
Property, indexer, or event 'property' is not supported by the language; try directly calling accessor method 'accessor'
El código desarrollado utiliza un objeto que posee una propiedad indizada predeterminada e intenta usar la sintaxis indizada.
Para resolver este error, llame al método de descriptor de acceso de la propiedad. Para obtener más información sobre los
indizadores y las propiedades, vea Indizadores (Guía de programación de C#) y Definir y utilizar propiedades.
El código siguiente genera el error CS1546:
Ejemplo
Este código está formado por un archivo .cpp, que compila en una .dll y un archivo .cs, que utiliza esa .dll. El código siguiente es
para el archivo .dll. Define una propiedad a la que tendrá acceso el código del archivo .cs.

// CPP1546.cpp
// compile with: /clr /LD
using namespace System;
public ref class MCPP
{
public:
property int Prop [int,int]
{
int get( int i, int b )
{
return i;
}
}
};

Éste es el archivo de C#:

// CS1546.cs
// compile with: /r:CPP1546.dll
using System;
public class Test
{
public static void Main()
{
int i = 0;
MCPP mcpp = new MCPP();
i = mcpp.Prop(1,1); // CS1546
// Try the following line instead:
// i = mcpp.get_Prop(1,1);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1547


Mensaje de error
La palabra clave 'void' no se puede utilizar en este contexto
Keyword 'void' cannot be used in this context
El compilador detectó un uso no válido de la palabra clave void.
El código siguiente genera el error CS1547:

// CS1547.cs
public class MyClass
{
void BadMethod()
{
void i; // CS1547, cannot have variables of type void
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1548


Mensaje de error
Error criptográfico al firmar el ensamblado 'ensamblado' — 'causa'
Cryptographic failure while signing assembly 'assembly' — 'reason'
El error CS1548 aparece cuando se produce un error en la firma del ensamblado. Esto suele deberse a un nombre de archivo
de clave no válido, una ruta de acceso del archivo de clave no válida o un archivo de clave dañado.
Para firmar totalmente un ensamblado, debe proporcionar un archivo de clave válido que contenga información sobre las
claves públicas y privadas. Para retrasar la firma de un ensamblado, active la casilla de verificación Retrasar firma sólo y
proporcione un archivo de clave válido que contenga información sobre la clave pública. La clave privada no es necesaria
cuando un ensamblado se firma con retraso.
Para obtener más información, vea Cómo: Firmar un ensamblado (Visual Studio),
/keyfile (Especificar archivo clave con nombre seguro) (Opciones del compilador de C#) y
/delaysign (Retardar la firma del ensamblado) (Opciones del compilador de C#).
Cuando se crea un ensamblado, el compilador de C# llama a una utilidad denominada al.exe. Si se produce un error al crear el
ensamblado, al.exe indica su causa. Vea Errores y advertencias de la herramienta Al.exe y busque el tema correspondiente al
texto que el compilador muestra en 'causa'.
Vea también
Tareas
Cómo: Firmar un ensamblado (Visual Studio)
Referencia de Visual C#: errores y advertencias

Error del compilador CS1549


Mensaje de error
No se encuentra el servicio criptográfico adecuado
Appropriate cryptographic service not found
No hay instalado un proveedor de servicios criptográficos compatible con RSA.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1551


Mensaje de error
Los indizadores deben tener al menos un parámetro
Indexers must have at least one parameter
Se declaró un indizador que no toma argumentos.
El código siguiente genera el error CS1551:

// CS1551.cs
public class MyClass
{
int intI;

int this[] // CS1551


// try the following line instead
// int this[int i]
{
get
{
return intI;
}
set
{
intI = value;
}
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1552


Mensaje de error
El especificador de tipo de matriz, [], debe ir delante del nombre del parámetro
Array type specifier, [], must appear before parameter name
La posición del especificador de tipo de matriz es después del nombre de variable en la declaración de la matriz.
Ejemplo
El código siguiente genera el error CS1552:

// CS1552.cs
public class C
{
public static void Main(string args[]) // CS1552
// try the following line instead
// public static void Main(string [] args)
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1553


Mensaje de error
La declaración no es válida; en su lugar, utilice 'modificador operador <tipo de destino> (...'
Declaration is not valid; use 'modifier operator <dest-type> (...' instead
El tipo de valor devuelto de un operador debe preceder inmediatamente a la lista de parámetros, y el modificador es implicit
o explicit.
El código siguiente genera el error CS1553:

// CS1553.cs
class MyClass
{
public static int implicit operator (MyClass f) // CS1553
// try the following line instead
// public static implicit operator int (MyClass f)
{
return 6;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1554


Mensaje de error
La declaración no es válida; en su lugar, utilice '<tipo> operador op (...'
Declaration is not valid; use '<type> operator op (...' instead
El tipo de valor devuelto de un operador definido por el usuario debe aparecer antes del operador de palabra clave.
El código siguiente genera el error CS1554:

// CS1554.cs
class MyClass
{
public static operator ++ MyClass (MyClass f) // CS1554
// try the following line instead
// public static MyClass operator ++ (MyClass f)
{
return new MyClass ();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1555


Mensaje de error
No se encuentra la clase 'class' especificada para el método Main
Could not find 'class' specified for Main method
Se especificó una clase para la opción /main del compilador, pero no se encontró el nombre de la clase en el código fuente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1556


Mensaje de error
La construcción 'construcción' especificada para el método Main debe ser una clase o estructura válida
'construct' specified for Main method must be a valid class or struct
Se pasó a la opción /main del compilador un identificador que no es un nombre de clase.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1557


Mensaje de error
No se puede utilizar 'clase' para el método Main porque se encuentra en un archivo de resultados diferente
Cannot use 'class' for Main method because it is in a different output file
Se especificó la opción /main del compilador para un archivo de resultados en una compilación de archivos con múltiples
archivos de resultados. Sin embargo, no se encontró la clase en el código fuente de la compilación con /main, sino en un
archivo de código fuente correspondiente a uno de los demás archivos de resultados de la compilación.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1558


Mensaje de error
'clase' no tiene ningún método Main estático adecuado
'class' does not have a suitable static Main method
La opción /main del compilador especifica una clase en la que se ha de buscar un método Main. Sin embargo, no se definió el
método Main correctamente.
En el siguiente ejemplo se genera CS1558 debido al tipo de valor devuelto no válido.

// CS1558.cs
// compile with: /main:MyNamespace.MyClass

namespace MyNamespace
{
public class MyClass
{
public static float Main()
{
return 0.0; // CS1558 because the return type is a float.
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1559


Mensaje de error
'objeto' es importado y no se puede utilizar como punto de entrada para el programa 'programa'
'object' is imported and cannot be used as an entry point for program 'program'
Se especificó una clase no válida en la opción /main del compilador; no se puede usar la clase como ubicación para el método
Main.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1560


Mensaje de error
Nombre de archivo no válido especificado para la directiva del preprocesador. Nombre de archivo demasiado largo o no
válido.
Invalid filename specified for preprocessor directive. Filename is too long or not a valid filename
El nombre de archivo especificado en la opción #line (Referencia de C#) supera el valor de _MAX_PATH (256 caracteres), o la
línea donde se encuentra #line supera los 2.000 caracteres.
Ejemplo
El código siguiente genera el error CS1560.

// cs1560.cs
using System;
class MyClass
{
public static void Main()
{
Console.WriteLine("Normal line #1.");
#line 21 "MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile12345
67890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile
1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890.
txt" // CS1560
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1561


Mensaje de error
Nombre de archivo de resultados demasiado largo o no válido
Output filename is too long or invalid
El nombre del archivo de resultados no puede tener más de 256 caracteres. Además, no puede contener caracteres no válidos,
como el símbolo del euro, el signo de interrogación o la barra diagonal inversa, entre otros.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1562


Mensaje de error
Los resultados sin archivo de código fuente deben tener la opción /out especificada
Outputs without source must have the /out option specified
La compilación pudo crear un archivo de resultados, pero no hay un archivo de código fuente a partir del cual se pueda
deducir el nombre del archivo de resultados. Por ejemplo, puede que se esté intentando compilar un archivo que es sólo de
metadatos o de recursos.
Utilice la opción /out del compilador para especificar el nombre del archivo de resultados.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1563


Mensaje de error
La salida 'archivo de resultados' no tiene archivos de código fuente
Output 'output file' does not have any source files
Se especificó la opción /out del compilador, pero no va seguida de archivos de código fuente. Se debe evitar el uso de /out o
bien especificar los archivos de código fuente a continuación de /out.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1565


Mensaje de error
Se especificaron opciones incompatibles: archivo de recursos Win32; icono Win32
Conflicting options specified: Win32 resource file; Win32 icon
No es válido especificar tanto la opción /win32res del compilador como la opción /win32ico en la misma compilación.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1566


Mensaje de error
Error al leer el archivo de recursos 'archivo' — 'causa'
Error reading resource file 'file' — 'reason'
El compilador tuvo problemas con el nombre de archivo pasado a la opción /resource del compilador.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1567


Mensaje de error
Error al generar el recurso Win32: 'archivo'
Error generating Win32 resource: 'file'
La compilación utilizó la opción /win32icon del compilador o no usó /win32res, que hace que el compilador genere un archivo
con información de recursos, pero el compilador no pudo crear el archivo por falta de espacio en disco o por cualquier otro
motivo.
Si no es posible resolver el problema de generación de archivos, se debe utilizar /win32res, que no genera un archivo con
información de recursos.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1569


Mensaje de error
Error al generar el archivo de documentación XML 'Nombre_de_archivo' ('causa')
Error generating XML documentation file 'Filename' ('reason')
Al intentar escribir la documentación de XML en el archivo indicado en el mensaje, se ha producido un error por la causa
especificada. Esta causa puede ser, por ejemplo, "unidad de red no encontrada" o "acceso denegado". A menudo, la propia
causa sugiere lo que hay que hacer para corregir el error. Por ejemplo, si el error es "acceso denegado", deberá comprobar si
dispone de permiso para escribir en el archivo.
Ejemplo
// CS1569.cs
// compile with: /doc:CS1569.xml
// post-build command: attrib +r CS1569.xml
class Test
{
/// <summary>Test.</summary>
public static void Main() {}
}

El ejemplo anterior generó un archivo .xml que se estableció a continuación a sólo lectura. Este código de ejemplo intenta
escribir en el mismo archivo. El código siguiente genera el error CS1569.

// CS1569_a.cs
// compile with: /doc:CS1569.xml
// CS1569 expected
class Test
{
/// <summary>Test.</summary>
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1575


Mensaje de error
Una expresión stackalloc requiere [] después del tipo
A stackalloc expression requires [] after type
El tamaño de la asignación requerida, que tiene lugar con stackalloc, debe especificarse entre corchetes.
El código siguiente genera el error CS1575:

// CS1575.cs
// compile with: /unsafe
public class MyClass
{
unsafe public static void Main()
{
int *p = stackalloc int (30); // CS1575
// try the following line instead
// int *p = stackalloc int [30];
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1576


Mensaje de error
Falta el número de línea especificado para la directiva #line o no es válido
The line number specified for #line directive is missing or invalid
El compilador detectó un error en el valor pasado a la directiva #line.
El código siguiente genera el error CS1576:

// CS1576.cs
public class MyClass
{
static void Main()
{
#line "abc.sc" // CS1576
// try the following line instead
//#line 101 "abc.sc"
intt i; // error will be reported on line 101
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1577


Mensaje de error
Error al generar el ensamblado —
Assembly generation failed —
La parte de generación de ensamblado de la compilación ha dado un error. Consulte la documentación de errores de la
herramienta alink (Errores y advertencias de la herramienta Al.exe) para obtener más información.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1578


Mensaje de error
Se esperaba un nombre de archivo, un comentario de una línea o un carácter de fin de línea
Filename, single-line comment or end-of-line expected
Después de una directiva #line, sólo se permite un nombre de archivo (entre comillas) o un comentario de una sola línea.
El código siguiente genera el error CS1578:

// CS1578.cs
class MyClass
{
static void Main()
{
#line 101 abc.cs // CS1578
// try the following line instead
//#line 101 "abc.cs"
intt i; // error will be reported on line 101
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1579


Mensaje de error
La instrucción foreach no puede funcionar en variables de tipo 'tipo1' porque 'tipo2' no contiene ninguna definición pública
para 'identificador'
foreach statement cannot operate on variables of type 'type1' because 'type2' does not contain a public definition for
'identifier'
Para recorrer en iteración una colección utilizando la instrucción foreach, la colección debe cumplir los requisitos siguientes:
Debe ser una interfaz, clase o estructura.
Debe incluir un método GetEnumerator public que devuelva un tipo.
El tipo de valor devuelto debe contener una propiedad pública denominada Current y un método public denominado
MoveNext.
Para obtener más información, vea
Cómo: Obtener acceso a una clase de colección mediante Foreach (Guía de programación de C#).

Ejemplo
En este ejemplo, foreach no puede recorrer en iteración la colección porque no hay un método GetEnumerator public en
MyCollection.

El código siguiente genera el error CS1579.

// CS1579.cs
using System;
public class MyCollection
{
int[] items;
public MyCollection()
{
items = new int[5] {12, 44, 33, 2, 50};
}

// Delete the following line to resolve.


MyEnumerator GetEnumerator()

// Uncomment the following line to resolve:


// public MyEnumerator GetEnumerator()
{
return new MyEnumerator(this);
}

// Declare the enumerator class:


public class MyEnumerator
{
int nIndex;
MyCollection collection;
public MyEnumerator(MyCollection coll)
{
collection = coll;
nIndex = -1;
}
public bool MoveNext()
{
nIndex++;
return(nIndex < collection.items.GetLength(0));
}

public int Current


{
get
{
return(collection.items[nIndex]);
}
}
}
public static void Main()
{
MyCollection col = new MyCollection();
Console.WriteLine("Values in the collection are:");
foreach (int i in col) // CS1579
{
Console.WriteLine(i);
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1583


Mensaje de error
'archivo' no es un archivo de recursos Win32 válido
'file' is not a valid Win32 resource file
Se pasó un archivo a la opción /win32res del compilador que no es un archivo de recursos válido.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1585


Mensaje de error
El modificador de miembro 'palabra clave' debe ir delante del tipo y nombre de miembro
Member modifier 'keyword' must precede the member type and name
El especificador de acceso de una firma de método no figura en la ubicación correcta.
El código siguiente genera el error CS1585:

// CS1585.cs
public class Class1
{
public void static Main(string[] args) // CS1585
// try the following line instead
// public static void Main(string[] args)
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1586


Mensaje de error
La creación de matriz debe disponer de un tamaño de matriz o un inicializador de matriz
Array creation must have array size or array initializer
Se declaró incorrectamente una matriz.
El código siguiente genera el error CS1586:

// CS1586.cs
using System;
class MyClass
{
public static void Main()
{
int[] a = new int[]; // CS1586
// try the following line instead
int[] b = new int[5];
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1588


Mensaje de error
No se puede determinar el directorio de Common Language Runtime -- 'causa'
Cannot determine common language runtime directory -- 'reason'
El compilador no puede recuperar el directorio en el que está instalado el Common Language Runtime de .NET Framework.
Este error indica que Common Language Runtime no está correctamente instalado.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1593


Mensaje de error
El delegado 'del' no toma 'número' argumentos
Delegate 'del' does not take 'number' arguments
El número de argumentos pasados a una llamada de delegado no coincide con el número de parámetros de la declaración de
delegado.
El código siguiente genera el error CS1593:

// CS1593.cs
using System;
delegate string func(int i); // declare delegate

class a
{
public static void Main()
{
func dt = new func(z);
x(dt);
}

public static string z(int j)


{
Console.WriteLine(j);
return j.ToString();
}

public static void x(func hello)


{
hello(8, 9); // CS1593
// try the following line instead
// hello(8);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1594


Mensaje de error
El delegado 'delegado' tiene algunos argumentos no válidos
Delegate 'delegate' has some invalid arguments
El tipo de un argumento pasado a una llamada de delegado no coincide con el tipo del parámetro de la declaración de
delegado.
El código siguiente genera el error CS1594:

// CS1594.cs
using System;
delegate string func(int i); // declare delegate

class a
{
public static void Main()
{
func dt = new func(z);
x(dt);
}

public static string z(int j)


{
Console.WriteLine(j);
return j.ToString();
}

public static void x(func hello)


{
hello("8"); // CS1594
// try the following line instead
// hello(8);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1597


Mensaje de error
El punto y coma después del bloque de métodos o de descriptores de acceso no es válido
Semicolon after method or accessor block is not valid
No se requieren (o permiten) caracteres de punto y coma como final de un bloque de método o descriptor de acceso.
El código siguiente genera el error CS1597:

// CS1597.cs
class TestClass
{
public static void Main()
{
}; // CS1597, remove semicolon
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1599


Mensaje de error
El método o el delegado no pueden devolver el tipo 'tipo'
Method or delegate cannot return type 'type'
Algunos tipos de la biblioteca de la clase base, por ejemplo TypedReference y ArgIterator no pueden utilizarse como tipos de
valor devuelto.
El código siguiente genera el error CS1599:

// CS1599.cs
using System;

class MyClass
{
public static void Main()
{
}

public TypedReference Test1() // CS1599


{
return null;
}

public ArgIterator Test2() // CS1599


{
return null;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1600


Mensaje de error
Compilación cancelada por el usuario
Compilation cancelled by user
Se canceló una compilación con el compilador de C# al utilizar el entorno de desarrollo integrado de Visual Studio.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1601


Mensaje de error
El parámetro del método o del delegado no puede ser del tipo 'tipo'
Method or delegate parameter cannot be of type 'type'
Algunos tipos de la biblioteca de la clase base, por ejemplo TypedReference y ArgIterator no pueden utilizarse como tipos de
parámetros con la palabras clave ref u out.
El código siguiente genera el error CS1601:

// CS1601.cs
using System;

class MyClass
{
public void Test1 (ref TypedReference t) // CS1601
{
}

public void Test2 (out ArgIterator t) // CS1601


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1604


Mensaje de error
No se puede asignar a 'variable' porque es de sólo lectura
Cannot assign to 'variable' because it is read-only
Se realizó una asignación a una variable de sólo lectura. Para evitar este error, no asigne nada a esta variable ni intente
modificarla en este contexto.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1605


Mensaje de error
No se puede pasar 'var' como argumento ref o out porque es de sólo lectura
Cannot pass 'var' as a ref or out argument because it is read-only
Una variable pasada como parámetro ref o out suele modificarse en el método llamado. Por tanto, no se puede pasar un
parámetro de sólo lectura como ref o out.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1606


Mensaje de error
Error al firmar el ensamblado; puede que el resultado no esté firmado: causa
Assembly signing failed; output may not be signed -- reason
Se generó el ensamblado, pero cuando el compilador intentó terminar de firmarlo hubo un error.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1608


Mensaje de error
No se permite el atributo Required en tipos C#
The Required attribute is not permitted on C# types
No se permite el uso de RequiredAttributeAttribute en los tipos definidos en código de C#.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1609


Mensaje de error
No se pueden colocar modificadores en declaraciones de descriptores de acceso de eventos
Modifiers cannot be placed on event accessor declarations
Los modificadores sólo se pueden colocar en las declaraciones de los eventos, no en las de sus descriptores de acceso. Para
obtener más información, vea Utilizar propiedades (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS1609.

// CS1609.cs
// compile with: /target:library
delegate int Del();
class A
{
public event Del MyEvent
{
private add {} // CS1609
// try the following line instead
// add {}
remove {}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1611


Mensaje de error
El parámetro params no se puede declarar como out o ref
The params parameter cannot be declared as ref or out
Las palabras clave ref u out no pueden utilizarse con la palabra clave params.
El código siguiente genera el error CS1611:

// CS1611.cs
public class MyClass
{
public static void Test(params ref int[] a) // CS1611, remove ref
{
}

public static void Main()


{
Test(1);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1612


Mensaje de error
No se puede modificar el valor devuelto de 'expresión' porque no es una variable
Cannot modify the return value of 'expression' because it is not a variable
Se intentó modificar un tipo de valor que es el resultado de una expresión intermedia. Debido a que dicho valor no es
persistente, queda sin modificar.
Para resolver este error, almacene el resultado de la expresión en un valor intermedio o utilice un tipo de referencia para la
expresión intermedia.
Ejemplo
En el código siguiente se genera el error CS1612.

// CS1612.cs
public struct MyStruct
{
public int Width;
}

public class ListView


{
public MyStruct Size
{
get { return new MyStruct(); }
}
}

public class MyClass


{
public MyClass()
{
ListView lvi;
lvi = new ListView();
lvi.Size.Width = 33; // CS1612
// Use this instead:
// MyStruct temp = lvi.Size;
// temp.Width = 33;
}

public static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1613


Mensaje de error
No se puede encontrar la clase contenedora de la coclase administrada 'clase' para la interfaz 'interfaz' (¿falta una referencia de
ensamblado?)
The managed coclass wrapper class 'class' for interface 'interface' cannot be found (are you missing an assembly reference?)
Se intentó crear una instancia de un objeto COM a partir de una interfaz. La interfaz tiene los atributos ComImport y CoClass,
pero el compilador no encuentra el tipo dado para el atributo CoClass.
Para solucionar este error, pruebe una de las siguientes opciones:
Agregue una referencia al ensamblado que tiene la coclase (en la mayoría de ocasiones, la interfaz y la coclase se
encontrarán en el mismo ensamblado). Vea /reference o Agregar referencia (Cuadro de diálogo) para obtener más
información.
Corrija el atributo CoClass en la interfaz.
En el siguiente ejemplo se muestra el uso correcto de CoClassAttribute:

// CS1613.cs
using System;
using System.Runtime.InteropServices;

[Guid("1FFD7840-E82D-4268-875C-80A160C23296")]
[ComImport()]
[CoClass(typeof(A))]
public interface IA{}
public class A : IA {}

public class AA
{
public static void Main()
{
IA i;
i = new IA(); // This is equivalent to new A().
// because of the CoClass attribute on IA
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1614


Mensaje de error
'atributo' es ambiguo; use '@atributo' o 'atributoAttribute'
'attribute' is ambiguous; use either '@attribute' or 'attributeAttribute'
El compilador ha encontrado una especificación de atributo ambigua.
Por comodidad, al compilador de C# le basta con que especifique ExampleAttribute sólo como [Example]. Sin embargo,
aparece una ambigüedad si una clase de atributo denominada Example existe junto a otra llamada ExampleAttribute,
porque el compilador no puede decidir si [Example] se refiere al atributo Example o al ExampleAttribute. Para aclararlo,
utilice [@Example] para el atributo Example y [ExampleAttribute] para ExampleAttribute.
El código siguiente genera el error CS1614:

// CS1614.cs
using System;

// Both of the following classes are valid attributes with valid


// names (MySpecial and MySpecialAttribute). However, because the lookup
// rules for attributes involves auto-appending the 'Attribute' suffix
// to the identifier, these two attributes become ambiguous; that is,
// if you specify MySpecial, the compiler can't tell if you want
// MySpecial or MySpecialAttribute.

public class MySpecial : Attribute {


public MySpecial() {}
}

public class MySpecialAttribute : Attribute {


public MySpecialAttribute() {}
}

class MakeAWarning {
[MySpecial()] // CS1614
// Ambiguous: MySpecial or MySpecialAttribute?
public static void Main() {
}
[@MySpecial()] // This isn't ambiguous, it binds to the first attribute above.
public static void NoWarning() {
}
[MySpecialAttribute()] // This isn't ambiguous, it binds to the second attribute above.
public static void NoWarning2() {
}
[@MySpecialAttribute()] // This is also legal.
public static void NoWarning3() {
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1615


Mensaje de error
El argumento 'number' no se debe pasar con la palabra clave 'palabra clave'
Argument 'number' should not be passed with the 'keyword' keyword
Se ha utilizado una de las palabras clave ref u out pero la función no utiliza el parámetro ref o out para ese argumento. Para
corregir este error, quite la palabra clave incorrecta y utilice la palabra clave correcta correspondiente a la declaración de
función, si existe.
El código siguiente genera el error CS1615:

// CS1615.cs
class C
{
public void f(int i) {}
public static void Main()
{
int i = 1;
f(ref i); // CS1615
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1617


Mensaje de error
Opción no válida 'opción' para /langversion; debe ser ISO-1 o Default
Invalid option 'option' for /langversion; must be ISO-1 or Default
Este error aparece si ha utilizado el modificador de la línea de comandos /langversion o la configuración del proyecto pero no
ha especificado una opción de lenguaje válida. Para resolver este error, compruebe la sintaxis de la línea de comandos o la
configuración del proyecto, y cámbiela a una de las opciones enumeradas.
Por ejemplo, al compilar concsc /langversion:ISO se genera el error CS1617.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1618


Mensaje de error
No se puede crear un delegado con 'método' porque tiene un atributo Conditional
Cannot create delegate with 'method' because it has a Conditional attribute
No puede crear un delegado con un método condicional porque el método puede que no exista en alguna generación.
El código siguiente genera el error CS1618:

// CS1618.cs
using System;
using System.Diagnostics;

delegate void del();

class MakeAnError {
public static void Main() {
del d = new del(ConditionalMethod); // CS1618
// Invalid because on builds where DEBUG is not set,
// there will be no "ConditionalMethod".
}
// To fix the error, remove the next line:
[Conditional("DEBUG")]
public static void ConditionalMethod()
{
Console.WriteLine("Do something only in debug");
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1619


Mensaje de error
No se puede crear el archivo temporal 'nombredearchivo'. Razón:
Cannot create temporary file 'filename' -- reason
El compilador no pudo crear un archivo temporal por la razón dada (por ejemplo, el disco está lleno).
Referencia de Visual C#: errores y advertencias

Error del compilador CS1620


Mensaje de error
El argumento 'number' se debe pasar con la palabra clave 'palabra clave'
Argument 'number' must be passed with the 'keyword' keyword
Este error se produce cuando se pasa un argumento a una función que utiliza un parámetro ref o out y no se incluye la palabra
clave ref u out en el punto de llamada, o bien se incluye una palabra clave incorrecta. El texto del error indica la palabra clave
que se debe usar y el argumento que ha provocado el error.
El código siguiente genera el error CS1620:

// CS1620.cs
class C
{
void f(ref int i) {}
public static void Main()
{
int x = 1;
f(out x); // CS1620 – f takes a ref parameter, not an out parameter
// Try this line instead:
// f(ref x);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1621


Mensaje de error
La instrucción yield no se puede utilizar dentro de bloques de método anónimo
The yield statement can not be used inside anonymous method blocks
La instrucción yield no puede estar en un bloque de método anónimo de un iterador.
Ejemplo
El código siguiente genera el error CS1621:

// CS1621.cs

using System.Collections;

delegate object MyDelegate();

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
MyDelegate d = delegate
{
yield return this; // CS1621
return this;
};
d();
// Try this instead:
// MyDelegate d = delegate { return this; };
// yield return d();
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1622


Mensaje de error
No se puede devolver un valor a partir de un iterador. Utilice la instrucción yield return para devolver un valor o yield break
para terminar la iteración.
Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration.
Un elemento de iteración es una función especial que devuelve un valor a través de la instrucción yield en lugar de la
instrucción return. Para obtener más información, vea elementos de iteración.
El código siguiente genera el error CS1622:

// CS1622.cs
// compile with: /target:library
using System.Collections;

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
return (IEnumerator) this; // CS1622
yield return this; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1623


Mensaje de error
Los elementos de iteración no pueden tener parámetros ref ni out
Iterators cannot have ref or out parameters
Este error aparece si un método iterador toma un parámetro ref o out. Para evitar este error, quite la palabra clave ref o out
de la firma del método.
Ejemplo
En el código siguiente se genera el error CS1623:

// CS1623.cs
using System.Collections;

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
yield return 0;
}

// To resolve the error, remove ref


public IEnumerator GetEnumerator(ref int i) // CS1623
{
yield return i;
}

// To resolve the error, remove out


public IEnumerator GetEnumerator(out float f) // CS1623
{
f = 0.0F;
yield return f;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1624


Mensaje de error
El cuerpo de 'descriptor de acceso' no puede ser un bloque de iteradores porque 'tipo' no es un tipo de interfaz de iteradores
The body of 'accessor' cannot be an iterator block because 'type' is not an iterator interface type
Este error aparece si se utiliza un descriptor de acceso de iterador pero el tipo de valor devuelto no es ninguno de los tipos de
interfaz de iterador: IEnumerable, IEnumerable, IEnumerator, IEnumerator. Para evitar este error, utilice uno de los tipos de
interfaz de iterador como tipo de valor devuelto.
Ejemplo
En el código siguiente se genera el error CS1624:

// CS1624.cs
using System;
using System.Collections;

class C
{
public int Iterator
// Try this instead:
// public IEnumerable Iterator
{
get // CS1624
{
yield return 1;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1625


Mensaje de error
No se pueden proporcionar resultados en el cuerpo de una cláusula finally
Cannot yield in the body of a finally clause
En el texto de una cláusula finally no se permite una instrucción yield. Para evitar este error, ponga la instrucción yield fuera de
la cláusula finally.
El código siguiente genera el error CS1625:

// CS1625.cs
using System.Collections;

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
try
{
}
finally
{
yield return this; // CS1625
}
}
}

public class CMain


{
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1626


Mensaje de error
No se puede proporcionar un valor en el cuerpo de un bloque try con una cláusula catch
Cannot yield a value in the body of a try block with a catch clause
No se permite incluir una instrucción yield en un bloque try si hay una cláusula catch asociada a él. Para evitar este error,
ponga la instrucción yield fuera de la cláusula catch.
El código siguiente genera el error CS1626:

// CS1626.cs
using System.Collections;

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
try
{
yield return this; // CS1626
}
catch
{

}
}
}

public class CMain


{
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1627


Mensaje de error
Se esperaba una expresión tras la instrucción yield return
Expression expected after yield return
Este error se produce si se utiliza yield sin una expresión. Para evitarlo, inserte la expresión apropiada en la instrucción.
El código siguiente genera el error CS1627:

// CS1627.cs
using System.Collections;

class C : IEnumerable
{
public IEnumerator GetEnumerator()
{
yield return; // CS1627
// To resolve, add the following line:
// yield return 0;
}
}

public class CMain


{
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1628


Mensaje de error
No se pueden utilizar los parámetros ref ni out 'parámetro' dentro de un bloque de método anónimo
Cannot use ref or out parameter 'parameter' inside an anonymous method block
Este error se produce si se utiliza un parámetro ref u out dentro de un bloque de métodos anónimos. Para evitarlo, utilice una
variable local o alguna otra construcción.
El código siguiente genera el error CS1628:

// CS1628.cs

delegate int MyDelegate();

class C
{
public static void F(ref int i)
{
MyDelegate d = delegate { return i; }; // CS1628
// Try this instead:
// int tmp = i;
// MyDelegate d = delegate { return tmp; };
}

public static void Main()


{

}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1629


Mensaje de error
No puede aparecer código no seguro en iteradores
Unsafe code may not appear in iterators
La especificación del lenguaje C# no permite código no seguro en los iteradores.
En el siguiente código se genera el error CS1629:

// CS1629.cs
// compile with: /unsafe
using System.Collections.Generic;
class C
{
IEnumerator<int> IteratorMeth() {
int i;
unsafe // CS1629
{
int *p = &i;
yield return *p;
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1630


Mensaje de error
Opción 'opción' no válida para /errorreport; debe ser prompt, send, queue o none
Invalid option 'option' for /errorreport; must be prompt, send, queue, or none
prompt, send, queue o none deben aparecer detrás de la opción de línea de comandos /errorreport, para especificar la
acción que se deberá realizar cuando se produzca un error de compilador interno.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1631


Mensaje de error
No se puede proporcionar ningún valor en el texto de una cláusula catch
Cannot yield a value in the body of a catch clause
No se permite la instrucción yield en el cuerpo de una cláusula catch. Para evitar este error, mueva la instrucción yield fuera del
cuerpo de la cláusula catch.
En el código siguiente se genera el error CS1631:

// CS1631.cs
using System;
using System.Collections;

public class C : IEnumerable


{
public IEnumerator GetEnumerator()
{
try
{
}
catch(Exception e)
{
yield return this; // CS1631
}
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1632


Mensaje de error
El control no puede abandonar el cuerpo de un método anónimo
Control cannot leave the body of an anonymous method
Este error aparece si una instrucción de salto (break, goto, continue, etc.) intenta trasladar el control fuera de un bloque de
métodos anónimos. Un bloque de métodos anónimos es un cuerpo de función y sólo se puede salir del mismo por medio de
una instrucción return o llegando al fin del bloque.
En el código siguiente se genera el error CS1632:

// CS1632.cs
// compile with: /target:library
delegate void MyDelegate();
class MyClass
{
public void Test()
{
for (int i = 0 ; i < 5 ; i++)
{
MyDelegate d = delegate {
break; // CS1632
};
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1637


Mensaje de error
Los elementos de iteración no pueden tener parámetros no seguros unsafe o tipos yield
Iterators cannot have unsafe parameters or yield types
Compruebe la lista de argumentos del iterador y el tipo de cualquier instrucción yield para comprobar que no está utilizando
ningún tipo no seguro.
Ejemplo
En el código siguiente se genera el error CS1637:

// CS1637.cs
// compile with: /unsafe
using System.Collections;

public unsafe class C


{
public IEnumerator Iterator1(int* p) // CS1637
{
yield return null;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1638


Mensaje de error
'identificador' es un identificador reservado y no se puede utilizar cuando se usa el modo de versión de lenguaje ISO
'identifier' is a reserved identifier and cannot be used when ISO language version mode is used
Cuando el modificador de compilador /langversion especifica la opción de compatibilidad con el lenguaje ISO, cualquier
identificador que contenga caracteres de subrayado doble en cualquier punto generará este error. Para evitarlo, elimine todos
los identificadores con caracteres de subrayado doble o no utilice la opción de versión de lenguaje ISO-1.
Ejemplo
El código siguiente genera el error CS1638:

// CS1638.cs
// compile with: /langversion:ISO-1
class bad__identifer // CS1638 (double underscores are not ISO compliant)
{
}

// Try this instead:


//class GoodIdentifier
//{
//}

class CMain
{
public static void Main() { }
}

Vea también
Referencia
/langversion (Sintaxis compatible) (Opciones del compilador de C#)
Referencia de Visual C#: errores y advertencias

Error del compilador CS1639


Mensaje de error
La firma de la clase contenedora de coclases administradas 'firma' para la interfaz 'interfaz' no es una firma de nombre de
clase válida
The managed coclass wrapper class signature 'signature' for interface 'interface' is not a valid class name signature
Este error aparece si los metadatos de la interfaz son no válidos. Nunca debe aparecer si la interfaz se ha generado empleando
C# o un lenguaje .NET compatible. Consulte al proveedor de la interfaz o compruebe que el ensamblado de la interfaz se ha
generado correctamente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1640


Mensaje de error
La instrucción foreach no puede funcionar en variables de tipo 'tipo' porque implementa varias creaciones de instancias de
'interfaz', intente convertir en una creación de instancia de interfaz específica
foreach statement cannot operate on variables of type 'type' because it implements multiple instantiations of 'interface', try
casting to a specific interface instantiation
El tipo hereda de dos o más instancias de IEnumerator<T>. Esto significa que no hay una enumeración única del tipo utilizable
por foreach. Especifique el tipo de IEnumerator<T> o utilice otra construcción de bucle.
Ejemplo
El código siguiente genera el error CS1640:

// CS1640.cs

using System;
using System.Collections;
using System.Collections.Generic;

public class C : IEnumerable, IEnumerable<int>, IEnumerable<string>


{
IEnumerator<int> IEnumerable<int>.GetEnumerator()
{
yield break;
}

IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
yield break;
}

IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)((IEnumerable<string>)this).GetEnumerator();
}
}
public class Test
{
public static int Main()
{
foreach (int i in new C()){} // CS1640
// Try specifing the type of IEnumerable<T>
// foreach (int i in (IEnumerable<int>)new C()){}
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1641


Mensaje de error
Un campo de búfer de tamaño fijo debe tener el especificador de tamaño de matriz detrás del nombre de campo
A fixed size buffer field must have the array size specifier after the field name
A diferencia de las matrices normales, los búferes de tamaño fijo exigen que se especifique un tamaño constante en el punto
de declaración. Para resolver este error, agregue un literal entero positivo o un entero positivo constante y coloque los
corchetes después del identificador.
En el código siguiente se genera el error CS1641:

// CS1641.cs
// compile with: /unsafe /target:library
unsafe struct S {
fixed int [] a; // CS1641
// OK
fixed int b [10];
const int c = 10;
fixed int d [c];
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1642


Mensaje de error
Los campos de búfer de tamaño fijo sólo pueden ser miembros de struct.
Fixed size buffer fields may only be members of structs.
Este error se produce cuando se utiliza un campo de tamaño fijo en una class, en lugar de una struct. Para resolverlo, cambie
la class por unastruct o declare el campo como una matriz ordinaria.
Ejemplo
El código siguiente genera el error CS1642.

// CS1642.cs
// compile with: /unsafe /target:library
unsafe class C
{
fixed int a[10]; // CS1642
}

unsafe struct D
{
fixed int a[10];
}

unsafe class E
{
public int[] a = null;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1643


Mensaje de error
Método anónimo de tipo 'tipo': no todas las rutas de acceso de código devuelven un valor
Anonymous method of type 'type': not all code paths return a value
Este error se produce si un cuerpo de delegado no tiene una instrucción return, o tiene una instrucción return que el
compilador no puede comprobar si se alcanzará. En el ejemplo siguiente, el compilador no intenta predecir el resultado de la
condición de la bifurcación para comprobar si el bloque de métodos anónimos siempre devuelve un valor.
Ejemplo
El código siguiente genera el error CS1643:

// CS1643.cs
delegate int MyDelegate();
class C
{
static void Main()
{
MyDelegate d = delegate
{ // CS1643
int i = 0;
if (i == 0)
return 1;
};
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1644


Mensaje de error
No se puede utilizar la característica 'característica' porque no forma parte de la especificación de lenguaje C# ISO normalizado
Feature 'feature' cannot be used because it is not part of the standardized ISO C# language specification
Este error aparece si ha especificado la opción /langversion ISO-1 y el código que está compilando utiliza características que
no forman parte de la norma ISO 1.0. Para resolver este error, no utilice ninguna de las nuevas características del compilador
de C# con la opción de compatibilidad ISO-1. Vea Lo nuevo en el lenguaje y el compilador de C# 2.0 para obtener una lista de
las nuevas características del compilador de C#.
En el código siguiente se genera el error CS1644:

// CS1644.cs
// compile with: /langversion:ISO-1 /target:library
class C<T> {} // CS1644
Referencia de Visual C#: errores y advertencias

Error del compilador CS1646


Mensaje de error
Se esperaba una palabra clave, un identificador o una cadena detrás del especificador textual: @
Keyword, identifier, or string expected after verbatim specifier: @
Vea los literales de cadena para saber cómo se utiliza el especificador textual '@'. El especificador textual sólo se permite antes
de una cadena, una palabra clave o un identificador. Para resolver este error, quite el símbolo @ de cualquier lugar incorrecto o
agregue la cadena, la palabra clave o el identificador que corresponda.
El código siguiente genera el error CS1646:

// CS1646
class C
{
int i = @5; // CS1646
// Try this line instead:
// int i = 5;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1647


Mensaje de error
Una expresión es demasiado larga o compleja para compilar cerca de 'código'
An expression is too long or complex to compile near 'code'
Se produjo un desbordamiento de la pila en el compilador que procesa el código. Para resolver este error, simplifique el
código. Si el código es válido, póngase en contacto con Soporte técnico.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1648


Mensaje de error
Los miembros del campo de sólo lectura 'identificador' no se pueden modificar (excepto en un constructor o en un
inicializador de variables)
Members of readonly field 'identifier' cannot be modified (except in a constructor or a variable initializer)
Este error se produce cuando se intenta modificar un miembro de un campo de sólo lectura que no admite modificaciones.
Para resolverlo, limite las asignaciones a campos de sólo lectura al constructor o el inicializador de variables, o bien quite la
palabra clave readonly de la declaración del campo.
El código siguiente genera el error CS1648:

// CS1648.cs
public struct Inner
{
public int i;
}

class Outer
{
public readonly Inner inner = new Inner();
}

class D
{
static void Main()
{
Outer outer = new Outer();
outer.inner.i = 1; // CS1648
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1649


Mensaje de error
Los miembros del campo de sólo lectura 'identificador' no se pueden pasar como out o ref (excepto en un constructor)
Members of readonly field 'identifier' cannot be passed ref or out (except in a constructor)
Este error se produce cuando se pasa una variable a una función que es miembro de un campo readonly como argumento ref
o out. Esto no se permite porque la función puede modificar los parámetros ref o out. Para resolver este error, quite la palabra
clave readonly del campo o no pase los miembros del campo readonly a la función. Por ejemplo, puede intentar crear una
variable temporal que se pueda modificar y pasarla como argumento ref, como se muestra en el ejemplo siguiente.
Ejemplo
El código siguiente genera el error CS1649:

// CS1649.cs
public struct Inner
{
public int i;
}

class Outer
{
public readonly Inner inner = new Inner();
}

class D
{
static void f(ref int iref)
{
}

static void Main()


{
Outer outer = new Outer();
f(ref outer.inner.i); // CS1649
// Try this code instead:
// int tmp = outer.inner.i;
// f(ref tmp);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1650


Mensaje de error
Los campos del campo de sólo lectura estático 'identificador' no se pueden asignar (excepto en un constructor estático o un
inicializador de variable)
Fields of static readonly field 'identifier' cannot be assigned to (except in a static constructor or a variable initializer)
Este error se produce cuando se intenta modificar un miembro de un campo estático de sólo lectura que no admite
modificaciones. Para resolverlo, limite las asignaciones a campos de sólo lectura al constructor o el inicializador de variables, o
bien quite la palabra clave readonly de la declaración del campo.

// CS1650.cs
public struct Inner
{
public int i;
}

class Outer
{
public static readonly Inner inner = new Inner();
}

class D
{
static void Main()
{
Outer.inner.i = 1; // CS1650
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1651


Mensaje de error
Los campos del campo de sólo lectura estático 'identificador' no se pueden pasar como ref o out (excepto en un constructor
estático)
Fields of static readonly field 'identifier' cannot be passed ref or out (except in a static constructor)
Este error aparece si pasa una variable a una función que es miembro de un campo de sólo lectura estático como argumento
ref. Puesto que la función puede modificar los parámetros ref, no se permite esto. Para resolver este error, quite la palabra
clave readonly del campo o no pase los miembros del campo de sólo lectura a la función. Por ejemplo, pruebe a crear una
variable temporal que se pueda modificar y pásela como un argumento ref, como se muestra en el siguiente ejemplo.
En el código siguiente se genera el error CS1651:

// CS1651.cs
public struct Inner
{
public int i;
}

class Outer
{
public static readonly Inner inner = new Inner();
}

class D
{
static void f(ref int iref)
{
}

static void Main()


{
f(ref Outer.inner.i); // CS1651
// Try this instead:
// int tmp = Outer.inner.i;
// f(ref tmp);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1652


Mensaje de error
No se pueden modificar los miembros de 'identificador' porque es de sólo lectura
Cannot modify members of 'identifier' because it is read-only
Este error aparece cuando intenta modificar miembros de una variable que es de sólo lectura debido a su contexto.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1653


Mensaje de error
No se pueden pasar los campos de 'identificador' como argumento out o ref porque es de sólo lectura
Cannot pass fields of 'identifier' as a ref or out argument because it is read-only
Este error se produce cuando una variable es de sólo lectura debido a su contexto y se intenta pasar miembros de ella como
parámetros ref o out.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1654


Mensaje de error
No se pueden modificar los miembros de 'variable' porque es 'tipo de variable de sólo lectura'
Cannot modify members of 'variable' because it is a 'read-only variable type'
Este error se produce cuando se intenta modificar miembros de una variable que es de sólo lectura por encontrarse en una
construcción especial.
Ejemplo
El siguiente ejemplo genera el error CS1654.

// CS1654.cs
using System;
using System.Collections;

public struct Test : IEnumerable


{
private int index;
public int Index
{
get { return index; }
set { index = value; }
}

public IEnumerator GetEnumerator()


{
for(int i = 0; i< 10; i++)
yield return this;
yield break;
}
}

public class Repro


{
static int Main()
{
int i = 0;
Test t = new Test();
foreach (Test tt in t)
{
tt.Index = i++; // CS1654
}
return 1;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1655


Mensaje de error
No se pueden pasar los campos de 'variable' como argumento out o ref porque es un 'tipo de variable de sólo lectura'
Cannot pass fields of 'variable' as a ref or out argument because it is a 'readonly variable type'
Este error se produce cuando se intenta pasar un miembro de una variable foreach, using o fixed a una función como
argumento ref u out. No se permite hacerlo porque estas variables se consideran de sólo lectura en estos contextos.
El código siguiente genera el error CS1655:

// CS1655.cs
struct S
{
public int i;
}

class CMain
{
static void f(ref int iref)
{
}

public static void Main()


{
S[] sa = new S[10];
foreach(S s in sa)
{
CMain.f(ref s.i); // CS1655
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1656


Mensaje de error
No se puede asignar a 'variable' porque es 'tipo de variable de sólo lectura'
Cannot assign to 'variable' because it is a 'read-only variable type'
Este error aparece cuando se produce una asignación a una variable en un contexto de sólo lectura. Entre los contextos de sólo
lectura se incluyen las variables de iteración foreach, las variables using y las variables fixed. Para resolver este error, evite las
asignaciones a una variable de instrucción en bloques using, instrucciones foreach e instrucciones fixed.
Ejemplo
En el código siguiente se genera el error CS1656:

// CS1656.cs
// compile with: /unsafe
using System;

class C : IDisposable
{
public void Dispose() { }
}

class CMain
{
unsafe public static void Main()
{
using (C c = new C())
{
c = new C(); // CS1656
}

foreach (object o in new string[] { "1", "2" })


{
o = "10"; // CS1656
}

int[] ary = new int[] { 1, 2, 3, 4 };


fixed (int* p = ary)
{
p = null; // CS1656
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1657


Mensaje de error
No se puede pasar 'variable' como argumento out o ref porque es un 'tipo de variable de sólo lectura'
Cannot pass 'variable' as a ref or out argument because it a 'readonly variable type'
Este error se produce cuando se pasa una variable como argumento ref o out en un contexto en el que esa variable es de sólo
lectura. Los contextos de sólo lectura incluyen las variables de iteración foreach, las variables using y las variables fixed. Para
resolver este error, no llame a funciones que utilicen la variable foreach, using o fixed como un parámetro ref o out en
bloques using, instrucciones foreach e instrucciones fixed.
Ejemplo
El código siguiente genera el error CS1657:

// CS1657.cs
using System;
class C : IDisposable
{
public int i;
public void Dispose() {}
}

class CMain
{
static void f(ref C c)
{
}
static void Main()
{
using (C c = new C())
{
f(ref c); // CS1657
}
}
}

El código siguiente ilustra el mismo problema en una instrucción fixed:

// CS1657b.cs
// compile with: /unsafe
unsafe class C
{
static void F(ref int* p)
{
}

static void Main()


{
int[] a = new int[5];
fixed(int* p = a) F(ref p); // CS1657
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1660


Mensaje de error
No se puede convertir el bloque de método anónimo en el tipo 'tipo' porque no es un tipo delegado
Cannot convert anonymous method block to type 'type' because it is not a delegate type
Este error aparece si intenta asignar o convertir un bloque de métodos anónimos en un tipo que no es un tipo delegado.
En el código siguiente se genera el error CS0160:

// CS1660.cs
delegate int MyDelegate();
class C {
static void Main()
{
int i = delegate { return 1; }; // CS1660
// Try this instead:
// MyDelegate myDelegate = delegate { return 1; };
// int i = myDelegate();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1661


Mensaje de error
No se puede convertir ningún bloque de método anónimo en tipo delegado 'tipo delegado' porque los tipos de parámetros del
bloque especificado no coinciden con los tipos de parámetros delegados
Cannot convert anonymous method block to delegate type 'delegate type' because the specified block's parameter types do
not match the delegate parameter types
Este error se produce si, en una definición del método anónimo, los tipos de parámetro del método anónimo no coinciden con
los tipos de parámetro del delegado. Compruebe el número de parámetros, los tipos de parámetro y todos los parámetros ref
u out, para asegurarse de que coincidan de forma exacta.
El código siguiente genera el error CS1661:

// CS1661.cs

delegate void MyDelegate(int i);

class C
{
public static void Main()
{
MyDelegate d = delegate(string s) { }; // CS1661
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1662


Mensaje de error
No se puede convertir el bloque de métodos anónimos en el tipo delegado 'tipo delegado' porque algunos de los tipos de
valor devuelto del bloque no se pueden convertir implícitamente en el tipo de valor devuelto del delegado
Cannot convert anonymous method block to delegate type 'delegate type' because some of the return types in the block are
not implicitly convertible to the delegate return type
Este error aparece si la instrucción return del bloque de métodos anónimos tenía un tipo que no se podía convertir
implícitamente al tipo de valor devuelto del delegado.
En el código siguiente se genera el error CS1662:

// CS1662.cs

delegate int MyDelegate(int i);

class C
{

public static void Main()


{
MyDelegate d = delegate(int i) { return 1.0; }; // CS1662
// Try this instead:
// MyDelegate d = dekegate(int i) { return (int)1.0; };
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1663


Mensaje de error
El tipo búfer de tamaño fijo debe pertenecer a uno de los tipos siguientes: bool, byte, short, int, long, char, sbyte, ushort, uint,
ulong, float o double
Fixed size buffer type must be one of the following: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float or double
Un búfer de tamaño fijo no puede ser de ningún tipo no incluido en la lista. Para evitar este error, utilice otro tipo o no utilice
una matriz fija.
Ejemplo
El código siguiente genera el error CS1663.

// CS1663.cs
// compile with: /unsafe /target:library
unsafe struct C
{
fixed string ab[10]; // CS1663
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1664


Mensaje de error
El búfer de tamaño fijo de longitud 'longitud' y tipo 'tipo' es demasiado grande
Fixed size buffer of length 'length' and type 'type' is too big
El tamaño máximo de un búfer de tamaño fijo (que viene determinado por la longitud multiplicada por el tamaño del
elemento) es 2^31 = 268435455.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1665


Mensaje de error
Los búferes de tamaño fijo deben tener una longitud mayor que cero.
Fixed size buffers must have a length greater than zero
Este error aparece si se declara un búfer de tamaño fijo con un tamaño negativo o cero. La longitud de un búfer de tamaño fijo
debe ser un entero positivo.
Ejemplo
El código siguiente genera el error CS1665.

// CS1665.cs
// compile with: /unsafe /target:library
struct S
{
public unsafe fixed int A[0]; // CS1665
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1666


Mensaje de error
No puede utilizar los búferes de tamaño fijo contenidos en expresiones de tipo unfixed. Intente usar la instrucción fixed.
You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement.
Este error se produce si se utiliza el búfer de tamaño fijo en una expresión que implica una clase que no es fija. En tiempo de
ejecución, se puede cambiar de lugar la clase no fija para optimizar el acceso a la memoria, lo que puede provocar errores
cuando se utiliza un búfer de tamaño fijo. Para evitar este error, utilice la palabra clave fixed en la instrucción.
Ejemplo
El código siguiente genera el error CS1666.

// CS1666.cs
// compile with: /unsafe /target:library
unsafe struct S
{
public fixed int buffer[1];
}
unsafe class Test
{
S field = new S();

private bool example1()


{
return (field.buffer[0] == 0); // CS1666 error
}

private bool example2()


{
// OK
fixed (S* p = &field)
{
return (p->buffer[0] == 0);
}
}

private bool example3()


{
S local = new S();
return (local.buffer[0] == 0);
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1667


Mensaje de error
El atributo 'atributo' no es válido en descriptores de acceso de propiedades o eventos. Sólo es válido en declaraciones 'tipo de
declaración'.
Attribute 'attribute' is not valid on property or event accessors. It is valid on 'declaration type' declarations only.
Este error se produce si se utiliza un atributo en un descriptor de acceso de una propiedad o un evento, cuando debería estar
en la propiedad o el evento propiamente dichos. Este error puede producirse con los atributos siguientes:
CLSCompliantAttribute, ConditionalAttribute y ObsoleteAttribute.
Ejemplo
El código siguiente genera el error CS1670:

// CS1667.cs
using System;

public class C
{
private int i;

//Try this instead:


//[Obsolete]
public int ObsoleteProperty
{
[Obsolete] // CS1667
get { return i; }
set { i = value; }
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1670


Mensaje de error
params no es válido en este contexto
params is not valid in this context
Algunas características de C# son incompatibles con las listas de argumentos de variables y no permiten la palabra clave
params , incluyendo lo siguiente:
Listas de parámetros de métodos anónimos
Operadores sobrecargados
Ejemplo
En el código siguiente se genera el error CS1670:

// CS1670.cs
public class C
{
public bool operator +(params int[] paramsList) // CS1670
{
return false;
}

static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1671


Mensaje de error
Una declaración de espacio de nombres no puede tener modificadores ni atributos
A namespace declaration cannot have modifiers or attributes
Los modificadores no son significativos cuando se aplican a un espacio de nombres; por ello no se admiten.
El código siguiente genera el error CS1671:

// CS1671.cs
public namespace NS // CS1671
{

}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1672


Mensaje de error
Opción 'opción' no válida para /platform; debe ser Cualquier CPU, x86, Itanium o x64
Invalid option 'option' for /platform; must be anycpu, x86, Itanium or x64
Las opciones especifican el tipo de procesador; utilice uno de los indicados.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1673


Mensaje de error
Los métodos anónimos dentro de estructuras no pueden obtener acceso a miembros de instancia de 'this'. Copie 'this' en una
variable local fuera del método anónimo y utilice dicha variable local en su lugar.
Anonymous methods inside structs cannot access instance members of 'this'. Consider copying 'this' to a local variable outside
the anonymous method and using the local instead
El código siguiente genera el error CS1673:

// CS1673.cs
delegate int MyDelegate();

public struct S
{
int member;

public int F(int i)


{
member = i;
// Try assigning to a local variable
// S s = this;
MyDelegate d = delegate()
{
i = this.member; // CS1673
// And use the local variable instead of "this"
// i = s.member;
return i;

};
return d();
}
}

class CMain
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1674


Mensaje de error
'T': el tipo utilizado en una instrucción using se debe poder convertir implícitamente en 'System.IDisposable'
'T': type used in a using statement must be implicitly convertible to 'System.IDisposable'
La instrucción using se debe utilizar para garantizar la eliminación de un objeto al final del bloque using; por consiguiente, en
este tipo de instrucciones sólo se pueden utilizar tipos descartables. Por ejemplo, los tipos de valores no son descartables, y no
se puede suponer que lo sean los parámetros de tipo no restringidos a clases.
Ejemplo
El código siguiente genera el error CS1674.

// CS1674.cs
class C
{
public static void Main()
{
int a = 0;
a++;

using (a) {} // CS1674


}
}

El código siguiente genera el error CS1674.

// CS1674_b.cs
using System;
class C {
public void Test() {
using (C c = new C()) {} // CS1674
}
}

// OK
class D : IDisposable {
void IDisposable.Dispose() {}
public void Dispose() {}

public static void Main() {


using (D d = new D()) {}
}
}

El caso siguiente ilustra la necesidad de utilizar una restricción de tipo de clase para garantizar que un parámetro de tipo
desconocido sea descartable. El código siguiente genera el error CS1674.

// CS1674_c.cs
// compile with: /target:library
using System;
public class C<T>
// Add a class type constraint that specifies a disposable class.
// Uncomment the following line to resolve.
// public class C<T> where T : IDisposable
{
public void F(T t)
{
using (t) {} // CS1674
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1675


Mensaje de error
Las enumeraciones no pueden tener parámetros de tipo
Enums cannot have type parameters
Para resolver este error, quite el parámetro de tipo de la declaración enum.
Ejemplo
En el código siguiente se genera el error CS1675:

// CS1675.cs
enum E<T> // CS1675
{
}

class CMain
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1676


Mensaje de error
El parámetro 'número' debe declararse con la palabra clave 'palabra clave'
Parameter 'number' must be declared with the 'keyword' keyword
Este error se produce cuando el modificador de tipo de parámetro de un método anónimo es diferente del utilizado en la
declaración del delegado al que se va a convertir el método.
El código siguiente genera el error CS1676:

// CS1676.cs
delegate void E(ref int i);
class Errors
{
static void Main()
{
E e = delegate(out int i) { }; // CS1676
// To resolve, use the following line instead:
// E e = delegate(ref int i) { };
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1677


Mensaje de error
El parámetro 'número' no debe declararse con la palabra clave 'palabra clave'
Parameter 'number' should not be declared with the 'keyword' keyword
Este error se produce cuando el modificador de tipo de parámetro de un método anónimo no se corresponde con el utilizado
en la declaración del delegado al que se va a convertir el método.
Ejemplo
El código siguiente genera el error CS1677:

// CS1677.cs
delegate void D(int i);
class Errors
{
static void Main()
{
D d = delegate(out int i) { }; // CS1677
// To resolve, use the following line instead:
// D d = delegate(int i) { };

D d = delegate(ref int j){}; // CS1677


// To resolve, use the following line instead:
// D d = delegate(int j){};
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1678


Mensaje de error
El parámetro 'number' está declarado como tipo 'tipo1', pero debería ser 'tipo2'
Parameter 'number' is declared as type 'type1' but should be 'type2'
Este error se produce cuando el tipo de parámetro de un método anónimo es diferente de la declaración del delegado al que
se va a convertir el método.
El código siguiente genera el error CS1678:

// CS1678
delegate void D(int i);
class Errors
{
static void Main()
{
D d = delegate(string s) { }; // CS1678
// To resolve, use the following line instead:
// D d = delegate(int s) { };
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1679


Mensaje de error
Alias externo no válido para '/reference'; 'identificador' no es un identificador válido
Invalid extern alias for '/reference'; 'identifier' is not a valid identifier
Al utilizar la característica del alias de ensamblado externo de la opción /reference, el texto que sigue a /reference: y que
precede al signo '=' debe ser una palabra clave o identificador de C# válido según la especificación del lenguaje C#.
Para corregir este error, cambie el texto que se encuentra antes del signo "=" por una palabra clave o identificador de C#
válidos.
Ejemplo
En el siguiente ejemplo se genera el error CS1679.

// CS1679.cs
// compile with: /reference:123$BadIdentifier%=System.dll
class TestClass {
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1680


Mensaje de error
Opción de alias de referencia no válida: 'alias=' -- falta el nombre de archivo.
Invalid reference alias option: 'alias=' -- missing filename.
Este error aparece cuando utiliza la característica alias con la opción del compilador /reference sin especificar un nombre de
archivo válido.
El código siguiente genera el error CS1680.

// CS1680.cs
// compile with: /reference:alias=
// CS1680 expected
// To resolve, specify the name of a file with an assembly manifest
class MyClass {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1681


Mensaje de error
No se puede definir de nuevo el alias externo global
You cannot redefine the global extern alias
El alias global ya está definido para incluir todas las referencias sin alias y por lo tanto no puede volverse a definir.
Ejemplo
El código siguiente genera el error CS1681.

// CS1681.cs
// compile with: /reference:global=System.dll
// CS1681 expected

// try this instead: /reference:System.dll


class A
{
static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1686


Mensaje de error
La variable local 'variable' o sus miembros no pueden obtener la dirección ni utilizarse en un bloque de método anónimo
Local 'variable' or its members cannot have their address taken and be used inside an anonymous method block
Se genera este error cuando se utiliza una variable y se intenta obtener su dirección, pero una de estas acciones se efectúa en
un método anónimo.
Ejemplo
El código siguiente genera el error CS1686.

// CS1686.cs
// compile with: /unsafe /target:library
class MyClass
{
public unsafe delegate int * MyDelegate();

public unsafe int * Test()


{
int j = 0;
MyDelegate d = delegate { return &j; }; // CS1686
return &j; // OK
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1688


Mensaje de error
No se puede convertir el bloque de método anónimo sin una lista de parámetros en el tipo delegado 'delegado' porque tiene
uno o varios parámetros out.
Cannot convert anonymous method block without a parameter list to delegate type 'delegate' because it has one or more out
parameters
El compilador permite omitir los parámetros de un bloque de método anónimo en la mayoría de los casos. Este error surge
cuando el bloque de método anónimo no tiene una lista de parámetros, pero el delegado tiene un parámetro out. El
compilador no permite esta situación porque necesitaría omitir la presencia del parámetro out, lo cual es improbable que sea
el comportamiento correcto.
Ejemplo
En el código siguiente se genera el error CS1688.

// CS1688.cs
using System;
delegate void OutParam(out int i);
class ErrorCS1676
{
static void Main()
{
OutParam o;
o = delegate // CS1688
// Try this instead:
// o = delegate(out int i)
{
Console.WriteLine("");
};
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1689


Mensaje de error
El atributo 'Nombre del atributo' sólo es válido en métodos o clases de atributos
Attribute 'Attribute Name' is only valid on methods or attribute classes
Este error sólo se produce con el atributo ConditionalAttribute. Como indica el mensaje, este atributo únicamente se puede
utilizar en métodos o clases de atributo. Por ejemplo, se generará el error si se intenta aplicar este atributo a una clase.
Ejemplo
El código siguiente genera el error CS1689.

// CS1689.cs
// compile with: /target:library
[System.Diagnostics.Conditional("A")] // CS1689
class MyClass {}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1690


Mensaje de error
El acceso a un miembro de 'miembro' puede provocar una excepción en tiempo de ejecución porque es un campo de una clase
de cálculo por referencia
Accessing a member on 'member' may cause a runtime exception because it is a field of a marshal-by-reference class
Esta advertencia aparece cuando se intenta llamar a un método, propiedad o indizador de un miembro de una clase que se
deriva de MarshalByRefObject, y el miembro es un tipo de valor. Para resolver esta advertencia, copie el miembro en una
variable local y llame al método en esa variable.
En el siguiente ejemplo se genera el error CS1690.

// CS1690.cs
using System;

class WarningCS1690: MarshalByRefObject


{
int i = 5;

public static void Main()


{
WarningCS1690 e = new WarningCS1690();
e.i.ToString(); // CS1690

// OK
int i = e.i;
i.ToString();
e.i = i;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1703


Mensaje de error
Ya se ha importado un ensamblado con la misma identidad "Nombre del ensamblado". Intente quitar una de las referencias
duplicadas.
An assembly with the same identity "Assembly Name" has already been imported. Try removing one of the duplicate
references.
El compilador quita referencias que tienen la misma ruta de acceso y nombre de archivo, pero es posible que el mismo archivo
exista en dos lugares, o que se haya olvidado de cambiar el número de versión. Este error señala que hay dos referencias que
tienen la misma identidad de ensamblado, por lo que el compilador no tiene ninguna manera de distinguir entre las mismas
en los metadatos. Quite una de las referencias redundantes o haga que las referencias sean únicas de alguna manera, por
ejemplo, incrementando el número de versión del ensamblado.
En el código siguiente se genera el error CS1703.
Ejemplo
Este código crea el ensamblado A en el directorio .\bin1.
Guarde este ejemplo en un archivo denominado CS1703a1.cs y compílelo con los indicadores siguientes: /t:library
/out:.\bin1\cs1703.dll /keyfile:key.snk

using System;
public class A { }

Este código crea una copia del ensamblado A en el directorio .\bin2.


Guarde este ejemplo en un archivo denominado CS1703a2.cs y compílelo con los indicadores siguientes: /t:library
/out:.\bin2\cs1703.dll /keyfile:key.snk

using System;
public class A { }

Este código hace referencia al ensamblado A en los dos módulos anteriores.


Guarde este ejemplo en un archivo denominado CS1703ref.cs y compílelo con los indicadores siguientes: /t:library
/r:A2=.\bin2\cs1703.dll /r:A1=.\bin1\cs1703.dll

extern alias A1;


extern alias A2;
Referencia de Visual C#: errores y advertencias

Error del compilador CS1704


Mensaje de error
Ya se ha importado un ensamblado con el mismo nombre sencillo 'Nombre del ensamblado'. Intente quitar una de las
referencias o fírmelas para habilitar la función de simultaneidad.
An assembly with the same simple name 'Assembly Name' has already been imported. Try removing one of the references or
sign them to enable side-by-side.
Este error señala que hay dos referencias que tienen la misma identidad de ensamblado porque los ensamblados en cuestión
carecen de nombres seguros, no se firmaron, por lo que el compilador no tiene forma de distinguir entre ellas mismas en los
metadatos. Así, el motor en tiempo de ejecución omite las propiedades de versión y nombre del ensamblado de referencia
cultural. El usuario deberá quitar la referencia redundante, cambiar el nombre de una de las referencias o proporcionar un
nombre seguro para las mismas.
Ejemplo
En este ejemplo se crea un ensamblado y se guarda en el directorio raíz.

// CS1704_a.cs
// compile with: /target:library /out:c:\\cs1704.dll
public class A {}

Este ejemplo crea un ensamblado con el mismo nombre que el ejemplo anterior, pero lo guarda a una ubicación diferente.

// CS1704_b.cs
// compile with: /target:library /out:cs1704.dll
public class A {}

En este ejemplo se intenta hacer referencia a ambos ensamblados. El código siguiente genera el error CS1704.

// CS1704_c.cs
// compile with: /target:library /r:A2=cs1704.dll /r:A1=c:\\cs1704.dll
// CS1704 expected
extern alias A1;
extern alias A2;
Referencia de Visual C#: errores y advertencias

Error del compilador CS1705


Mensaje de error
El ensamblado 'NombreEnsamblado1' utiliza 'NombreTipo' que tiene una versión superior a la del ensamblado
'NombreEnsamblado2' al que se hace referencia
Assembly 'AssemblyName1' uses 'TypeName' which has a higher version than referenced assembly 'AssemblyName2'
Está haciendo referencia a un tipo que tiene un número de versión más alto que el número de versión de un ensamblado al
que hace referencia.
Por ejemplo, tiene dos ensamblados, A y B. A hace referencia a una clase myClass que se ha agregado al ensamblado B en la
versión 2.0. Pero la referencia al ensamblado B especifica la versión 1.0. El compilador tiene reglas de unificación para las
referencias de enlace y la versión 1.0 no puede satisfacer una referencia a la versión 2.0.
Ejemplo
Este ejemplo está compuesto de cuatro módulos de código:
Dos archivos DLL que son idénticos salvo en un atributo de versión.
Un archivo DLL que hace referencia a ellos.
Un cliente.
El siguiente es el primero de los archivos DLL idénticos.

// CS1705_a.cs
// compile with: /target:library /out:c:\\cs1705.dll /keyfile:mykey.snk
[assembly:System.Reflection.AssemblyVersion("1.0")]
public class A
{
public void M1() {}
public class N1 {}
public void M2() {}
public class N2 {}
}

public class C1 {}
public class C2 {}

A continuación aparece la versión 2.0 del ensamblado, de acuerdo con lo especificado por el atributo
AssemblyVersionAttribute.

// CS1705_b.cs
// compile with: /target:library /out:cs1705.dll /keyfile:mykey.snk
using System.Reflection;
[assembly:AssemblyVersion("2.0")]
public class A
{
public void M2() {}
public class N2 {}
public void M1() {}
public class N1 {}
}
public class C2 {}
public class C1 {}

Guarde este ejemplo en un archivo denominado CS1705ref.cs y compílelo con los indicadores siguientes: /t:library
/r:A2=.\bin2\CS1705a.dll /r:A1=.\bin1\CS1705a.dll

// CS1705_c.cs
// compile with: /target:library /r:A2=c:\\CS1705.dll /r:A1=CS1705.dll
extern alias A1;
extern alias A2;
using a1 = A1::A;
using a2 = A2::A;
using n1 = A1::A.N1;
using n2 = A2::A.N2;
public class Ref
{
public static a1 A1() { return new a1(); }
public static a2 A2() { return new a2(); }
public static A1::C1 M1() { return new A1::C1(); }
public static A2::C2 M2() { return new A2::C2(); }
public static n1 N1() { return new a1.N1(); }
public static n2 N2() { return new a2.N2(); }
}

El ejemplo siguiente hace referencia a la versión 1.0 del ensamblado CS1705.dll. Sin embargo, la instrucción Ref.A2().M2()
hace referencia al método A2 en la clase de CS1705_c.dll, que devuelve a2, cuyo alias es A2::A. Por su parte, A2 hace referencia
a la versión 2.0 a través de una instrucción extern, lo que provoca una diferencia de versiones.
El código siguiente genera el error CS1705.

// CS1705_d.cs
// compile with: /reference:c:\\CS1705.dll /reference:CS1705_c.dll
// CS1705 expected
class Tester
{
static void Main()
{
Ref.A1().M1();
Ref.A2().M2();
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1706


Mensaje de error
La expresión no puede contener métodos anónimos
Expression cannot contain anonymous methods
No se puede insertar un método anónimo dentro de una expresión.
Para corregir este error
Utilice un delegate normal en la expresión.
Ejemplo
El código siguiente genera el error CS1706.

// CS1706.cs
using System;

delegate void MyDelegate();


class MyAttribute : Attribute
{
public MyAttribute(MyDelegate d) { }
}

// Anonymous Method in Attribute declaration is not allowed.


[MyAttribute(delegate{/* anonymous Method in Attribute declaration */})] // CS1706
class Program
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1708


Mensaje de error
Sólo se puede tener acceso a los búferes de tamaño fijo mediante variables locales o campos
Fixed size buffers can only be accessed through locals or fields
Una de las nuevas características en C# 2.0 es la capacidad de definir una matriz en línea dentro de un tipo struct. A este tipo
de matrices sólo se puede tener acceso mediante variables o campos locales, y no se puede hacer referencia a ellas como
valores intermedios en el lado izquierdo de una expresión. Además, sólo pueden tener acceso a las matrices los campos que
son static o readonly.
Para resolver este error, defina una variable de matriz y asigne la matriz en línea a la variable. O bien, quite el modificador
static o readonly del campo que representa la matriz en línea.
Ejemplo
El código siguiente genera el error CS1708.

// CS1708.cs
// compile with: /unsafe
using System;

unsafe public struct Foo


{
public fixed char name[10];
}

public unsafe class C


{
public Foo UnsafeMethod()
{
Foo myFoo = new Foo();
return myFoo;
}

static void Main()


{
C myC = new C();
myC.UnsafeMethod().name[3] = 'a'; // CS1708
// Uncomment the following 2 lines to resolve:
// Foo myFoo = myC.UnsafeMethod();
// myFoo.name[3] = 'a';

// The field cannot be static.


C._foo1.name[3] = 'a'; // CS1708
// The field cannot be readonly.
myC._foo2.name[3] = 'a'; // CS1708
}
static readonly Foo _foo1;
public readonly Foo _foo2;
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1713


Mensaje de error
Error inesperado al generar un nombre de metadatos para el tipo 'Nombre_de_tipo1' — 'Causa'
Unexpected error building metadata name for type Typename1—'Reason'
Este error suele estar provocado por un error del compilador interno. Posiblemente se resuelva realizando algunos cambios
secundarios en el código, como acortar la longitud del nombre, y recompilando a continuación.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1714


Mensaje de error
La clase base o la interfaz de NombreTipo1 no se ha podido resolver o no es válida
The base class or interface of TypeName1 could not be resolved or is invalid
Está implementando un tipo ('NombreTipo1') de una clase o interfaz que no se ha podido resolver, por ejemplo, el compilador
no ha podido encontrarla o no es válida. La solución es determinar de cuál de estos dos casos se trata, y especificar más
correctamente la ubicación del tipo o corregir cualquier error del compilador en la clase base.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1715


Mensaje de error
'Tipo1': el tipo debe ser 'Tipo2' para que coincida con el miembro reemplazado 'Nombre_de_miembro'
'Type1': type must be 'Type2' to match overridden member 'MemberName'
Este error es el mismo que Error del compilador CS0508, sólo que CS0508 ya sólo se aplica a métodos que tienen tipos
devueltos, mientras que CS1715 se aplica a las propiedades y a los indizadores que tienen 'tipos' solamente, en lugar de 'tipos
devueltos'.
Ejemplo
El código siguiente genera el error CS1715.

// CS1715.cs
abstract public class Base
{
abstract public int myProperty
{
get;
set;
}
}

public class Derived : Base


{
int myField;
public override double myProperty // CS1715
// try the following line instead
// public override int myProperty
{
get { return myField; }
set { myField;= value; }
}

public static void Main()


{
Derived d = new Derived();
d.myProperty = 5;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1716


Mensaje de error
No utilice el atributo 'System.Runtime.CompilerServices.FixedBuffer'. En su lugar, use el modificador de campo 'fixed'.
Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute. Use the 'fixed' field modifier instead.
Este error surge en una sección de código no seguro que contiene una declaración de matriz de tamaño fijo similar a una
declaración de campo. No utilice este atributo. En su lugar, utilice la palabra clave fixed.
Ejemplo
En el siguiente ejemplo se genera el error CS1716.

// CS1716.cs
// compile with: /unsafe
using System;
using System.Runtime.CompilerServices;
public struct UnsafeStruct
{
[FixedBuffer(typeof(int), 4)] // CS1716
unsafe public int aField;
// Use this single line instead of the above two lines.
// unsafe public fixed int aField[4];
}

public class TestUnsafe


{
static int Main()
{
UnsafeStruct us = new UnsafeStruct();
unsafe
{
if (us.aField[0] == 0)
return us.aField[1];
else
return us.aField[2];
}
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1719


Mensaje de error
Error al leer el archivo de recursos Win32 'Nombre de archivo' -- 'causa'
Error reading Win32 resource file 'File Name' -- 'reason'
Se ha producido un error al intentar leer el archivo de recursos Win32 por la causa indicada en el mensaje, que suele ser del
tipo "archivo no encontrado" o "acceso denegado". Este error se resuelve corrigiendo el problema descrito en la causa.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1721


Mensaje de error
La clase 'clase' no puede tener varias clases base: 'clase_1' y 'clase_2
The most common cause of this error message is attempting to use multiple inheritance. A class in C# may only inherit from
one class: the remaining types following the class name in the class declaration must be interfaces.
La causa más común de este mensaje de error es intentar utilizar la herencia múltiple. Una clase en C# sólo puede heredar de
una clase: los tipos restantes que siguen al nombre de clase en la declaración de clase debe ser interfaces.
Ejemplo
El código siguiente genera el error CS1721.

// CS1721.cs
public class A {}
public class B {}
public class MyClass : A, B {} // CS1721
Referencia de Visual C#: errores y advertencias

Error del compilador CS1722


Mensaje de error
La clase base 'clase' debe ir antes que cualquier interfaz
Base class 'class' must come before any interfaces
Cuando especifique una clase desde la que heredar e interfaces para implementar, indique primero el nombre de la clase.
Ejemplo
El código siguiente genera el error CS1722.

// CS1722.cs
// compile with: /target:library
public class A {}
interface I {}

public class MyClass : I, A {} // CS1722


public class MyClass2 : A, I {} // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS1724


Mensaje de error
El valor especificado para el argumento 'System.Runtime.InteropServices.DefaultCharSetAttribute' no es válido
Value specified for the argument to 'System.Runtime.InteropServices.DefaultCharSetAttribute' is not valid
Un argumento no válido de DefaultCharSetAttribute genera este error.
Ejemplo
El código siguiente genera el error CS1724.

// CS1724.cs
using System.Runtime.InteropServices;
// To resolve, replace 42 with a valid CharSet value.
[module:DefaultCharSetAttribute((CharSet)42)] // CS1724
class C {

[DllImport("F.Dll")]
extern static void FW1Named();

static void Main() {}


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1728


Mensaje de error
No se puede enlazar el delegado con 'miembro' porque es un miembro de 'tipo'
Cannot bind delegate to 'member' because it is a member of 'type'
Los delegados no se pueden enlazar con miembros de los tipos Nullable.
Ejemplo
El código siguiente genera el error CS1728.

// CS1728.cs
// compile with: /W:2
class Test
{
delegate T GetT<T>();
delegate T GetT1<T>(T t);

delegate bool E(object o);


delegate int I();
delegate string S();

static void Main()


{
int? x = null;
int? y = 5;

GetT<int> d1 = x.GetValueOrDefault; // CS1728


GetT<int> d2 = y.GetValueOrDefault; // CS1728
GetT1<int> d3 = x.GetValueOrDefault; // CS1728
GetT1<int> d4 = y.GetValueOrDefault; // CS1728
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1900


Mensaje de error
El nivel de advertencia debe estar incluido en el intervalo 0-4
Warning level must be in the range 0-4
La opción /warn del compilador sólo puede tomar uno de estos 5 valores: 0, 1, 2, 3 ó 4. Cualquier otro valor que se pase a
/warn dará como resultado el error CS1900.
El código siguiente genera el error CS1900:

// CS1900.cs
// compile with: /W:5
// CS1900 expected
class x
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1902


Mensaje de error
Opción 'opción' no válida para /debug; debe ser full o pdbonly
Invalid option 'option' for /debug; must be full or pdbonly
Se pasó una opción no válida a la opción /debug del compilador.
El código siguiente genera el error CS1902:

// CS1902.cs
// compile with: /debug:x
// CS1902 expected
class x
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1906


Mensaje de error
Opción 'opción' no válida; la visibilidad de los recursos debe ser 'public' o 'private'
Invalid option 'option'; Resource visibility must be either 'public' or 'private'
Este error indica que existe una opción /resource (incrustar un archivo de recursos en el resultado) o
/linkresource (vincular a recursos de .NET Framework) de la línea de comandos que no es válida. Compruebe la sintaxis de la
opción /resource o /linkresource de la línea de comandos y asegúrese de que el modificador de accesibilidad utilizado sea
public o private.
Referencia de Visual C#: errores y advertencias

Error del compilador CS1908


Mensaje de error
El tipo de argumento para el atributo DefaultValue debe coincidir con el tipo de parámetro
The type of the argument to the DefaultValue attribute must match the parameter type
Este error se genera cuando se utiliza un argumento equivocado para el valor de atributo DefaultValueAttribute. Utilice un
valor que coincida con el tipo de parámetro.
Ejemplo
El código siguiente genera el error CS1908.

// CS1908.cs
// compile with: /target:library
using System.Runtime.InteropServices;

public interface ISomeInterface


{
void Bad([Optional] [DefaultParameterValue("true")] bool b); // CS1908

void Good([Optional] [DefaultParameterValue(true)] bool b); // OK


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1909


Mensaje de error
El atributo DefaultValue no se aplica a los parámetros de tipo 'tipo'
The DefaultValue attribute is not applicable on parameters of type 'type'
El error CS1909 se genera cuando se utiliza un atributo DefaultValue que no se aplica al tipo de parámetro.
Ejemplo
El código siguiente genera el error CS1909.

// CS1909.cs
// compile with: /target:library
using System.Runtime.InteropServices;

public interface ISomeInterface


{
void Test1([DefaultParameterValue(new int[] {1, 2})] int[] arr1); // CS1909

void Test2([DefaultParameterValue("Test String")] string s); // OK


}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1910


Mensaje de error
El argumento de tipo 'tipo' no se puede aplicar al atributo DefaultValue
Argument of type 'type' is not applicable for the DefaultValue attribute
Para los parámetros cuyo tipo sea un objeto, el valor del argumento de DefaultParameterValueAttribute debe ser null, un tipo
integral, un punto flotante, bool, string, enum o char. El argumento no puede ser de tipo Type o cualquier tipo de matriz.
Ejemplo
El código siguiente genera el error CS1910.

// CS1910.cs
// compile with: /target:library
using System.Runtime.InteropServices;

public interface MyI


{
void Test([DefaultParameterValue(typeof(object))] object o); // CS1910
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2000


Mensaje de error
Error inesperado al inicializar el compilador
Compiler initialization failed unexpectedly
Este error indica un error de inicialización.
Utilice el programa de instalación para reparar o reinstalar Visual Studio o .NET Framework SDK.
Si el error persiste, póngase en contacto con el servicio de soporte técnico.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2001


Mensaje de error
No se encuentra el archivo de código fuente 'archivo'
Source file 'file' could not be found
Se pasó un nombre de archivo de código fuente al compilador, pero no se pudo encontrar el archivo. Compruebe que ha
escrito correctamente el nombre del archivo y la ubicación del mismo.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2003


Mensaje de error
El archivo de respuesta 'archivo' se ha incluido varias veces
Response file 'file' included multiple times
Se pasó al compilador un archivo de respuesta más de una vez. Sólo se puede pasar un archivo de resultados al compilador
una vez por cada archivo de resultados.
Para saber más sobre los archivos de respuesta, vea @ (Especificar archivo de respuesta).
Referencia de Visual C#: errores y advertencias

Error del compilador CS2005


Mensaje de error
Falta la especificación de archivo de la opción 'opción'
Missing file specification for 'option' option
Sólo se especificó parcialmente una opción del compilador.
Por ejemplo, al utilizar /recurse, se debe especificar el archivo que se desea buscar: /recurse:nombre de archivo.cs.
Ejemplo
El código siguiente genera el error CS2005.

// CS2005.cs
// compile with: /recurse:
// CS2005 expected
class x
{
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2006


Mensaje de error
Error sintáctico de línea de comandos: falta 'texto' para la opción 'opción'
Command-line syntax error: Missing 'text' for 'option' option
La sintaxis de opción requiere texto adicional. Para obtener más información, vea Opciones del compilador.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2007


Mensaje de error
Opción de la línea de comandos no reconocida: 'opción'
Unrecognized command-line option: 'option'
Se pasó al compilador una cadena que no era una opción del compilador aunque comience con una barra (/).
El código siguiente genera el error CS2007:

// CS2007.cs
// compile with: /recur
// CS2007 expected
class x
{
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2008


Mensaje de error
No se especificaron entradas
No inputs specified
Se ejecutó el compilador y se especificaron opciones del compilador, pero no se pasaron archivos de código fuente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2011


Mensaje de error
No se puede abrir el archivo de respuesta 'archivo'
Unable to open response file 'file'
Se especificó un archivo de respuesta en una compilación, pero el compilador no pudo encontrar y abrir el archivo.
Para saber más sobre los archivos de respuesta, vea @ (Especificar archivo de respuesta).
Referencia de Visual C#: errores y advertencias

Error del compilador CS2012


Mensaje de error
No se puede abrir 'archivo' para escritura
Cannot open 'file' for writing
Al utilizar la opción /bugreport:file del compilador, no se pudo abrir el archivo para escribir en él. Asegúrese de haber
especificado un nombre de archivo válido y de que éste no es de sólo lectura.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2013


Mensaje de error
El número base de la imagen 'valor' no es válido
Invalid image base number 'value'
Se pasó un valor no válido (no un número) a la opción /baseaddress del compilador.
El código siguiente genera el error CS2013:

// CS2013.cs
// compile with: /target:library /baseaddress:x
// CS2013 expected
class MyClass
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2015


Mensaje de error
'archivo' es un archivo binario en vez de uno de texto
'file' is a binary file instead of a text file
Se pasó un archivo binario al compilador. El compilador espera un archivo de código fuente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2016


Mensaje de error
La página de códigos 'página de códigos' no es válida o no se ha instalado
Code page 'codepage' is invalid or not installed
Se pasó un valor no válido a la opción /codepage del compilador.
El código siguiente genera el error CS2016:

// CS2016.cs
// compile with: /codepage:x
// CS2016 expected
class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2017


Mensaje de error
No se puede especificar /main si se genera un módulo o una biblioteca
Cannot specify /main if building a module or library
No se puede especificar un punto de entrada principal cuando se está generando una biblioteca con /target:library.
El código siguiente genera el error CS2017:

// CS2017.cs
// compile with: /main:MyClass /target:library
// CS2017 expected
class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2018


Mensaje de error
No se encuentra el archivo de mensajes 'cscmsgs.dll'
Unable to find messages file 'cscmsgs.dll'
No se encuentra el archivo .dll que contiene los mensajes de error y advertencia del compilador. Este archivo debe estar
presente en el mismo directorio que los demás archivos de compatibilidad del compilador.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2019


Mensaje de error
Tipo de destino no válido para /target: se debe especificar 'exe', 'winexe', 'library' o 'module'
Invalid target type for /target: must specify 'exe', 'winexe', 'library', or 'module'
Se usó la opción /target del compilador, pero se pasó un parámetro no válido. Para resolver este error, vuelva a compilar el
programa usando la forma de la opción /target que sea adecuada para el archivo de resultados.
El código siguiente genera el error CS2017:

// CS2019.cs
// compile with: /target:libra
// CS2019 expected
class MyClass
{
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS2020


Mensaje de error
Sólo el primer conjunto de archivos de entrada puede generar un destino distinto de 'module'
Only the first set of input files can build a target other than 'module'
En una compilación con varios archivos de resultados, el primero de ellos debe generarse con /target:exe, /target:winexe o
/target:library. Cualquier archivo de resultados sucesivo debe generarse con /target:module.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2021


Mensaje de error
El nombre de archivo 'archivo' es demasiado largo o no es válido
File name 'file' is too long or invalid
Todos los nombres de archivo pasados al compilador de C# deben ser de longitud inferior o igual a _MAX_PATH (definida en
un archivo de encabezado de Windows). El compilador producirá este error en las siguientes situaciones:
Un nombre de archivo (incluida la ruta de acceso) es mayor que _MAX_PATH.
El nombre del archivo contiene caracteres no válidos.
El nombre del archivo contiene caracteres comodín en donde éstos no están permitidos (como en los nombres de
archivos de recursos).
Referencia de Visual C#: errores y advertencias

Error del compilador CS2022


Mensaje de error
Las opciones '/out' y '/target' deben aparecer antes de los nombres de archivo de código fuente
Options '/out' and '/target' must appear before source file names
Al especificar las opciones del compilador /out (establecer el nombre de archivo de resultados) y
/target (especificar formato del archivo de resultados) en la línea de comandos, éstas deben preceder a los archivos de código
fuente.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2024


Mensaje de error
Número de sección de alineación de archivo 'número' no válido
Invalid file section alignment number '#'
Se pasó un valor no válido a la opción /filealign del compilador.
El código siguiente genera el error CS2024:

// CS2024.cs
// compile with: /filealign:ex
// CS2024 expected
class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS2029


Mensaje de error
Valor no válido para '/define'; 'identificador' no es un identificador válido
Invalid value for '/define'; 'identifier' is not a valid identifier
Esta advertencia aparece si el valor utilizado en la opción /define tiene algunos caracteres no válidos.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2032


Mensaje de error
No se permite el uso del carácter 'carácter' en la línea de comandos ni en los archivos de respuesta
Character 'character' is not allowed on the command-line or in response files
Los archivos de respuesta y las opciones de línea de comandos para csc.exe no pueden contener los caracteres ASCII estándar
de control, que son los comprendidos entre el 0 y el 31, ni la barra vertical (|). Por lo general, este error no se puede generar
directamente desde la línea de comandos porque el procesador de la línea de comandos filtra y elimina los caracteres no
válidos, al igual que el entorno de desarrollo integrado (IDE). Se puede generar este error mediante un archivo de respuesta,
como se indica a continuación.
Para generar este error
1. Cree un archivo denominado CS2032.rsp que contenga la línea /target:exe /out:cs|2032.exe cs2032.cs, en Mis
documentos.
2. Cree un archivo denominado cs2032.cs que contenga cualquier cosa en Mis documentos.
3. Haga clic en Inicio, elija Todos los programas, Microsoft Visual Studio 2005, Herramientas de Visual Studio 2005
y, a continuación, haga clic en Símbolo del sistema de Visual Studio.
Se abrirá la ventana Símbolo del sistema de Visual Studio.
4. En la ventana Símbolo del sistema de Visual Studio, vaya al directorio Mis documentos.
5. Ejecute lo siguiente en el Símbolo del sistema de Visual Studio: csc @cs2032.rsp

6. Aparecerá el mensaje de error CS2032.


7.
1.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2033


Mensaje de error
No se puede crear un nombre de archivo corto 'nombre de archivo' cuando ya existe un nombre de archivo largo con el
mismo nombre de archivo corto
Cannot create short filename 'filename' when a long filename with the same short filename already exists
Compile cualquier archivo C# que tenga un nombre de más de ocho caracteres. A continuación, compile otro archivo con la
versión corta del nombre de archivo anterior, por ejemplo los primeros seis caracteres del nombre más "~ 1". En la segunda
compilación se generará este error.
Para resolver este error, cambie el nombre corto de archivo por uno que no entre en conflicto con el nombre largo de archivo.
Referencia de Visual C#: errores y advertencias

Error del compilador CS2034


Mensaje de error
Una opción /reference que declara un alias externo sólo puede tener un nombre de archivo. Para especificar varios alias o
nombres de archivo, utilice varias opciones /reference.
A /reference option that declares an extern alias can only have one filename. To specify multiple aliases or filenames, use
multiple /reference options.
Para especificar dos alias y/o nombres de archivo, utilice dos opciones /reference, como se indica a continuación:
Ejemplo
El siguiente código genera el error CS2034.

// CS2034.cs
// compile with: /r:A1=cs2034a1.dll;A2=cs2034a2.dll
// to fix, compile with: /r:A1=cs2034a1.dll /r:A2=cs2034a2.dll
// CS2034
extern alias A1;
extern alias A2;
using System;
Referencia de Visual C#: errores y advertencias

Error del compilador CS2035


Mensaje de error
Error sintáctico de la línea de comandos: falta ':<número>' para la opción 'opción del compilador'
Command-line syntax error: Missing ':<number>' for 'compiler_option' option
Algunas opciones del compilador requieren un valor.
Ejemplo
El código siguiente genera el error CS2035.

// CS2035.cs
// compile with: /baseaddress
// CS2035 expected
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3027


Mensaje de error
'tipo_1' no es compatible con CLS porque la interfaz base 'tipo_2' no lo es
'type_1' is not CLS-compliant because base interface 'type_2' is not CLS-compliant
Un tipo no compatible con CLS no puede ser tipo base para un tipo compatible con CLS.
Ejemplo
El ejemplo siguiente contiene una interfaz con un método que utiliza un tipo no compatible con CLS en su firma, por lo que el
tipo se vuelve no compatible con CLS.

// CS3027.cs
// compile with: /target:library
public interface IBase
{
void IMethod(uint i);
}

El código siguiente genera la advertencia CS3027.

// CS3027_b.cs
// compile with: /reference:CS3027.dll /target:library /W:1
[assembly:System.CLSCompliant(true)]
public interface IDerived : IBase {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS5001


Mensaje de error
El programa 'programa' no contiene ningún método 'Main' estático adecuado para un punto de entrada
Program 'program' does not contain a static 'Main' method suitable for an entry point
Este error se produce cuando no se ha encontrado ningún método Main en el código que produzca un archivo ejecutable. Otra
causa para que se produzca el error es si al definir la función del punto de entrada, Main, no se utilizan correctamente las
mayúsculas o minúsculas, como en main, o no se declara Main como estática.
Ejemplo
El ejemplo siguiente genera el error CS5001.

// CS5001.cs
// CS5001 expected
public class a
{
// Uncomment the following line to resolve.
// public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0025


Mensaje de error
No se encuentra el archivo de biblioteca estándar 'archivo'
Standard library file 'file' could not be found
No se encuentra un archivo requerido por el compilador. Compruebe que la ruta de acceso es correcta y que el archivo existe.
Si el archivo es un archivo del sistema de Visual Studio, puede que tenga que reparar la instalación de Visual Studio o volver a
instalarlo por completo.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0183


Mensaje de error
La expresión dada es siempre del tipo proporcionado ('tipo')
The given expression is always of the provided ('type') type
Si una instrucción condicional se evalúa siempre como true, no es necesaria una instrucción condicional. Esta advertencia
aparece cuando intenta evaluar un tipo utilizando el operador is. Si la evaluación es un tipo de valor, la comprobación es
innecesaria.
El código siguiente genera el error CS0183:

// CS0183.cs
// compile with: /W:1
using System;
public class Test
{
public static void F(Int32 i32, String str)
{
if (str is Object) // OK
Console.WriteLine( "str is an object" );
else
Console.WriteLine( "str is not an object" );

if (i32 is Object) // CS0183


Console.WriteLine( "i32 is an object" );
else
Console.WriteLine( "i32 is not an object" ); // never reached
}

public static void Main()


{

F(0, "CS0183");
F(120, null);
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0184


Mensaje de error
La expresión dada no es nunca del tipo proporcionado ('tipo')
The given expression is never of the provided ('type') type
La expresión nunca puede ser true, ya que la variable que se está probando no está declarada como tipo ni derivada de tipo.
El código siguiente genera el error CS0184:

// CS0184.cs
// compile with: /W:1
class MyClass
{
public static void Main()
{
int i = 0;
if (i is string) // CS0184
i++;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0420


Mensaje de error
'identificador': una referencia a un campo volátil no se tratará como tal
'identifier': a reference to a volatile field will not be treated as volatile
Normalmente, no se debe pasar un campo volatile mediante un parámetro ref u out, puesto que no se tratará como volátil
dentro del ámbito de la función. Existen excepciones a esta norma, como cuando se llama llamar a una API enclavada. Como
con cualquier advertencia, puede utilizar #pragma warning para deshabilitar esta advertencia en los infrecuentes casos en que
se utilice un campo volatile de manera intencionada como parámetro de referencia.
El código siguiente genera el error CS0420:

// CS0420.cs
// compile with: /W:1
using System;

class TestClass
{
private volatile int i;

public void TestVolatile(ref int ii)


{
}

public static void Main()


{
TestClass x = new TestClass();
x.TestVolatile(ref x.i); // CS0420
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0465


Mensaje de error
La introducción de un método 'Finalize' puede afectar a la invocación del destructor. ¿Intentó declarar un destructor?
Introducing a 'Finalize' method can interfere with destructor invocation. Did you intend to declare a destructor?
Esta advertencia aparece cuando crea una clase con un método cuya firma es public virtual void Finalize.

Si esta clase se utiliza como si fuera una clase base y la clase de la que se deriva define un destructor, éste reemplazará el
método Finalize de la clase base, no el método Finalize.
Ejemplo
El siguiente ejemplo genera la advertencia CS0465.

// CS0465.cs
// compile with: /target:library
class A
{
public virtual void Finalize() {} // CS0465
}

// OK
class B
{
~B() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0602


Mensaje de error
La característica 'característica_antigua' está en desuso. Utilice 'característica_nueva' en su lugar.
The feature 'old_feature' is deprecated. Please use 'new_feature' instead
Una característica del lenguaje usada en el código (función_antigua) sigue siendo válida, pero puede dejar de admitirse en una
futura versión. En su lugar se debe usar la sintaxis recomendada (nueva_función).
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0612


Mensaje de error
'miembro' está obsoleto
'member' is obsolete
El Diseñador de clases marcó un miembro con el atributo Obsolete. Esto significa que puede que no se permita la utilización de
dicho miembro en una versión posterior de la clase.
El ejemplo de código siguiente muestra cómo al obtener acceso a un miembro obsoleto se genera la advertencia CS0612:

// CS0612.cs
// compile with: /W:1
using System;

class MyClass
{
[Obsolete]
public static void ObsoleteMethod()
{
}

[Obsolete]
public static int ObsoleteField;
}

class MainClass
{
static public void Main()
{
MyClass.ObsoleteMethod(); // CS0612 here: method is deprecated
MyClass.ObsoleteField = 0; // CS0612 here: field is deprecated
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0626


Mensaje de error
El método, operador o descriptor de acceso 'método' está marcado como externo y no tiene atributos. Agregue un atributo
DllImport para especificar la implementación externa.
Method, operator, or accessor 'method' is marked external and has no attributes on it. Consider adding a DllImport attribute to
specify the external implementation
Un método marcado como extern también se debe marcar con un atributo, como por ejemplo el atributo DllImport.
El atributo especifica dónde se implementa el método. En tiempo de ejecución, el programa necesita esta información.
El código siguiente genera la advertencia CS0626:

// CS0626.cs
// compile with: /warnaserror
using System.Runtime.InteropServices;

public class MyClass


{
static extern public void mf(); // CS0626
// try the following line
// [DllImport("mydll.dll")] static extern public void mf();

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0658


Mensaje de error
'modificador de atributo' no es una ubicación de atributo reconocida. Todos los atributos de este bloque se omitirán.
'attribute modifier' is not a recognized attribute location. All attributes in this block will be ignored.
Se ha especificado un modificador de atributo no válido. Vea Destinos de atributos para obtener más información.
El código siguiente genera el error CS0658:

// CS0658.cs
using System;
public class TestAttribute : Attribute{}
[badAttributeLocation: Test] // CS0658, badAttributeLocation is invalid
class ClassTest
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0672


Mensaje de error
El miembro 'miembro1' reemplaza al miembro obsoleto 'miembro2'. Agregue el atributo Obsolete a 'miembro1'
Member 'member1' overrides obsolete member 'member2. Add the Obsolete attribute to 'member1'
El compilador encontró un reemplazo (override) de un método marcado como obsolete. Sin embargo, el método de
reemplazo no estaba marcado como obsolete. El método de reemplazo generará la advertencia CS0612 si es llamado.
Repase sus declaraciones de método e indique explícitamente si debe marcarse un método (y todos sus reemplazos) como
obsolete.
El código siguiente genera la advertencia CS0672:

// CS0672.cs
// compile with: /W:1
class MyClass
{
[System.Obsolete]
public virtual void ObsoleteMethod()
{
}
}

class MyClass2 : MyClass


{
public override void ObsoleteMethod() // CS0672
{
}
}

class MainClass
{
static public void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0684


Mensaje de error
La interfaz 'interfaz' marcada con la clase 'CoClassAttribute' no está marcada con 'ComImportAttribute'
'interface' interface marked with 'CoClassAttribute' not marked with 'ComImportAttribute'
Si especifica CoClassAttribute en una interfaz, también debe especificar ComImportAttribute.
El código siguiente genera el error CS0684:

// CS0684.cs
// compile with: /W:1
using System;
using System.Runtime.InteropServices;

[CoClass(typeof(C))] // CS0684
// try the following line instead
// [CoClass(typeof(C)), ComImport]
interface I
{
}

class C
{
static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS0688


Mensaje de error
'método1' tiene una petición de vínculo, pero reemplaza o implementa 'método2', que no tiene dicha petición. Puede existir
una carencia de seguridad.
'method1' has a link demand, but overrides or implements 'method2' which does not have a link demand. A security hole may
exist.
La petición de vínculo establecida en el método de clase derivada se puede evitar con facilidad llamando al método de clase
base. Para eliminar la carencia de seguridad, es preciso utilizar la petición de vínculo también en el método de clase base. Para
obtener más información, vea Demand frente a LinkDemand.
Ejemplo
El código siguiente genera la advertencia CS0688. Para resolver la advertencia sin modificar la clase base, elimine el atributo
de seguridad del método que reemplaza. Tenga en cuenta que de este modo no resolverá el problema de seguridad.

// CS0688.cs
// compile with: /W:1
using System;
using System.Security.Permissions;

class Base
{
//Uncomment the following line to close the security hole
//[FileIOPermission(SecurityAction.LinkDemand, All=@"C:\\")]
public virtual void DoScaryFileStuff()
{
}
}

class Derived: Base


{
[FileIOPermission(SecurityAction.LinkDemand, All=@"C:\\")] // CS0688
public override void DoScaryFileStuff()
{
}
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1030


Mensaje de error
#warning: 'texto'
#warning: 'text'
Muestra el texto de una advertencia definida mediante la directiva #warning.
El código siguiente muestra cómo crear una advertencia definida por el usuario:

// CS1030.cs
class Sample
{
static void Main()
{
#warning Let's give a warning here // CS1030
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1200


Mensaje de error
La característica 'característica_no_válida' se dejó de utilizar. Utilice 'característica válida' en su lugar.
The feature 'invalid feature' is deprecated. Please use 'valid feature' instead'.
La característica que desea utilizar está en desuso. Actualice el código para utilizar la característica válida en su lugar.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1201


Mensaje de error
La característica 'característica_no_válida' está en desuso. Utilice 'característica_válida' en su lugar.
The feature 'invalid feature' is deprecated. Please use 'valid feature' instead.
La característica que desea utilizar está en desuso. Actualice el código para utilizar la característica válida en su lugar.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1202


Mensaje de error
La característica 'característica_no_válida' se dejó de utilizar. Utilice 'característica válida' en su lugar.
The feature 'invalid feature' is deprecated. Please use 'valid feature' instead'.
La característica que desea utilizar está en desuso. Actualice el código para utilizar la característica válida en su lugar.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1203


The feature 'invalid feature' is deprecated. Please use 'valid feature' instead'.
La característica 'característica no válida' se dejó de utilizar. Utilice 'característica válida' en su lugar.
La característica que desea utilizar está en desuso. Actualice el código para usar la característica válida en su lugar.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1522


Mensaje de error
Bloque switch vacío
Empty switch block
El compilador detectó un bloque switch sin ninguna instrucción case o default. Un bloque switchdebe tener una o varias
instrucciones case o default.
El código siguiente genera la advertencia CS1522:

// CS1522.cs
// compile with: /W:1
using System;
class x
{
public static void Main()
{
int i = 6;

switch(i) // CS1522
{
// add something to the switch block, for example:
/*
case (5):
Console.WriteLine("5");
return;
default:
Console.WriteLine("not 5");
return;
*/
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1570


Mensaje de error
El comentario XML en 'construcción' tiene código XML con formato incorrecto — 'causa'
XML comment on 'construct' has badly formed XML — 'reason'
Al utilizar /doc, los comentarios del código fuente deben crearse en XML. Cualquier error con el formato XML generará la
advertencia CS1570. Por ejemplo:
Si se pasa una cadena a cref, como en la etiqueta <exception>, la cadena debe ir entre comillas.
Si se utiliza una etiqueta, como <seealso>, que no tiene una etiqueta de cierre, se debe especificar una barra (/) antes del
corchete angular de cierre.
Si se necesita utilizar un símbolo mayor que o menor que en el texto de la descripción, deberá representarse como &gt;
o &lt;.
El atributo de archivo o ruta de acceso de una etiqueta <include> falta o no está correctamente formado.
El código siguiente genera la advertencia CS1570:

// CS1570.cs
// compile with: /W:1
namespace ns
{
// the following line generates CS1570
/// <summary> returns true if < 5 </summary>
// try this instead
// /// <summary> returns true if &lt;5 </summary>

public class MyClass


{
public static void Main ()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1574


Mensaje de error
El comentario XML en 'construcción' tiene el atributo cref 'elemento' que no se pudo resolver
XML comment on 'construct' has cref attribute 'item' that could not be resolved
Una cadena pasada a una etiqueta cref, por ejemplo, dentro de una etiqueta <exception>, hace referencia a un miembro que
no está disponible en el entorno de generación actual. La cadena que se pase a una etiqueta cref debe ser el nombre
sintácticamente correcto de un miembro o campo.
Para obtener más información, vea Etiquetas recomendadas para comentarios de documentación.
El código siguiente genera la advertencia CS1574:

// CS1574.cs
// compile with: /W:1 /doc:x.xml
using System;

/// <exception cref="System.Console.WriteLin">An exception class.</exception> // CS1574


// instead, uncomment and try the following line
// /// <exception cref="System.Console.WriteLine">An exception class.</exception>
class EClass : Exception
{
}

class TestClass
{
public static void Main()
{
try
{
}
catch(EClass)
{
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1580


Mensaje de error
Tipo no válido para el parámetro 'número de parámetro' en el atributo cref del comentario XML
Invalid type for parameter 'parameter number' in XML comment cref attribute
Al intentar hacer referencia a la forma sobrecargada de un método, el compilador detectó un error de sintaxis. Normalmente
ello indica que se especificó el nombre de parámetro en lugar de su tipo. Una línea de código mal formada aparecerá en el
archivo XML generado.
El código siguiente genera la advertencia CS1580:

// CS1580.cs
// compile with: /W:1 /doc:x.xml
using System;

/// <seealso cref="Test(i)"/> // CS1580


// try the following line instead
// /// <seealso cref="Test(int)"/>
public class MyClass
{
/// <summary>help text</summary>
public static void Main()
{
}

/// <summary>help text</summary>


public void Test(int i)
{
}

/// <summary>help text</summary>


public void Test(char i)
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1581


Mensaje de error
Tipo de valor devuelto no válido en el atributo cref del comentario XML
Invalid return type in XML comment cref attribute
Al intentar hacer referencia a un método, el compilador detectó un error debido a un tipo de valor devuelto no válido.
Ejemplo
El código siguiente genera la advertencia CS1581:

// CS1581.cs
// compile with: /W:1 /doc:x.xml

/// <summary>help text</summary>


public class MyClass
{
/// <summary>help text</summary>
public static void Main()
{
}

/// <summary>help text</summary>


public static explicit operator int(MyClass f)
{
return 0;
}
}

/// <seealso cref="MyClass.explicit operator intt(MyClass)"/> // CS1581


// try the following line instead
// /// <seealso cref="MyClass.explicit operator int(MyClass)"/>
public class MyClass2
{
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1584


Mensaje de error
El comentario XML en 'miembro' tiene un atributo cref 'sintaxis_no_válida' que es sintácticamente incorrecto
XML comment on 'member' has syntactically incorrect cref attribute 'invalid_syntax'
Uno de los parámetros pasados a una etiqueta para comentarios de documentación tiene una sintaxis incorrecta. Para obtener
más información, vea Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#).
Ejemplo
El código siguiente genera la advertencia CS1584.

// CS1584.cs
// compile with: /W:1 /doc:CS1584.xml
/// <remarks>Test class</remarks>
public class Test
{
/// <remarks>Called in <see cref="Test.Mai()n"/>.</remarks> // CS1584
// try the following line instead
// /// <remarks>Called in <see cref="Test.Main()"/>.</remarks>
public static void Test2() {}

/// <remarks>Main method</remarks>


public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1589


Mensaje de error
No se puede incluir el fragmento de XML 'fragmento' del archivo 'archivo' -- causa
Unable to include XML fragment 'fragment' of file 'file' -- reason
La sintaxis (fragmento) de una etiqueta <include>, que hacía referencia a un archivo (file), es incorrecta por la causa
especificada.
Se insertará una línea de código mal formada en el archivo XML generado.
El código siguiente genera la advertencia CS1589:

// CS1589.cs
// compile with: /W:1 /doc:CS1589_out.xml

/// <include file='CS1589.doc' path='MyDocs/MyMembers[@name="test"]/' /> // CS1589


// try the following line instead
// /// <include file='CS1589.doc' path='MyDocs/MyMembers[@name="test"]/*' />
class Test
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1590


Mensaje de error
Elemento de inclusión XML no válido – Falta el atributo de archivo
Invalid XML include element -- Missing file attribute
El atributo de ruta de acceso o documentación pasado a la etiqueta <include> falta o está incompleto.
El código siguiente genera la advertencia CS1590:

// CS1590.cs
// compile with: /W:1 /doc:x.xml

/// <include path='MyDocs/MyMembers[@name="test"]/*' /> // CS1590


// try the following line instead
// /// <include file='x.doc' path='MyDocs/MyMembers[@name="test"]/*' />
class Test
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1592


Mensaje de error
XML con formato incorrecto en el archivo de comentarios de inclusión -- 'causa'
Badly formed XML in included comments file -- 'reason'
Se detectó un problema (causa) en el archivo especificado por la etiqueta <include>.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1598


Mensaje de error
El analizador XML no se puede cargar por la siguiente razón: 'razón'. El archivo de documentación XML 'archivo' no se
generará.
XML parser could not be loaded for the following reason: 'reason'. The XML documentation file 'file' will not be generated.
Se especificó la opción /doc, pero el compilador no pudo encontrar y cargar msxml3.dll. Asegúrese de que el archivo
msxml3.dll está instalado y registrado en el sistema.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1607


Mensaje de error
Generación de ensamblado -- causa
Assembly generation -- reason
Se generó una advertencia en la fase de creación de ensamblado de la compilación.
Si genera una aplicación de 64 bits en una plataforma de 32 bits, debe asegurarse de que las versiones de 64 bits de todos los
ensamblados a los que se hace referencia están instalados en la plataforma de destino.
Todos los ensamblados de Common Language Runtime (CLR) específicos de x86 tienen homólogos de 64 bits (cada
ensamblado de CLR existirá en todas las plataformas). Por consiguiente, puede pasar por alto la advertencia CS1607 para los
ensamblados de CLR sin ningún riesgo.
Para obtener más información, vea Errores y advertencias de la herramienta Al.exe.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1616


Mensaje de error
La opción 'opción' reemplaza al atributo 'atributo' dado en el archivo de código fuente o módulo agregado
Option 'option' overrides attribute 'attribute' given in a source file or added module
Esta advertencia se produce cuando los atributos de ensamblado AssemblyKeyFile o AssemblyKeyName del código fuente
están en conflicto con el nombre del archivo de clave, el contenedor claves o la opción de línea de comandos /keyfile o
/keycontainer especificados en las propiedades del proyecto.
Para el ejemplo siguiente, supongamos que existe un archivo de clave denominado cs1616.snk. Este archivo se puede generar
mediante la línea de comandos:

sn –k CS1616.snk

El código siguiente genera la advertencia CS1616:

// CS1616.cs
// compile with: /keyfile:cs1616.snk
using System.Reflection;

// To fix the error, remove the next line


[assembly: AssemblyKeyFile("cs1616b.snk")] // CS1616

class C
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1633


Mensaje de error
Directiva #pragma no reconocida
Unrecognized #pragma directive
La directiva pragma empleada no corresponde a ninguna de las directivas pragma admitidas por el compilador de C#. Para
resolver este error, utilice sólo directivas pragma compatibles.
En el código siguiente se genera el error CS1633:

// CS1633.cs
// compile with: /W:1
#pragma unknown // CS1633

class C
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1634


Mensaje de error
Se esperaba disable o restore
Expected disable or restore
Este error se produce si una cláusula de advertencia #pragma no tiene el formato correcto, por ejemplo si se ha omitido
disable o restore. Para obtener más información, vea el tema #pragma warning.
Ejemplo
El código siguiente genera la advertencia CS1634:

// CS1634.cs
// compile with: /W:1

#pragma warning // CS1634


// Try this instead:
// #pragma warning disable 0219

class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1635


Mensaje de error
No se puede restaurar la advertencia 'código de advertencia' porque estaba deshabilitada globalmente
Cannot restore warning 'warning code' because it was disabled globally
Esta advertencia aparece si utiliza la opción de la línea de comandos /nowarn o la configuración de proyecto correspondiente
para deshabilitar una advertencia en toda la unidad de compilación, pero utiliza #pragma warning restore para intentar
restaurar dicha advertencia. Para resolver este error, quite la opción de la línea de comandos /nowarn o la configuración del
proyecto correspondiente, o quite la directiva #pragma warning restore de cualquier advertencia que está deshabilitando a
través de la línea de comandos o configuración del proyecto. Para obtener más información, vea el tema Advertencia #pragma.
En el código siguiente se genera el error CS1635:

// CS1635.cs
// compile with: /w:1 /nowarn:162

enum MyEnum {one=1,two=2,three=3};

class MyClass
{
public static void Main()
{
#pragma warning disable 162

if (MyEnum.three == MyEnum.two)
System.Console.WriteLine("Duplicate");

#pragma warning restore 162


}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1645


Mensaje de error
La característica 'característica' no forma parte de la especificación de lenguaje C# ISO normalizado y puede que otros
compiladores no la admitan
Feature 'feature' is not part of the standardized ISO C# language specification, and may not be accepted by other compilers
La característica que está empleando no forma parte de la norma ISO. Puede que el código que utiliza esta característica no se
compile en otros compiladores.

// CS1645.cs
// compile with: /W:1 /t:module /langversion:ISO-1
[assembly:System.CLSCompliant(false)]
// To supress the warning use the switch: /nowarn:1645
[module:System.CLSCompliant(false)] // CS1645
class Test
{
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1658


Mensaje de error
'texto de advertencia'. Vea también el error 'código de error'
'warning text'. See also error 'error code'
El compilador emite esta advertencia cuando reemplaza un error por una advertencia. Para obtener información acerca del
problema, consulte el error mencionado. Para encontrar el error correspondiente en el IDE de Visual Studio, utilice el índice.
Por ejemplo, si en el texto anterior se lee "Vea también el error 'CS1037'," busque CS1037 en el índice.
Ejemplo
En el siguiente ejemplo se genera el error CS1658.

// CS1658.cs
// compile with: /doc:x.xml
// CS1584 expected
/// <summary>
/// </summary>
public class C
{
/// <see cref="C.F(params object[])"/> // CS1658
public static void M()
{
}

/// <summary>
/// </summary>
public void F(params object[] o)
{
}

static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1682


Mensaje de error
La referencia al tipo 'tipo' indica que está anidado en 'tipo anidado', pero no se pudo encontrar
Reference to type 'type' claims it is nested within 'nested type', but it could not be found
Este error se produce cuando se importa referencias que no se corresponden con otras referencias o con código ya escrito.
Este error se produce comúnmente cuando se escribe código que hace referencia a una clase en metadatos y, a continuación,
se elimina esa clase o se modifica su definición.
Ejemplo
// CS1682.cs
// compile with: /target:library /keyfile:mykey.snk
public class A {
public class N1 {}
}

// CS1682_b.cs
// compile with: /target:library /reference:CS1682.dll
using System;
public class Ref {

public static A A1() {


return new A();
}

public static A.N1 N1() {


return new A.N1();
}
}

// CS1682_c.cs
// compile with: /target:library /keyfile:mykey.snk /out:CS1682.dll
public class A {
public void M1() {}
}

El código siguiente genera la advertencia CS1682.

// CS1682_d.cs
// compile with: /reference:CS1682.dll /reference:CS1682_b.dll /W:1
// CS1682 expected
class Tester {
static void Main()
{
Ref.A1().M1();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1683


Mensaje de error
La referencia al tipo 'Nombre de tipo' confirma que está definido en este ensamblado, pero no lo está en el código fuente ni en
los módulos agregados
Reference to type 'Type Name' claims it is defined in this assembly, but it is not defined in source or any added modules
Este error puede aparecer al importar un ensamblado que contiene una referencia al ensamblado que está compilando
actualmente, y este último no contiene nada que coincida con la referencia. Una manera de llegar a esta situación es compilar
el ensamblado, que inicialmente contiene el miembro al que hace referencia el ensamblado que se está importando. A
continuación, actualiza el ensamblado, quitando por error los miembros a los que hace referencia el ensamblado importado.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1684


Mensaje de error
La referencia al tipo 'Nombre de tipo' indica que está definida en 'Espacio de nombres', pero no se pudo encontrar
Reference to type 'Type Name' claims it is defined in 'Namespace', but it could not be found
Este error puede deberse a la existencia de una referencia dentro de un espacio de nombres que hace referencia a un tipo que
dice existir dentro de un segundo espacio de nombres, pero no es así. Por ejemplo, mydll.dll indica que el tipo A existe dentro
de yourdll.dll, pero no es así. Una causa posible de este error es que la versión de yourdll.dll que se usa sea demasiado antigua
y todavía no se haya definido A en el archivo.
El código siguiente genera la advertencia CS1684.
Ejemplo
// CS1684_a.cs
// compile with: /target:library /keyfile:CS1684.key
public class A {
public void Test() {}
}

public class C2 {}

// CS1684_b.cs
// compile with: /target:library /r:cs1684_a.dll
// post-build command: del /f CS1684_a.dll
using System;
public class Ref
{
public static A GetA() { return new A(); }
public static C2 GetC() { return new C2(); }
}

Volvemos a generar ahora el primer ensamblado, omitiendo la definición de la clase C2 que no se va a definir en la nueva
compilación.

// CS1684_c.cs
// compile with: /target:library /keyfile:CS1684.key /out:CS1684_a.dll
public class A {
public void Test() {}
}

Este módulo hace referencia al segundo módulo por medio del identificador Ref. Sin embargo, el segundo módulo contiene
una referencia a la clase C2 que ya no existe debido a la compilación del paso anterior y, por consiguiente, al compilar este
módulo se devuelve el mensaje de error CS1684.

// CS1684_d.cs
// compile with: /reference:cs1684_a.dll /reference:cs1684_b.dll
// CS1684 expected
class Tester
{
public static void Main()
{
Ref.GetA().Test();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1685


Mensaje de error
El tipo predefinido 'nombre de System.type' está definido en varios ensamblados del alias global; se utiliza la definición de
'Nombre de archivo'
The predefined type 'System.type name' is defined in multiple assemblies in the global alias; using definition from 'File Name'
Este error aparece cuando un tipo de sistema predefinido como System.int32 se encuentra en dos ensamblados. Una manera
de que esto pueda suceder es si está haciendo referencia a mscorlib desde dos lugares diferentes, como en el caso de que esté
intentando ejecutar las versiones 1.0 y 1.1 de .Net Framework una junto a la otra.
El compilador utilizará la definición desde sólo uno de los ensamblados. El compilador sólo busca en alias globales, no busca
en las bibliotecas definidas por /reference. Si ha especificado el modificador /nostdlib, el compilador buscará Object y, en el
futuro, iniciará todas las búsquedas de tipos predefinidos en el archivo donde encontró Object.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1687


Mensaje de error
El archivo de código fuente ha sobrepasado el límite de 16.707.565 líneas representables en el PDB. La información de
depuración no será correcta.
Source file has exceeded the limit of 16,707,565 lines representable in the PDB, debug information will be incorrect
El PDB y el depurador tienen algunas limitaciones sobre el tamaño que puede tener un archivo. Si el archivo de código fuente
es demasiado grande, el depurador no se comportará correctamente más allá de ese límite. El usuario no debe emitir
información de depuración para dicho archivo, posiblemente utilizando #line hidden, o bien debe encontrar una manera de
comprimir el archivo, quizás dividiéndolo en varios archivos. Puede que resulte conveniente utilizar la palabra clave partial
para dividir una clase de gran tamaño.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1691


Mensaje de error
'número' no es un número de advertencia válido
'number' is not a valid warning number
El número pasado a la directiva del preprocesador #pragma warning no era un número de advertencia válido. Compruebe que
el número represente una advertencia, no un error ni otra secuencia de caracteres.
Ejemplo
El siguiente ejemplo genera la advertencia CS1691.

// CS1691.cs
public class C
{
int i = 1;
public static void Main()
{
C myC = new C();
#pragma warning disable 151 // CS1691
// Try the following line instead:
// #pragma warning disable 1645
myC.i++;
#pragma warning restore 151 // CS1691
// Try the following line instead:
// #pragma warning restore 1645
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1692


Mensaje de error
Número no válido
Invalid number
Varias directivas de preprocesador, como #pragma y #line, utilizan números como parámetros. Uno de estos números no es
válido porque es demasiado grande, su formato es incorrecto, contiene caracteres no válidos, etc. Para corregir este error,
corrija el número.
Ejemplo
El siguiente ejemplo genera la advertencia CS1692.

// CS1692.cs

#pragma warning disable a // CS1692


// Try this instad:
// #pragma warning disable 1691

class A
{
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1694


Mensaje de error
Nombre de archivo no válido especificado para la directiva del preprocesador. Nombre de archivo demasiado largo o no
válido.
Invalid filename specified for preprocessor directive. Filename is too long or not a valid filename.
Esta advertencia aparece al utilizar la directiva del preprocesador #pragma checksum. El nombre de archivo especificado es
más largo de 256 caracteres. Para resolver esta advertencia, utilice un nombre de archivo más corto.
Ejemplo
En el siguiente ejemplo se genera la advertencia CS1694.

// cs1694.cs
#pragma checksum "MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile123
4567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFi
le1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile1234567890MyFile123456789
0.txt" {00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F} // CS1694
class MyClass {}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1695


Mensaje de error
Sintaxis de suma de comprobación #pragma no válida; debe ser #pragma <suma de comprobación> "nombre de archivo" "
{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..."
Invalid #pragma checksum syntax; should be #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
"XXXX..."
Raramente encontrará este error, puesto que generalmente la suma de comprobación se inserta en tiempo de ejecución si está
generando código por medio de la API CodeDom.
Sin embargo, si teclea esta instrucción #pragma y transcribe mal el identificador GUID o la suma de comprobación, obtendrá
este error. La comprobación de la sintaxis por parte del compilador no valida que haya escrito un identificador GUID
correctamente, pero sí comprueba que haya el número correcto de dígitos y delimitadores, y que los dígitos son
hexadecimales. Igualmente, comprueba que la suma de comprobación contenga un número par de dígitos, y que los dígitos
sean hexadecimales.
Ejemplo
En el siguiente ejemplo se genera el error CS1695.

// CS1695.cs

#pragma checksum "12345" // CS1695

public class Test


{
static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1696


Mensaje de error
Se esperaba un comentario de una línea o un fin de línea
Single-line comment or end-of-line expected
El compilador requiere que la directiva de preprocesador vaya seguida por un terminador del fin de línea o por un comentario
de una sola línea. El compilador ha terminado de procesar una directiva de preprocesador válida pero ha encontrado algo que
infringe esta restricción de la sintaxis.
Ejemplo
El siguiente ejemplo genera la advertencia CS1696.

// CS1696.cs
class Test
{
public static void Main()
{
#pragma warning disable 1030;219 // CS1696
#pragma warning disable 1030 // OK
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1697


Mensaje de error
Se han proporcionado distintos valores de suma de comprobación para 'nombre de archivo'
Different checksum values given for 'file name'
Ha especificado más de una suma de comprobación para un archivo determinado. El depurador utiliza el valor de la suma de
comprobación para determinar qué archivo debe depurar cuando un proyecto contiene más de uno con el mismo nombre. En
la mayoría de los casos no se produce este error, pero si se escribe una aplicación que genera código, puede surgir. Para
resolver este error, asegúrese de generar la suma de comprobación una sola vez para cualquier archivo de código concreto.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1699


Mensaje de error
Utilizar la opción "opción_del_compilador" de la línea de comandos o la configuración de proyecto adecuada en vez de
"nombre_de_atributo"
Use command line option "compiler_option" or appropriate project settings instead of "attribute_name"
Para firmar un ensamblado, es necesario especificar un archivo de clave. Antes de Microsoft Visual C# 2005, se especificaba el
archivo de clave utilizando los atributos de CLR en el código fuente. Estos atributos se han dejado de utilizar.
A partir de Microsoft Visual C# 2005, debe utilizar la Página de firma del Diseñador de proyectos o la herramienta
Assembly Linker para especificar el archivo de clave.
La Página de firma del Diseñador de proyectos es el método preferido; para obtener más información, vea
Página Firma, Diseñador de proyectos y Administrar la firma de ensamblados y manifiestos.
En Cómo: Firmar un ensamblado con un nombre seguro se utilizan las opciones del compilador siguientes:
/keyfile (Especificar archivo clave con nombre seguro) (Opciones del compilador de C#) en lugar del atributo
AssemblyKeyFileAttribute.
/keycontainer (Especificar contenedor de claves con nombre seguro) (Opciones del compilador de C#) en lugar de
AssemblyKeyNameAttribute.
/delaysign (Retardar la firma del ensamblado) (Opciones del compilador de C#) en lugar de AssemblyDelaySignAttribute.
Estos atributos han quedado en desuso por las razones siguientes:
Existían problemas de seguridad debido a que los atributos se incrustaban en los archivos binarios generados por el
compilador. Todo el que tenía un archivo binario también disponía de las claves almacenadas en el mismo.
Había problemas de uso debido al hecho de que la ruta de acceso especificada en los atributos era relativa al directorio
de trabajo actual, el cual podía cambiar en el entorno de desarrollo integrado (IDE), o al directorio de resultados. Así, la
mayoría de las veces es probable que el archivo de clave sea ..\\..\\miclave.snk. Los atributos también hacían que fuera
más difícil para el sistema de proyectos firmar correctamente los ensamblados satélite. Cuando utilice las opciones del
compilador en lugar de estos atributos, puede utilizar una ruta de acceso completa y un nombre de archivo para la clave
sin que se incruste nada en el archivo de resultados; el sistema de proyectos y el sistema de control del código fuente
pueden manipular correctamente esa ruta de acceso cuando se trasladan los proyectos de una ubicación a otra; el
sistema de proyectos puede mantener una ruta de acceso relativa al proyecto para el archivo de clave y aun así pasar una
ruta de acceso completa al compilador; otros programas de generación pueden firmar los resultados con mayor facilidad
pasando la ruta de acceso apropiada directamente al compilador, en lugar de generar un archivo de código fuente con
los atributos correctos.
El uso de atributos con ensamblados de confianza puede afectar a la eficacia del compilador. Cuando utiliza atributos, el
compilador no conoce lo que es la clave cuando tiene que decidir si conceder o no la confianza y, por tanto, tiene que
adivinar. Al final de la compilación, el compilador puede comprobar si su suposición es correcta una vez que conoce la
clave finalmente. Cuando el archivo de clave se especifica con una opción del compilador, el compilador puede decidir
inmediatamente si le otorga confianza.
Ejemplo
El código siguiente genera el error CS1699. Para resolver el error, quite el atributo y compile con /delaysign.

// CS1699.cs
// compile with: /target:library
[assembly:System.Reflection.AssemblyDelaySign(true)] // CS1699

Vea también
Tareas
Cómo: Firmar un ensamblado con un nombre seguro
Referencia
Página Firma, Diseñador de proyectos
Otros recursos
Administrar la firma de ensamblados y manifiestos
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1707


Mensaje de error
El delegado 'Nombre_de_delegado' está enlazado a 'Nombre_de_método1' en vez de a 'Nombre_de_método2' a causa de las
nuevas reglas de lenguaje
Delegate 'DelegateName' bound to 'MethodName1' instead of 'MethodName2' because of new language rules
C# 2.0 implementa nuevas reglas para enlazar un delegado a un método. Se tiene en cuenta información adicional que antes
se pasaba por alto. Esta advertencia indica que, ahora, el delegado se enlaza a una sobrecarga del método distinta de aquélla a
la que estaba enlazado previamente. Puede ser conveniente comprobar si realmente el delegado debe enlazarse a
'Nombre_de_método1' en lugar de a 'Nombre_de_método2'.
Para obtener una descripción de cómo determina el compilador a qué método se debe enlazar un delegado, vea
Covarianza y contravarianza en los delegados (Guía de programación de C#).
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1709


Mensaje de error
El nombre de archivo especificado para la directiva de preprocesador está vacío
Filename specified for preprocessor directive is empty
Ha especificado una directiva de preprocesador que incluye un nombre de archivo pero dicho archivo está vacío. Para resolver
esta advertencia, coloque el contenido necesario en el archivo.
Ejemplo
En el siguiente ejemplo se genera el error CS1709.

// CS1709.cs
class Test
{
static void Main()
{
#pragma checksum "" "{406EA660-64CF-4C82-B6F0-42D48172A799}" "" // CS1709
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1720


Mensaje de error
La expresión siempre producirá System.NullReferenceException porque el valor predeterminado de 'tipo genérico' es null
Expression will always cause a System.NullReferenceException because the default value of 'generic type' is null
Si escribe una expresión que incluye el valor predeterminado de una variable de tipo genérico y cuyo tipo es de referencia (por
ejemplo, una clase), se producirá este error. Observe la siguiente expresión:

default(T).ToString()

Puesto que T es un tipo de referencia, su valor predeterminado es null y, al intentar para aplicarle el método ToString,
producirá una excepción NullReferenceException.
Ejemplo
La restricción de referencia de clase sobre el tipo T garantiza que T sea un tipo de referencia.
El código siguiente genera la advertencia CS1720.

// CS1720.cs
using System;
public class Tester
{
public static void GenericClass<T>(T t1) where T : class
{
Console.WriteLine(default(T).ToString()); // CS1720
}
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1723


Mensaje de error
El comentario XML de 'param' tiene un atributo cref 'atributo' que hace referencia a un parámetro de tipo
XML comment on 'param' has cref attribute 'attribute' that refers to a type parameter
Un comentario XML en el que se hace referencia a un parámetro de tipo genera este error.
Ejemplo
En el siguiente ejemplo se genera el error CS1723.

// CS1723.cs
// compile with: /t:library /doc:filename.XML
///<summary>A generic list class.</summary>
///<see cref="T" /> // CS1723
// To resolve comment the previous line.
public class List<T>
{
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1911


Mensaje de error
El acceso al miembro 'miembro' a través de una palabra clave 'base' desde un iterador o método anónimo genera un código
que no se puede comprobar.
Access to member 'member' through a 'base' keyword from an anonymous method or iterator results in unverifiable code.
Las llamadas a funciones virtuales con la palabra clave base dentro del cuerpo del método de un iterador o métodos
anónimos generan un código que no se puede comprobar. Dicho código no se podrá ejecutar en un entorno de confianza
parcial.
Una solución para la advertencia CS1911 es mover la llamada a la función virtual a una función auxiliar.
Ejemplo
El código siguiente genera la advertencia CS1911.

// CS1911.cs
// compile with: /W:1
using System;

delegate void D();


delegate D RetD();

class B {
protected virtual void M() {
Console.WriteLine("B.M");
}
}

class Der : B {
protected override void M() {
Console.WriteLine("D.M");
}

void Test() { base.M(); }


D Test2() { return new D(base.M); }

public D CallBaseM() {
return delegate () { base.M(); }; // CS1911
// try the following line instead
// return delegate () { Test(); };
}

public RetD DelToBaseM() {


return delegate () { return new D(base.M); }; // CS1911

// try the following line instead


// return delegate () { return Test2(); };
}
}

class Program {
public static void Main() {
Der der = new Der();
D d = der.CallBaseM();
d();
RetD rd = der.DelToBaseM();
rd()();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS2002


Mensaje de error
El archivo de código fuente 'archivo' se ha especificado varias veces
Source file 'file' specified multiple times
Se pasó al compilador un nombre de archivo de código fuente más de una vez. Sólo se puede especificar una vez un archivo
para que el compilador genere un archivo de resultados.
El código siguiente genera el error CS2002:

// CS2002.cs
// compile with: CS2002.cs
public class A
{
public static void Main(){}
}

Para generar el error, compile el ejemplo con la siguiente línea de comandos:

csc CS2002.cs CS2002.cs


Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS2014


Mensaje de error
La opción del compilador 'opción antigua' es obsoleta; en su lugar, utilice 'opción nueva'
Compiler option 'old option' is obsolete, please use 'new option' instead
La forma de esta opción del compilador ha quedado en desuso. Para obtener más información, vea
Opciones del compilador de C#.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS2023


Mensaje de error
Omitiendo la opción /noconfig porque se especificó en un archivo de respuesta
Ignoring /noconfig option because it was specified in a response file
Se especificó la opción /noconfig del compilador en un archivo de respuesta, lo cual no está permitido.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3000


Mensaje de error
Los métodos con argumentos variables no son compatibles con CLS
Methods with variable arguments are not CLS-compliant
Los argumentos utilizados en el método exponen características no incluidas en Common Language Specifications (CLS). Para
obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS.
En el siguiente ejemplo se genera la advertencia CS3000.

// CS3000.cs
// compile with: /target:library
// CS3000 expected
[assembly:System.CLSCompliant(true)]

public class Test


{
public void AddABunchOfInts( __arglist ) {} // CS3000
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3001


Mensaje de error
El tipo de argumento 'tipo' no es compatible con CLS
Argument type 'type' is not CLS-compliant
Un método public, protected o protected internal debe aceptar un parámetro cuyo tipo sea compatible con Common
Language Specification (CLS). Para obtener más información sobre la compatibilidad con CLS, vea
Escribir código compatible con CLS y Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera el error CS3001:

// CS3001.cs

[assembly:System.CLSCompliant(true)]
public class a
{
public void bad(ushort i) // CS3001
{
}

private void OK(ushort i) // OK, private method


{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3002


Mensaje de error
El tipo de valor devuelto de 'método' no es compatible con CLS
Return type of 'method' is not CLS-compliant
Un método public, protected o protected internal debe devolver un valor cuyo tipo sea compatible con Common Language
Specification (CLS). Para obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
El ejemplo siguiente genera la advertencia CS3002:

// CS3002.cs

[assembly:System.CLSCompliant(true)]
public class a
{
public ushort bad() // CS3002, public method
{
ushort a;
a = ushort.MaxValue;
return a;
}

private ushort OK() // OK, private method


{
ushort a;
a = ushort.MaxValue;
return a;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3003


Mensaje de error
El tipo de 'variable' no es compatible con CLS
Type of 'variable' is not CLS-compliant
Una variable public, protected o protected internal debe ser de un tipo compatible con Common Language Specification
(CLS). Para obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
El ejemplo siguiente genera la advertencia CS3003:

// CS3003.cs

[assembly:System.CLSCompliant(true)]
public class a
{
public ushort a1; // CS3003, public variable
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3004


Mensaje de error
Los caracteres Unicode mixtos y descompuestos no son compatibles con CLS
Mixed and decomposed Unicode characters are not CLS-compliant
Sólo se permiten caracteres UNICODE compuestos en los identificadores public, protected o protected internal con el fin de
mantener la compatibilidad con Common Language Specification (CLS). Para obtener más información sobre la compatibilidad
con CLS, vea Escribir código compatible con CLS y Common Language Specification.

Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3005


Mensaje de error
El identificador 'identificador' que sólo se diferencia por el uso de mayúsculas o minúsculas no es compatible con CLS
Identifier 'identifier' differing only in case is not CLS-compliant
Un identificador public, protected o protected internal, que sólo se diferencia de otro identificador public, protected o
protected internal en las mayúsculas o minúsculas de una o varias letras, no es compatible con Common Language
Specification (CLS). Para obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
El ejemplo siguiente genera la advertencia CS3003:

// CS3005.cs

using System;

[assembly:CLSCompliant(true)]
public class a
{
public static int a1 = 0;
public static int A1 = 1; // CS3005

public static void Main()


{
Console.WriteLine(a1);
Console.WriteLine(A1);
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3006


Mensaje de error
El método sobrecargado 'método' que sólo se diferencia por ref u out, o en el rango de matriz, no es compatible con CLS
Overloaded method 'method' differing only in ref or out, or in array rank, is not CLS-compliant
Un método no se puede sobrecargar basándose en el parámetro ref u out y seguir siendo compatible con Common Language
Specification (CLS). Para obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera CS3006. Para resolver esta advertencia, convierta en comentario el atributo de nivel de
ensamblado o quite una de las definiciones de método.

// CS3006.cs

using System;

[assembly: CLSCompliant(true)]
public class MyClass
{
public void f(int i)
{
}

public void f(ref int i) // CS3006


{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3007


Mensaje de error
El método sobrecargado 'método' que sólo se diferencia por tipos de matriz sin nombre no es compatible con CLS
Overloaded method 'method' differing only by unnamed array types is not CLS-compliant
Este error aparece si tiene un método sobrecargado que toma una matriz escalonada (jagged array) y la única diferencia entre
las firmas de método es el tipo de elemento de la matriz. Para evitar este error, piense en utilizar una matriz rectangular en
lugar de una matriz escalonada; utilice un parámetro adicional para eliminar la ambigüedad de la llamada a la función; cambie
el nombre de uno o varios métodos sobrecargados; o bien, si no es necesaria la compatibilidad con CLS, quite el atributo
CLSCompliantAttribute. Para obtener más información sobre la compatibilidad con CLS, vea
Escribir código compatible con CLS y Common Language Specification.
Ejemplo
En el siguiente ejemplo se genera el error CS3007:

// CS3007.cs
[assembly: System.CLSCompliant(true)]
public struct S
{
public void F(int[][] array) { }
public void F(byte[][] array) { } // CS3007
// Try this instead:
// public void F1(int[][] array) {}
// public void F2(byte[][] array) {}
// or
// public void F(int[,] array) {}
// public void F(byte[,] array) {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3008


Mensaje de error
El identificador 'identificador' no es compatible con CLS
Identifier 'identifier' is not CLS-compliant
Un identificador public, protected o protected internal deja de ser compatible con Common Language Specification (CLS) si
comienza por un carácter de subrayado (_). Para obtener más información sobre la compatibilidad con CLS, vea
Escribir código compatible con CLS y Common Language Specification.
Ejemplo
El ejemplo siguiente genera la advertencia CS3008:

// CS3008.cs

using System;

[assembly:CLSCompliant(true)]
public class a
{
public static int _a = 0; // CS3008
// OK, private
// private static int _a1 = 0;

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3009


Mensaje de error
'tipo': el tipo base 'tipo' no es compatible con CLS
'type': base type 'type' is not CLS-compliant
Se ha marcado un tipo base como si no requiriera compatibilidad con Common Language Specification (CLS) en un
ensamblado marcado como compatible con CLS. Quite el atributo que especifica que el ensamblado es compatible con CLS, o
bien quite el atributo que indica que el tipo no es compatible con CLS. Para obtener más información sobre la compatibilidad
con CLS, vea Escribir código compatible con CLS y Common Language Specification.

Ejemplo
El ejemplo siguiente genera la advertencia CS3009:

// CS3009.cs

using System;

[assembly:CLSCompliant(true)]
[CLSCompliant(false)]
public class B
{
}

public class C : B // CS3009


{
public static void Main () {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3010


Mensaje de error
'miembro': las interfaces compatibles con CLS sólo deben tener miembros compatibles con CLS
'member': CLS-compliant interfaces must have only CLS-compliant members
En un ensamblado marcado con [assembly:CLCSompliant(true)], una interfaz contiene un miembro marcado con
[CLCSompliant(false)]. Quite uno de los atributos de compatibilidad con Common Language Specification (CLS). Para
obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera el error CS3010:

// CS3010.cs

using System;

[assembly:CLSCompliant(true)]
public interface I
{
[CLSCompliant(false)]
int mf(); // CS3010
}

public class C : I
{
public int mf()
{
return 1;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3011


Mensaje de error
'miembro': únicamente los miembros compatibles con CLS pueden ser abstractos
'member': only CLS-compliant members can be abstract
Un miembro de clase no puede ser al mismo tiempo abstract y no compatible con Common Language Specification (CLS). La
especificación CLS determina que se implementarán todos los miembros de clase. Para obtener más información sobre la
compatibilidad con CLS, vea Escribir código compatible con CLS y Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera el error CS3011:

// CS3011.cs

using System;

[assembly:CLSCompliant(true)]
public abstract class I
{
[CLSCompliant(false)]
public abstract int mf(); // CS3011

// OK
[CLSCompliant(false)]
public void mf2()
{
}
}

public class C : I
{
public override int mf()
{
return 1;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3012


Mensaje de error
Debe especificar el atributo CLSCompliant en el ensamblado, no en el módulo, para la comprobación de compatibilidad con
CLS
You must specify the CLSCompliant attribute on the assembly, not the module, to enable CLS compliance checking
Para que un módulo sea compatible con Common Language Specification (CLS) a través de
[module:System.CLCSompliant(true)], se debe generar con la opción del compilador /target:module. Para obtener más
información acerca de CLS, vea Common Language Specification.
Ejemplo
El ejemplo siguiente, al generarse sin /target:module, da lugar a la advertencia CS3012:

// CS3012.cs
// compile with: /W:1

[module:System.CLSCompliant(true)] // CS3012
public class C
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3013


Mensaje de error
Los módulos agregados se deben marcar con el atributo CLSCompliant para que coincidan con el ensamblado
Added modules must be marked with the CLSCompliant attribute to match the assembly
Un módulo compilado con la opción /target:module del compilador fue agregado a una compilación con /addmodule. Sin
embargo, la compatibilidad del módulo con Common Language Specification (CLS) no se corresponde con el estado CLS de la
compilación actual.
La compatibilidad con CLS se indica mediante el atributo del módulo. Por ejemplo, [module:CLSCompliant(true)] indica que
el módulo es compatible con CLS y[module:CLSCompliant(false)] indica que no es compatible. El valor predeterminado es
[module:CLSCompliant(false)]. Para obtener más información acerca de CLS, vea Common Language Specification.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3014


Mensaje de error
'miembro' no se puede marcar como compatible con CLS ya que el ensamblado no tiene ningún atributo CLSCompliant
'member' cannot be marked as CLS compliant because the assembly does not have a CLSCompliant attribute
En un archivo de código fuente donde no se ha especificado la compatibilidad con Common Language Specification (CLS), se
marcó una construcción como compatible con CLS. Esto no está permitido. Para resolver esta advertencia, agregue un atributo
compatible con CLS de nivel de ensamblado al archivo (en el ejemplo siguiente, quite los comentarios de la línea que contiene
el atributo de nivel de ensamblado). Para obtener más información sobre la compatibilidad con CLS, vea
Escribir código compatible con CLS y Common Language Specification.

Ejemplo
El ejemplo siguiente genera la advertencia CS3002:

// CS3014.cs

using System;

// [assembly:CLSCompliant(true)]
public class I
{
[CLSCompliant(true)] // CS3014
public void mf()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3015


Mensaje de error
'firma de método' no tiene constructores accesibles que utilicen sólo tipos compatibles con CLS
'method signature' has no accessible constructors which use only CLS-compliant types
Para que haya compatibilidad con Common Language Specification (CLS), la lista de argumentos de una clase de atributo no
puede contener una matriz. Para obtener más información sobre la compatibilidad con CLS, vea
Escribir código compatible con CLS y Common Language Specification.
Ejemplo
El ejemplo siguiente genera el error C3015.

// CS3015.cs
// compile with: /target:library
using System;

[assembly:CLSCompliant(true)]
public class MyAttribute : Attribute
{
public MyAttribute(int[] ai) {} // CS3015
// try the following line instead
// public MyAttribute(int ai) {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3016


Mensaje de error
El uso de matrices como argumentos de atributo no es compatible con CLS
Arrays as attribute arguments is not CLS-compliant
Pasar una matriz a un atributo no es compatible con Common Language Specification (CLS). Para obtener más información
sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera el error CS3016:

// CS3016.cs

using System;

[assembly : CLSCompliant(true)]
[C(new int[] {1, 2})] // CS3016
// try the following line instead
// [C()]
class C : Attribute
{
public C()
{
}

public C(int[] a)
{
}

public static void Main ()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3017


Mensaje de error
No se puede especificar el atributo CLSCompliant en un módulo que sea distinto del atributo CLSCompliant del ensamblado
You cannot specify the CLSCompliant attribute on a module that differs from the CLSCompliant attribute on the assembly
Esta advertencia aparece si hay un atributo CLSCompliant de ensamblado que entra en conflicto con un atributo CLSCompliant
de módulo. Un ensamblado compatible con CLS no puede contener módulos que no lo sean también. Para resolver esta
advertencia, asegúrese de que los atributos CLSCompliant de módulo y ensamblado son ambos verdaderos o falsos, o quite
uno de los atributos. Para obtener más información sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y
Common Language Specification.

Ejemplo
En el siguiente ejemplo se genera el error CS3017:

// CS3017.cs
// compile with: /target:module
using System;

[module: CLSCompliant(true)]
[assembly: CLSCompliant(false)] // CS3017
// Try this line instead:
// [assembly: CLSCompliant(true)]
class C
{
static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3018


Mensaje de error
'tipo' no se puede marcar como compatible con CLS porque es miembro del tipo 'tipo' no compatible con CLS
'type' cannot be marked as CLS-Compliant because it is a member of non CLS-compliant type 'type'
Esta advertencia se produce si una clase anidada con el atributo CLSCompliant establecido en true se declara como miembro
de una clase declarada con el atributo CLSCompliant establecido en false. Se trata de algo no permitido, puesto que una clase
anidada no puede ser compatible con CLS si es miembro de una clase exterior que no es compatible con CLS. Para resolver
esta advertencia, quite el atributo CLSCompliant de la clase anidada o cámbielo de true a false. Para obtener más información
sobre la compatibilidad con CLS, vea Escribir código compatible con CLS y Common Language Specification.

Ejemplo
El código siguiente genera el error CS3018.

// CS3018.cs
// compile with: /target:library
using System;

[assembly: CLSCompliant(true)]
[CLSCompliant(false)]
public class Outer
{
[CLSCompliant(true)] // CS3018
public class Nested {}

// OK
public class Nested2 {}

[CLSCompliant(false)]
public class Nested3 {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3022


Mensaje de error
El atributo CLSCompliant no tiene ningún significado cuando se aplica a parámetros. Intente incluirlo en el método en su lugar.
CLSCompliant attribute has no meaning when applied to parameters. Try putting it on the method instead.
Los parámetros de método no se comprueban a efectos de compatibilidad con CLS, puesto que las reglas de compatibilidad
con CLS se aplican a los métodos y declaraciones de tipo.
Ejemplo
En el código siguiente se genera el error CS3022:

// CS3022.cs
// compile with: /W:1

using System;
[assembly: CLSCompliant(true)]
[CLSCompliant(true)]
public class C
{
public void F([CLSCompliant(true)] int i)
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3023


Mensaje de error
El atributo CLSCompliant no tiene ningún significado cuando se aplica a tipos de valor devuelto. Intente incluirlo en el método
en su lugar.
CLSCompliant attribute has no meaning when applied to return types. Try putting it on the method instead.
No se comprueban los tipos devueltos de función para la compatibilidad con CLS, puesto que las reglas de compatibilidad con
CLS se aplican a los métodos y declaraciones de tipo.
Ejemplo
En el siguiente ejemplo se genera la advertencia CS3023:

// C3023.cs

[assembly:System.CLSCompliant(true)]
public class Test
{
[return:System.CLSCompliant(true)] // CS3023
// Try this instead:
// [method:System.CLSCompliant(true)]
public static int Main()
{
return 0;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS3026


Mensaje de error
El campo compatible con CLS 'campo' no puede ser volátil
CLS-compliant field 'field' cannot be volatile
Una variable volátil no debe ser compatible con CLS.
Ejemplo
En el siguiente ejemplo se genera el error CS3026.

// CS3026.cs
[assembly:System.CLSCompliant(true)]
public class Test
{
public volatile int v0 =0; // CS3026
// To resolve remove the CLS-CComplient attribute.
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS5000


Mensaje de error
Opción de compilador '/opción' desconocida
Unknown compiler option '/option'
Se especificó una opción del compilador no válida.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0108


Mensaje de error
'miembro1' oculta el miembro heredado 'miembro2'. Utilice la nueva palabra clave si su intención era ocultarlo.
'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended.
Se declaró una variable con el mismo nombre que una variable en una clase base. Sin embargo, no se utilizó la palabra clave
new. Esta advertencia le informa de que debe utilizar new; la variable se declara como si se hubiera utilizado new en la
declaración.
El código siguiente genera el error CS0108:

// CS0108.cs
// compile with: /W:2
using System;

namespace x
{
public class clx
{
public int i = 1;
}

public class cly : clx


{
public static int i = 2; // CS0108, use the new keyword
// the compiler parses the previous line as if you had specified:
// public static new int i = 2;

public static void Main()


{
Console.WriteLine(i);
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0114


Mensaje de error
'función1' oculta el miembro heredado 'función2'. Para hacer que el método actual reemplace esa implementación, agregue la
palabra clave override. De lo contrario, agregue la palabra clave new.
'function1' hides inherited member 'function2'. To make the current method override that implementation, add the override
keyword. Otherwise add the new keyword.
Una declaración de una clase entra en conflicto con otra declaración de una clase base, de forma que el miembro de la clase
base quedará oculto.
Para obtener más información, vea base.
El código siguiente genera el error CS0114:

// CS0114.cs
// compile with: /W:2 /warnaserror
abstract public class clx
{
public abstract void f();
}

public class cly : clx


{
public void f() // CS0114, hides base class member
// try the following line instead
// override public void f()
{
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0162


Mensaje de error
Se ha detectado código inalcanzable
Unreachable code detected
El compilador detectó código que no se ejecutará en ninguna circunstancia.
El código siguiente genera el error CS0162:

// CS0162.cs
// compile with: /W:2
public class A
{
public static void Main()
{
goto lab1;
{
// The following statements cannot be reached:
int i = 9; // CS0162
i++;
}
lab1:
{
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0164


Mensaje de error
No existe ninguna referencia a esta etiqueta
This label has not been referenced
Se declaró una etiqueta pero no se hizo ninguna referencia a ella.
El código siguiente genera el error CS0164:

// CS0164.cs
// compile with: /W:2
public class a
{
public int i = 0;

public static void Main()


{
int i = 0; // CS0164
l1: i++;
// the following lines resolve this error
// if(i < 10)
// goto l1;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0251


Mensaje de error
Indizando una matriz con un índice negativo (los índices de matriz siempre comienzan por cero)
Indexing an array with a negative index (array indices always start at zero)
No utilice un número negativo para indizar una matriz.
El código siguiente genera el error CS0251:

// CS0251.cs
// compile with: /W:2
class MyClass
{
public static void Main()
{
int[] myarray = new int[] {1,2,3};
try
{
myarray[-1]++; // CS0251
// try the following line instead
// myarray[1]++;
}
catch (System.IndexOutOfRangeException e)
{
System.Console.WriteLine("{0}", e);
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0252


Mensaje de error
Posible comparación de referencias no intencionada; para obtener una comparación de valores, convierta el tipo del lado
izquierdo al tipo 'tipo'
Possible unintended reference comparison; to get a value comparison, cast the left hand side to type 'type'
El compilador está realizando una comparación de referencias. Si se desea comparar el valor de cadenas, se debe convertir el
tipo del lado izquierdo de la expresión a type.
El código siguiente genera la advertencia CS0252:

// CS0252.cs
// compile with: /W:2
using System;

class MyClass
{
public static void Main()
{
string s = "11";
object o = s + s;

bool b = o == s; // CS0252
// try the following line instead
// bool b = (string)o == s;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0253


Mensaje de error
Posible comparación de referencias no intencionada; para obtener una comparación de valores, convierta el tipo del lado
derecho al tipo 'tipo'
Possible unintended reference comparison; to get a value comparison, cast the right hand side to type 'type'
El compilador está realizando una comparación de referencias. Si se desea comparar el valor de cadenas, se debe convertir el
tipo del lado derecho de la expresión a type.
El código siguiente genera la advertencia CS0253:

// CS0253.cs
// compile with: /W:2
using System;
class MyClass
{
public static void Main()
{
string s = "11";
object o = s + s;

bool c = s == o; // CS0253
// try the following line instead
// bool c = s == (string)o;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0278


Mensaje de error
'tipo' no implementa el modelo 'nombre de modelo'. 'nombre de método' es ambiguo respecto a 'nombre de método'.
'type' does not implement the 'pattern name' pattern. 'method name' is ambiguous with 'method name'.
Hay varias instrucciones en C# que se basan en modelos definidos, como foreach y using. Por ejemplo, foreach se basa en la
clase de colección que implementa el modelo "enumerable".
La advertencia CS0278 aparece cuando el compilador no puede establecer la correspondencia debido a las ambigüedades. Por
ejemplo, el modelo "enumerable" requiere un método denominado MoveNext, y puede suceder que el código contenga dos
métodos denominados MoveNext. El compilador intentará encontrar una interfaz para utilizarla, pero se recomienda
determinar la causa de la ambigüedad y corregirla.
Para obtener más información, vea
Cómo: Obtener acceso a una clase de colección mediante Foreach (Guía de programación de C#).
Ejemplo
El código siguiente genera la advertencia CS0278.

// CS0278.cs
using System.Collections.Generic;
public class myTest
{
public static void TestForeach<W>(W w)
where W: IEnumerable<int>, IEnumerable<string>
{
foreach (int i in w) {} // CS0278
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0279


Mensaje de error
'nombre de tipo' no implementa el modelo 'nombre de modelo'. 'nombre de método' es estático o no público.
'type name' does not implement the 'pattern name' pattern. 'method name' is either static or not public.
Hay varias instrucciones en C# que se basan en modelos definidos, como foreach y using. Por ejemplo, foreach se basa en la
clase de colección que implementa el modelo enumerable. Este error se produce cuando el compilador no puede establecer la
correspondencia debido a que se ha declarado un método como static o no public. Los métodos de los modelos tienen que
ser obligatoriamente instancias de clases y públicos.
Ejemplo
El siguiente ejemplo genera la advertencia CS0279:

// CS0279.cs

using System;
using System.Collections;
public class myTest : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
yield return 0;
}

internal IEnumerator GetEnumerator()


{
yield return 0;
}

public static void Main()


{
foreach (int i in new myTest()) {} // CS0279
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0280


Mensaje de error
'tipo' no implementa el modelo 'nombre de modelo'. 'nombre de método' tiene la firma equivocada.
'type' does not implement the 'pattern name' pattern. 'method name' has the wrong signature.
Dos instrucciones de C#, foreach y using, dependen de modelos predefinidos, "colección" y "recurso", respectivamente. Esta
advertencia aparece cuando el compilador no puede hacer coincidir una de estas instrucciones con su modelo debido a la
firma incorrecta de un método. Por ejemplo, el modelo de "colección" requiere que haya un método llamado MoveNext que no
tome ningún parámetro y devuelva un valor boolean. Su código podría contener un método MoveNext que toma un
parámetro, o quizás devuelve un objeto.
El modelo de "recurso" y using proporcionan otro ejemplo. El modelo de "recurso" requiere el método Dispose; si define una
propiedad con el mismo nombre, obtendrá esta advertencia.
Para resolver esta advertencia, asegúrese de que las firmas del método de su tipo coinciden con las firmas de los métodos
correspondientes del modelo, y también de que no tiene ninguna propiedad que se llame igual que un método requerido por
el modelo utilizado.
Ejemplo
El código siguiente genera el error CS0280.

// CS0280.cs
using System;
using System.Collections;

public class ValidBase: IEnumerable


{
IEnumerator IEnumerable.GetEnumerator()
{
yield return 0;
}

internal IEnumerator GetEnumerator()


{
yield return 0;
}
}
class Derived : ValidBase
{
// field, not method
new public int GetEnumerator;
}
public class Test
{
public static void Main()
{
foreach (int i in new Derived()) {} // CS0280
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0435


Mensaje de error
El espacio de nombres 'espacio de nombres' de 'archivo_2' entra en conflicto con el tipo importado 'tipo' en 'archivo_1.' Se
utilizará el espacio de nombres.
The namespace 'namespace' in 'file_2' conflicts with the imported type 'type' in 'file_1'. Using the namespace.
Se emite esta advertencia cuando un espacio de nombres de un archivo de código fuente (archivo_2) entra en conflicto con un
tipo importado en archivo_1. El compilador utiliza el del archivo de código fuente.
En el siguiente ejemplo se genera CS0435:
Compile este archivo primero:

// CS0435_1.cs
// compile with: /t:library
public class Util
{
public class A { }
}

A continuación, compile este archivo:

// CS0435_2.cs
// compile with: /r:CS0435_1.dll

using System;

namespace Util
{
public class A { }
}

public class Test


{
public static void Main()
{
Console.WriteLine(typeof(Util.A)); // CS0435
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0436


Mensaje de error
El tipo 'tipo' en 'archivo_2' entra en conflicto con el tipo importado 'tipo'. Se utilizará el de 'archivo_2'
The type 'type' in 'file_2' conflicts with the imported type 'type'. Using the one in 'file_2'
Esta advertencia se emite cuando un tipo de un archivo de código fuente (archivo_2) entra en conflicto con un tipo importado
en archivo_1. El compilador utiliza el del archivo de código fuente.
Ejemplo
// CS0436_a.cs
// compile with: /target:library
public class A {
public void Test() {
System.Console.WriteLine("CS0436_a");
}
}

En el siguiente ejemplo se genera la advertencia CS0436.

// CS0436_b.cs
// compile with: /reference:CS0436_a.dll
// CS0436 expected
public class A {
public void Test() {
System.Console.WriteLine("CS0436_b");
}
}

public class Test


{
public static void Main()
{
A x = new A();
x.Test();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0437


Mensaje de error
El tipo 'tipo' en 'archivo_2' entra en conflicto con el espacio de nombres importado 'espacio_de_nombres' en 'archivo_1'. Se
utilizará el tipo.
The type 'type' in 'file_2' conflicts with the imported namespace 'namespace' in 'file_1'. Using the type.
Esta advertencia se emite cuando un tipo de un archivo de código fuente, archivo_2, entra en conflicto con un espacio de
nombres importado en archivo_1. El compilador utiliza el tipo del archivo de código fuente.
Ejemplo
// CS0437_a.cs
// compile with: /target:library
namespace Util
{
public class A {
public void Test() {
System.Console.WriteLine("CS0437_a.cs");
}
}
}

El siguiente ejemplo genera la advertencia CS0437.

// CS0437_b.cs
// compile with: /reference:CS0437_a.dll /W:2
// CS0437 expected
class Util
{
public class A {
public void Test() {
System.Console.WriteLine("CS0437_b.cs");
}
}
}

public class Test


{
public static void Main()
{
Util.A x = new Util.A();
x.Test();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0440


Mensaje de error
No es aconsejable definir ningún alias denominado 'global' porque 'global::' siempre hace referencia al espacio de nombres
global y no a un alias
Defining an alias named 'global' is ill-advised since 'global::' always references the global namespace and not an alias
Esta advertencia se emite cuando define un alias denominado global.
Ejemplo
En el siguiente ejemplo se genera el error CS0440.

// CS0440.cs
// Compile with: /W:1

using global = MyClass; // CS0440


class MyClass
{
static void Main()
{
// Note how global refers to the global namespace
// even though it is redefined above.
global::System.Console.WriteLine();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0444


Mensaje de error
El tipo predefinido 'nombre de tipo 1' no se encontró en 'Espacio de nombres System 1' pero sí en 'Espacio de nombres
System 2'
Predefined type 'type name 1' was not found in 'System namespace 1' but was found in 'System namespace 2'
No se ha encontrado un objeto predefinido como Int32 donde el compilador esperaba, pero sí en el 'Espacio de nombres
System 2'.
El error puede indicar que .NET Framework está instalado incorrectamente. Para corregirlo, reinstale .NET Framework.
También se puede encontrar este error al escribir sus propias bibliotecas de clases base. En este caso, para resolverlo deberá
generar mscorlib de nuevo.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0458


Mensaje de error
El resultado de la expresión es siempre 'null' de tipo 'nombre de tipo'
The result of the expression is always 'null' of type 'type name'
Una expresión nullable que siempre genera el resultado null provoca esta advertencia.
El código siguiente genera la advertencia CS0458.
Ejemplo
Este ejemplo ilustra varias de las distintas operaciones con tipos nullable que provocarán este error.

// CS0458.cs
using System;
public class Test
{
public static void Main()
{
int a = 5;
int? b = a + null; // CS0458
int? qa = 15;
b = qa + null; // CS0458
b -= null; // CS0458
int? qa2 = null;
b = qa2 + null; // CS0458
qa2 -= null; // CS0458
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0464


Mensaje de error
La comparación con null de tipo 'tipo' siempre genera 'false'
Comparing with null of type 'type' always produces 'false'
Esta advertencia se genera cuando se efectúa una comparación entre null y una variable que acepta valores NULL, y la
comparación no es == o !=. Para resolver este error, asegúrese de que realmente desea comprobar si un valor es null. Una
comparación como i == null puede ser verdadera o falsa. Una comparación como i > null siempre es falsa.
Ejemplo
El siguiente ejemplo genera la advertencia CS0464.

// CS0464.cs
class MyClass
{
public static void Main()
{
int? i = 0;
if (i < null) ; // CS0464

i++;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0467


Mensaje de error
Ambigüedad entre el método 'método' y el no método 'no método'. Se utilizará el grupo de métodos.
Ambiguity between method 'method' and non-method 'non-method'. Using method group.
Error de ambigüedad creado por miembros con la misma firma, heredados de distintas interfaces.
Ejemplo
En el siguiente ejemplo se genera el error CS0467.

// CS0467.cs
interface IList
{
int Count { get; set; }
}
interface ICounter
{
void Count(int i);
}

interface IListCounter : IList, ICounter {}

class Driver
{
void Test(IListCounter x)
{
x.Count = 1;
x.Count(1); // CS0467
// To resolve change the method name "Count" to another name.
}

static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0618


Mensaje de error
'miembro' está obsoleto: 'texto'
'member' is obsolete: 'text'
Se marcó un miembro de clase con el atributo Obsolete, de manera que se emitirá una advertencia cuando se haga referencia
al miembro de clase.
El código siguiente genera la advertencia CS0618:

// CS0618.cs
// compile with: /W:2
using System;

public class C
{
[Obsolete("Use newMethod instead", false)] // warn if referenced
public static void m2()
{
}

public static void newMethod()


{
}
}

class MyClass
{
public static void Main()
{
C.m2(); // CS0618
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0652


Mensaje de error
La comparación con la constante integral no es válida; la constante está fuera del intervalo del tipo 'tipo'
Comparison to integral constant is useless; the constant is outside the range of type 'type'
El compilador detectó una comparación entre una constante y una variable en la que la constante está fuera del intervalo de la
variable.
El código siguiente genera el error CS0652:

// CS0652.cs
// compile with: /W:2
public class Class1
{
private static byte i = 0;
public static void Main()
{
short j = 256;
if (i == 256) // CS0652, 256 is out of range for byte
i = 0;
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0728


Mensaje de error
Asignación posiblemente incorrecta a la variable local 'variable', que es el argumento a una instrucción using o lock.
Possibly incorrect assignment to local 'variable' which is the argument to a using or lock statement.
Hay varios escenarios donde los bloques using o lock producirán una pérdida temporal de recursos. El siguiente es un
ejemplo:
thisType f = null;
using (f)
{
f = new thisType();
...
}

En este caso se eliminará el valor original, como por ejemplo null, de la variable thisType cuando el bloque using termine la
ejecución, pero no se eliminará el objeto thisType creado dentro del bloque, aunque eventualmente se recogerá como
elemento no utilizado.
Para resolver este error, utilice el siguiente formulario.
using (thisType f = new thisType())
{
...
}

En este caso, se eliminará el objeto thisType recién asignado.


Ejemplo
El código siguiente generará la advertencia CS0728.

// CS0728.cs

using System;
public class ValidBase : IDisposable
{
public void Dispose() { }
}

public class Logger


{
public static void dummy()
{
ValidBase vb = null;
using (vb)
{
vb = null; // CS0728
}
vb = null;
}
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1571


Mensaje de error
El comentario XML en 'construcción' tiene una etiqueta de parámetro duplicada para 'parámetro'
XML comment on 'construct' has a duplicate param tag for 'parameter'
Al utilizar la opción /doc del compilador se hallaron múltiples comentarios para un mismo parámetro de método. Quite una de
las líneas duplicadas.
El código siguiente genera el error CS1571:

// CS1571.cs
// compile with: /W:2 /doc:x.xml

/// <summary>help text</summary>


public class MyClass
{
/// <param name='Int1'>Used to indicate status.</param>
/// <param name='Char1'>An initial.</param>
/// <param name='Int1'>Used to indicate status.</param> // CS1571
public static void MyMethod(int Int1, char Char1)
{
}

/// <summary>help text</summary>


public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1572


Mensaje de error
El comentario XML en 'construcción' tiene una etiqueta de parámetro para 'parámetro', pero no hay ningún parámetro con ese
nombre
XML comment on 'construct' has a param tag for 'parameter', but there is no parameter by that name
Al utilizar la opción /doc del compilador se especificó un comentario para un parámetro que no existe en ese método. Cambie
el valor pasado al atributo de nombre o quite una de la líneas de comentario.
El código siguiente genera la advertencia CS1572:

// CS1572.cs
// compile with: /W:2 /doc:x.xml

/// <summary>help text</summary>


public class MyClass
{
/// <param name='Int1'>Used to indicate status.</param>
/// <param name='Char1'>Used to indicate status.</param>
/// <param name='Char2'>???</param> // CS1572
public static void MyMethod(int Int1, char Char1)
{
}

/// <summary>help text</summary>


public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1587


Mensaje de error
El comentario XML no está situado en un elemento válido del lenguaje
XML comment is not placed on a valid language element
Las etiquetas recomendadas de comentarios de documentación no están permitidas en todos los elementos del lenguaje. Por
ejemplo, no se permite una etiqueta en un espacio de nombres. Para obtener más información sobre comentarios XML, vea
Etiquetas recomendadas para comentarios de documentación (Guía de programación de C#).
Ejemplo
El código siguiente genera la advertencia CS1587:

// CS1587.cs
// compile with: /W:2 /doc:x.xml
/// <summary>test</summary> // CS1587, tag not allowed on namespace
namespace MySpace
{
class MyClass
{
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1668


Mensaje de error
Se ha especificado una ruta de acceso de búsqueda 'ruta de acceso' no válida en 'cadena de la ruta de acceso' -- 'mensaje de
error del sistema'
Invalid search path 'path' specified in 'path string' -- 'system error message'
No es válida la ruta de acceso proporcionada a /lib en la línea de comandos, o bien una ruta de acceso de la variable de
entorno LIB. Compruebe la ruta de acceso utilizada, para asegurarse de que exista y sea accesible. El mensaje de error que
aparece entre comillas simples es el error devuelto por el sistema operativo.
Una causa conocida de este error es cuando Visual Studio .NET 2002 o Visual Studio .NET 2003 se desinstala de un equipo que
también tiene Visual Studio 2005 instalado. Utilice el siguiente procedimiento para corregir el error:
1. Haga clic con el botón secundario del mouse en Mi PC y, a continuación, haga clic en Propiedades.
2. Haga clic en la ficha Opciones avanzadas y después en Variables de entorno.
3. Haga clic en la entrada LIB del panel superior y asegúrese de que apunta a los archivos lib v2.0.
Si ha instalado Visual Studio 2005 en la ubicación predeterminada, la ruta de acceso completa es C:\Archivos de
programa\Microsoft Visual Studio 8\SDK\v2.0\Lib.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1698


Mensaje de error
La referencia de ensamblado circular 'Nombre_de_ensamblado1' no coincide con el nombre del ensamblado de salida
'Nombre_de_ensamblado2'. Intente agregar una referencia a 'Nombre_de_ensamblado1' o cambiar el nombre del ensamblado
de salida para que coincida.
Circular assembly reference 'AssemblyName1' does not match the output assembly name 'AssemblyName2'. Try adding a
reference to 'AssemblyName1' or changing the output assembly name to match.
La advertencia CS1698 aparece cuando una referencia de ensamblado es incorrecta. Esto puede ocurrir si se vuelve a compilar
un ensamblado al que se hace referencia. Para resolverlo, no reemplace un ensamblado que es en sí mismo una dependencia
de un ensamblado al que hace referencia.
Ejemplo
// CS1698_a.cs
// compile with: /target:library /keyfile:mykey.snk
[assembly:System.Reflection.AssemblyVersion("2")]
public class CS1698_a {}

// CS1698_b.cs
// compile with: /target:library /reference:CS1698_a.dll /keyfile:mykey.snk
public class CS1698_b : CS1698_a {}

El código siguiente genera la advertencia CS1698.

// CS1698_c.cs
// compile with: /target:library /out:cs1698_a.dll /reference:cs1698_b.dll /keyfile:mykey.s
nk
// CS1698 expected
[assembly:System.Reflection.AssemblyVersion("3")]
public class CS1698_c : CS1698_b {}
public class CS1698_a {}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1701


Mensaje de error
Suponiendo que la referencia de ensamblado "Nombre del ensamblado 1" coincide con "Nombre del ensamblado 2", puede
que necesite proporcionar la directiva en tiempo de ejecución
Assuming assembly reference "Assembly Name #1" matches "Assembly Name #2", you may need to supply runtime policy
Los dos ensamblados difieren en el número de lanzamiento o de versión. Para poder unificarlos, debe especificar las directivas
en el archivo .config de la aplicación y proporcionar el nombre seguro correcto de un ensamblado, como se muestra en el
código del siguiente ejemplo.
Ejemplo
El siguiente ejemplo de varios archivos hace referencia a un ensamblado utilizando dos alias externos diferentes. Este primer
ejemplo genera la versión anterior del código que crea el ensamblado CS1701_d.

// CS1701_a.cs
// compile with: /target:library /out:cs1701_d.dll /keyfile:mykey.snk
using System.Reflection;
[assembly:AssemblyVersion("1.0")]
public class A {
public void M1() {}
}

public class C1 {}

Éste es el código que crea la versión más reciente del ensamblado CS1701_d. Observe que se compila en un directorio
diferente que la versión antigua. Esto es necesario porque los archivos de resultados tienen los mismos nombres.

// CS1701_b.cs
// compile with: /target:library /out:c:\\cs1701_d.dll /keyfile:mykey.snk
using System.Reflection;
[assembly:AssemblyVersion("2.0")]
public class A {
public void M2() {}
public void M1() {}
}

public class C2 {}
public class C1 {}

Este ejemplo prepara los alias externos A1 y A2.

// CS1701_c.cs
// compile with: /target:library /reference:A2=c:\\cs1701_d.dll /reference:A1=cs1701_d.dll

extern alias A1;


extern alias A2;
// using System;
using a1 = A1::A;
using a2 = A2::A;
public class Ref {
public static a1 A1() { return new a1(); }
public static a2 A2() { return new a2(); }
public static A1::C1 M1() { return new A1::C1(); }
public static A2::C2 M2() { return new A2::C2(); }
}

Este ejemplo llama a los métodos utilizando dos alias diferentes de A. que El ejemplo siguiente genera C1701.
// CS1701_d.cs
// compile with: /reference:c:\\CS1701_d.dll /reference:CS1701_c.dll
// CS1701 expected
class Tester {
public static void Main() {
Ref.A1().M1();
Ref.A2().M2();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1710


Mensaje de error
El comentario XML de 'tipo' tiene una etiqueta typeparam duplicada para 'parámetro'
XML comment on 'type' has a duplicate typeparam tag for 'parameter'
La documentación de tipo genérico incluye una etiqueta duplicada para el parámetro de tipo.
Ejemplo
El siguiente código provocará la aparición de la advertencia CS1710.

// CS1710.cs
// To resolve this warning, delete one of the duplicate <typeparam>'s.
using System;
class Stack<ItemType>
{
}

/// <typeparam name="MyType">can be an int</typeparam>


/// <typeparam name="MyType">can be an int</typeparam>
class MyStackWrapper<MyType>
{
// Open constructed type Stack<MyType>.
Stack<MyType> stack;
public MyStackWrapper(Stack<MyType> s)
{
stack = s;
}
}

class CMain
{
public static void Main()
{
// Closed constructed type Stack<int>.
Stack<int> stackInt = new Stack<int>();
MyStackWrapper<int> MyStackWrapperInt =
new MyStackWrapper<int>(stackInt);
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS1711


Mensaje de error
El comentario XML de 'tipo' tiene una etiqueta typeparam para 'parámetro', pero no hay ningún parámetro de tipo con ese
nombre
XML comment on 'type' has a typeparam tag for 'parameter', but there is no type parameter by that name
La documentación de tipo genérico incluye una etiqueta para el parámetro de tipo cuyo nombre es incorrecto.
Ejemplo
El código siguiente genera la advertencia CS1711.

// cs1711.cs
// compile with: /doc:cs1711.xml
// CS1711 expected
using System;
///<typeparam name="WrongName">can be an int</typeparam>
class CMain
{
public static void Main() { }
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS3019


Mensaje de error
La comprobación de compatibilidad con CLS no se realizará en 'tipo' porque no es visible desde fuera de este ensamblado.
CLS compliance checking will not be performed on 'type' because it is not visible from outside this assembly.
Esta advertencia aparece cuando un tipo o un miembro que tiene el atributo CLSCompliantAttribute no es visible desde otro
ensamblado. Para resolver este error, quite el atributo de cualquier clase o miembro que no sea visible desde el otro
ensamblado, o haga que el tipo o los miembros sean visibles. Para obtener más información sobre la compatibilidad con CLS,
vea Escribir código compatible con CLS.
Ejemplo
En el código siguiente se genera el error CS3019:

// CS3019.cs
// compile with: /W:2

using System;
[assembly: CLSCompliant(true)]

// To fix the error, remove the next line


[CLSCompliant(true)] // CS3019
class C
{
[CLSCompliant(false)] // CS3019
void Foo()
{
}

static void Main()


{
}
}

Vea también
Conceptos
Common Language Specification
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS3021


Mensaje de error
'tipo' no necesita ningún atributo CLSCompliant porque el ensamblado no tiene ningún atributo CLSCompliant
'type' does not need a CLSCompliant attribute because the assembly does not have a CLSCompliant attribute
Esta advertencia se produce si [CLSCompliant(false)] aparece en una clase de un ensamblado que no tiene un atributo de
nivel de ensamblado CLSCompliant establecido en true (es decir, que no tiene la línea [assembly: CLSCompliant(true)]).
Puesto que el ensamblado no se declara a sí mismo compatible con CLS, no es necesario que haya nada dentro del
ensamblado que lo declare no compatible, ya que se da por supuesto que no lo es. Para obtener más información sobre la
compatibilidad con CLS, vea Escribir código compatible con CLS.
Para eliminar esta advertencia, quite el atributo o agregue el atributo de nivel de ensamblado.
Ejemplo
El ejemplo siguiente genera la advertencia CS3021:

// CS3021.cs
using System;
// Uncomment the following line to declare the assembly CLS Compliant,
// and avoid the warning without removing the attribute on the class.
//[assembly: CLSCompliant(true)]

// Remove the next line to avoid the warning.


[CLSCompliant(false)] // CS3021
public class C
{
public static void Main()
{
}
}

Vea también
Conceptos
Common Language Specification
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0067


Mensaje de error
El evento 'evento' nunca se utiliza
The event 'event' is never used
Se declaró un evento pero no se llegó a utilizar en la clase en la cual se declaró.
El código siguiente genera el error CS0067:

// CS0067.cs
// compile with: /W:3
using System;
delegate void MyDelegate();

class MyClass
{
public event MyDelegate evt; // CS0067
// uncomment TestMethod to resolve this CS0067
/*
private void TestMethod()
{
if (evt != null)
evt();
}
*/
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0105


Mensaje de error
La directiva using para 'espacio de nombres' aparece previamente en este espacio de nombres
The using directive for 'namespace' appeared previously in this namespace
Un espacio de nombres, que sólo puede declararse una vez, fue declarado más de una vez; quite todas las declaraciones
duplicadas de espacios de nombres.
El código siguiente genera el error CS0105:

// CS0105.cs
// compile with: /W:3
using System;
using System; // CS0105

public class a
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0168


Mensaje de error
La variable 'var' se ha declarado pero nunca se utiliza
The variable 'var' is declared but never used
El compilador advierte cuándo una variable se ha declarado pero no se utiliza.
El código siguiente genera dos advertencias CS0168:

// CS0168.cs
// compile with: /W:3
public class clx
{
public int i;
}

public class clz


{
public static void Main()
{
int j = 0; // CS0168, uncomment the following line
// j++;
clx a; // CS0168, try the following line instead
// clx a = new clx();
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0169


Mensaje de error
El campo privado 'miembro de clase' nunca se utiliza
The private field 'class member' is never used
Se declaró una variable privada pero nunca se hizo referencia a ella. Una forma común de generar esta advertencia es cuando
se declara un miembro privado de una clase y no se utiliza.
El código siguiente genera el error CS0169:

// compile with: /W:3


using System;
public class ClassX
{
int i; // CS0169, i is not used anywhere

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0219


Mensaje de error
La variable 'variable' está asignada, pero su valor nunca se utiliza
The variable 'variable' is assigned but its value is never used
El compilador emite una advertencia de nivel tres al declarar y asignar una variable sin utilizarla.
El código siguiente genera el error CS0219:

// CS0219.cs
// compile with: /W:3
public class MyClass
{
public static void Main()
{
int a = 0; // CS0219
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0282


Mensaje de error
No hay ningún orden definido entre campos en varias declaraciones de clase o estructura parciales 'tipo.' Para especificar un
orden, todos los campos de instancia deben estar en la misma declaración.
There is no defined ordering between fields in multiple declarations of partial class or struct 'type'. To specify an ordering, all
instance fields must be in the same declaration.
Para resolver este error, coloque todas las variables miembro en una definición de clase parcial única.
Una manera habitual de obtener este error es tener una estructura struct parcial definida en más de un lugar, con algunas de
las variables miembro en una definición, y otras más en otra distinta.
En el código siguiente se genera el error CS0282.
Ejemplo
El código siguiente contiene una descripción de una estructura struct. Compile estos dos módulos juntos en un paso único
mediante el comando:
csc /targt:library cs0282_1.cs cs0282_2.cs

partial struct A
{
int i;
}

Este código contiene una descripción contradictoria de la misma estructura struct.

partial struct A
{
int j;
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0414


Mensaje de error
El campo privado 'campo' está asignado pero su valor nunca se utiliza
The private field 'field' is assigned but its value is never used
Esta advertencia se produce si existe un campo privado en un tipo que tiene una asignación, pero cuyo valor nunca se lee
después. Esta asignación innecesaria puede afectar negativamente al rendimiento.
El código siguiente genera la advertencia CS0414:

// CS0414
// compile with: /W3
class C
{
private int i = 1; // CS0414

public static void Main()


{ }
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0419


Mensaje de error
Referencia ambigua en el atributo cref: 'Método Nombre1'. Se supone 'Método Nombre2', pero también podría haber
coincidido con otras sobrecargas que incluyen 'Método Nombre3'.
Ambiguous reference in cref attribute: 'Method Name1'. Assuming 'Method Name2', but could have also matched other
overloads including 'Method Name3'.
En un comentario de la documentación XML en el código, no se pudo resolver una referencia. Esto puede aparecer si se
sobrecarga el método, o si se encuentran dos identificadores diferentes con el mismo nombre. Para resolver la advertencia,
utilice un nombre completo para eliminar la ambigüedad de la referencia o incluya la sobrecarga concreta entre paréntesis.
En el código siguiente se genera el error CS0419:

// cs0419.cs
// compile with: /doc:x.xml /W:3
interface I
{
/// text for F(void)
void F();
/// text for F(int)
void F(int i);
}
/// text for class MyClass
public class MyClass
{
/// <see cref="I.F"/>
public static void MyMethod(int i)
{
}
/* Try this instead:
/// <see cref="I.F(int)"/>
public static void MyMethod(int i)
{
}
*/
/// text for Main
public static void Main ()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0469


Mensaje de error
El valor 'goto case' no se puede convertir implícitamente en el tipo 'tipo'
The 'goto case' value is not implicitly convertible to type 'type'
Cuando utiliza goto case, debe haber una conversión implícita del valor de goto case al tipo del modificador.
Ejemplo
El código siguiente genera el error CS0469.

// CS0469.cs
// compile with: /W:2
class Test
{
static void Main()
{
char c = (char)180;
switch (c)
{
case (char)127:
break;

case (char)180:
goto case 127; // CS0469
// try the following line instead
// goto case (char) 127;
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0642


Mensaje de error
Posible instrucción vacía errónea
Possible mistaken empty statement
Es posible que un carácter de punto y coma después de una instrucción condicional cause que el código no se ejecute según lo
esperado.
Puede utilizar la opción del compilador /nowarn o #pragmas warning para deshabilitar esta advertencia; vea
/nowarn (Suprimir las advertencias especificadas) (Opciones del compilador de C#) o #pragma warning (Referencia de C#)
para obtener más información.
El código siguiente genera la advertencia CS0642:

// CS0642.cs
// compile with: /W:3
class MyClass
{
public static void Main()
{
int i;

for (i = 0; i < 10; i += 1); // CS0642 semicolon intentional?


{
System.Console.WriteLine (i);
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0659


Mensaje de error
'clase' reemplaza a Object.Equals(object o) pero no reemplaza a Object.GetHashCode()
'class' overrides Object.Equals(object o) but does not override Object.GetHashCode()
El compilador detectó un reemplazo de la función Equals, pero no detectó ningún reemplazo para GetHashCode. Un
reemplazo de Equals implica que también se desea reemplazar a GetHashCode.
Para obtener más información, vea
Hashtable.
Instrucciones para implementar Equals y el operador de igualdad (==)
Implementar el método Equals
GetHashCode
El código siguiente genera la advertencia CS0659:

// CS0659.cs
// compile with: /W:3 /target:library
class Test
{
public override bool Equals(object o) { return true; } // CS0659
}

// OK
class Test2
{
public override bool Equals(object o) { return true; }
public override int GetHashCode() { return 0; }
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0660


Mensaje de error
'clase' define el operador == o el operador != pero no reemplaza a Object.Equals(object o)
'class' defines operator == or operator != but does not override Object.Equals(object o)
El compilador detectó el operador de igualdad o desigualdad definido por el usuario, pero no detectó ningún reemplazo para
la función Equals. Un operador de igualdad o desigualdad definido por el usuario implica que también se desea reemplazar la
función Equals.
El código siguiente genera la advertencia CS0660:

// CS0660.cs
// compile with: /W:3 /warnaserror
class Test // CS0660
{
public static bool operator == (object o, Test t)
{
return true;
}

// uncomment the Equals function to resolve


// public override bool Equals(object o)
// {
// return true;
// }

public override int GetHashCode()


{
return 0;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0661


Mensaje de error
'clase' define el operador == o el operador != pero no reemplaza a Object.GetHashCode()
'class' defines operator == or operator != but does not override Object.GetHashCode()
El compilador detectó el operador de igualdad o desigualdad definido por el usuario, pero no detectó ningún reemplazo para
la función GetHashCode. Un operador de igualdad o desigualdad definido por el usuario implica que también se desea
reemplazar la función GetHashCode.
El código siguiente genera el error CS0661:

// CS0661.cs
// compile with: /W:3
class Test // CS0661
{
public static bool operator == (object o, Test t)
{
return true;
}

public static bool operator != (object o, Test t)


{
return true;
}

public override bool Equals(object o)


{
return true;
}

// uncomment the GetHashCode function to resolve


// public override int GetHashCode()
// {
// return 0;
// }

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0665


Mensaje de error
La asignación en la expresión condicional siempre es constante; ¿pretendía utilizar == en lugar de = ?
Assignment in conditional expression is always constant; did you mean to use == instead of = ?
Una expresión condicional utiliza el operador = en lugar del operador ==.
El código siguiente genera el error CS0665:

// CS0665.cs
// compile with: /W:3
class Test
{
public static void Main()
{
bool i = false;

if (i = true) // CS0665
// try the following line instead
// if (i == true)
{
}

System.Console.WriteLine(i);
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0675


Mensaje de error
Operador OR bit a bit usado en un operando con extensión de signo; considere la posibilidad de convertir en primer lugar a un
tipo sin signo más pequeño
Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first
El compilador amplió y extendió el signo de una variable implícitamente, y a continuación utilizó el valor resultante en una
operación OR bit a bit. Esto puede dar como resultado un comportamiento inesperado.
El código siguiente genera la advertencia CS0675:

// CS0675.cs
// compile with: /W:3
using System;

public class sign


{
public static void Main()
{
int hi = 1;
int lo = 1;
long value = (((long)hi) << 32) | lo; // CS0675
// try the following line instead
// long value = (((long)hi) << 32) | ((uint)lo); // correct
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS0693


Mensaje de error
El parámetro de tipo 'parámetro de tipo' tiene el mismo nombre que el parámetro de tipo del tipo externo 'tipo'
Type parameter 'type parameter' has the same name as the type parameter from outer type 'type'
Un parámetro de tipo de clase interno oculta el parámetro de tipo de clase externo del mismo nombre. Para evitar esta
situación, utilice un nombre diferente para uno de los parámetros de tipo.
Ejemplo
En el código siguiente se genera el error CS0693.

// CS0693.cs
// compile with: /W:3 /target:library
class Outer<T>
{
class Inner<T> {} // CS0693
// try the following line instead
// class Inner<U> {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS1700


Mensaje de error
La referencia de ensamblado Nombre del ensamblado no es válida y no se puede resolver
Assembly reference Assembly Name is invalid and cannot be resolved
Esta advertencia indica que no se especificó correctamente un atributo, por ejemplo InternalsVisibleToAttribute.
Para obtener más información, vea Ensamblados de confianza (Guía de programación de C#).
Ejemplo
El código siguiente genera la advertencia CS1700.

// CS1700.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("app2, Retargetable=f")] // CS1700
[assembly:InternalsVisibleTo("app2")] // OK
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS1702


Mensaje de error
Suponiendo que la referencia del ensamblado "Nombre del ensamblado 1" coincide con "Nombre del ensamblado 2", puede
ser que necesite proporcionar la directiva en tiempo de ejecución
Assuming assembly reference "Assembly Name #1" matches "Assembly Name #2", you may need to supply runtime policy
Las dos referencias de ensamblado tienen números diferentes de versiones de compilación y/o revisión, por lo que no se
unificarán automáticamente. Puede ser necesario proporcionar la directiva en tiempo de ejecución para forzar la unificación
mediante las directivas del archivo .config de la aplicación.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS1717


Mensaje de error
Asignación a la misma variable. ¿Pretendía asignar otro elemento?
Assignment made to same variable; did you mean to assign something else?
Esta advertencia se produce cuando se asigna una variable a sí misma, como a = a.

Existen varios errores comunes que pueden generar esta advertencia:


Escribir a = a como condición de una instrucción if, como if (a = a). Es probable que lo que se quiera decir es if (a
== a), que siempre es verdadero; en este caso resulta más conciso escribir if (true).

Error tipográfico. Es probable que lo que se quiera decir es a = b.

En un constructor donde el parámetro tiene el mismo nombre que el campo, no se ha utilizado la palabra clave this: es
probable que se quiera decir this.a = a.

Ejemplo
El código siguiente genera la advertencia CS1717.

// CS1717.cs
// compile with: /W:3
public class Test
{
public static void Main()
{
int x = 0;
x = x; // CS1717
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 3) CS1718


Mensaje de error
Comparación con la misma variable. ¿Pretendía comparar otro elemento?
Comparison made to same variable; did you mean to compare something else?
Si deseaba efectuar la comparación con otro elemento, bastará con corregir la instrucción.
Sin embargo, otra posibilidad es que haya tratado de realizar una comprobación de true y false, pero con instrucciones como
if (a == a) (true) o if (a < a) (false). Es mejor utilizar simplemente if (true) o if (false). Existen dos motivos para
ello:
Es más fácil: siempre resulta más claro decir sencillamente lo que se quiere decir.
Ayuda a evitar la confusión: una nueva característica de C# 2.0 son los tipos de valores que aceptan valores NULL. Ésta es
análoga al valor null de T-SQL, el lenguaje de programación utilizado por SQL Server. Los desarrolladores que conocen
T-SQL podrían tener dudas sobre el efecto de los tipos que aceptan valores NULL en expresiones como if (a == a),
debido al uso de la lógica ternaria en T-SQL. Si se utiliza true o false, se evita esta posible confusión.
Ejemplo
El código siguiente genera la advertencia CS1718.

// CS1718.cs
using System;
public class Tester
{
public static void Main()
{
int i = 0;
if (i == i) { // CS1718.cs
//if (true) {
i++;
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0028


Mensaje de error
'declaración de función' tiene una firma incorrecta para ser un punto de entrada
'function declaration' has the wrong signature to be an entry point
La declaración de método para Main no es válida: se ha declarado con una firma no válida. Main tiene que declararse como
static y tiene que devolver un valor int o void. Para obtener más información, vea
Main() y argumentos de línea de comandos (Guía de programación de C#).
El código siguiente genera la advertencia CS0028:

// CS0028.cs
// compile with: /W:4 /warnaserror
public class a
{
public static double Main(int i) // CS0028
// Try the following line instead:
// public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0078


Mensaje de error
El sufijo 'l' se confunde fácilmente con el dígito '1' – utilice 'L' para mayor claridad
The 'l' suffix is easily confused with the digit '1' -- use 'L' for clarity
El compilador realiza una advertencia cuando detecta una conversión a un tipo long mediante una 'l' minúscula en lugar de 'L'
mayúscula.
El código siguiente genera el error CS0078:

// CS0078.cs
// compile with: /W:4
class test {
public static void TestL(long i)
{
}
public static void TestL(int i)
{
}

public static void Main()


{
TestL(25l); // CS0078
// try the following line instead
// TestL(25L);
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0109


Mensaje de error
El miembro 'miembro' no oculta un miembro heredado. La palabra clave new no es necesaria.
The member 'member' does not hide an inherited member. The new keyword is not required
Una declaración de clase incluía la palabra clave new, aun cuando dicha declaración no reemplaza una declaración existente en
una clase base. Es posible eliminar la palabra clave new.
El código siguiente genera la advertencia CS0109:

// CS0109.cs
// compile with: /W:4
namespace x
{
public class a
{
public int i;
}

public class b : a
{
public new int i;
public new int j; // CS0109
public static void Main()
{
}
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0402


Mensaje de error
'identificador': un punto de entrada no puede ser genérico ni estar en un tipo genérico
'identifier' : an entry point cannot be generic or in a generic type
Se ha encontrado el punto de entrada en un tipo genérico. Para quitar esta advertencia, implemente Main en una clase o
estructura no genérica.

// CS0402.cs
// compile with: /W:4
class C<T>
{
public static void Main() // CS0402
{

}
}

class CMain
{
public static void Main() {}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0422


Mensaje de error
La opción /incremental ya no se admite
The /incremental option is no longer supported
La compilación incremental (/incr o /incremental) no se admite en Visual C# 2005.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0429


Mensaje de error
Se ha detectado un código de expresión al que no se puede tener acceso
Unreachable expression code detected
Este error aparece siempre que no se puede tener acceso a parte de una expresión del código. En el siguiente ejemplo, la
condición false && myTest() cumple este criterio, porque el método myTest() nunca se evaluará debido al hecho de que el
lado izquierdo de la operación && siempre es falso. En cuanto el operador && evalúa la instrucción false como falsa detiene la
evaluación, y no evalúa en ningún caso el lado derecho.
Ejemplo
En el código siguiente se genera el error CS0429.

// CS0429.cs
public class cs0429
{
public static void Main()
{
if (false && myTest()) // CS0429
// Try the following line instead:
// if (true && myTest())
{
}
else
{
int i = 0;
i++;
}
}

static bool myTest() { return true; }


}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0628


Mensaje de error
'miembro': nuevo miembro protegido declarado en la clase sealed
'member' : new protected member declared in sealed class
Una clase sealed no puede incluir un miembro protected porque ninguna otra clase podría heredar de la clase sealed y utilizar
el miembro protected.
El código siguiente genera el error CS0628:

// CS0628.cs
// compile with: /W:4
sealed class C
{
protected int i; // CS0628
}
class MyClass
{
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS0649


Mensaje de error
El campo 'campo' nunca se asigna y siempre tendrá el valor predeterminado 'valor'
Field 'field' is never assigned to, and will always have its default value 'value'
El compilador detectó una declaración de campo no inicializada, privada o interna a la que nunca se le ha asignado ningún
valor.
El código siguiente genera la advertencia CS0649:

// CS0649.cs
// compile with: /W:4
using System.Collections;

class MyClass
{
Hashtable table; // CS0649
// You may have intended to initialize the variable to null
// Hashtable table = null;

// Or you may have meant to create an object here


// Hashtable table = new Hashtable();

public void Func(object o, string p)


{
// Or here
// table = new Hashtable();
table[p] = o;
}

public static void Main()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS1573


Mensaje de error
El parámetro 'parámetro' no tiene la etiqueta param correspondiente en el comentario XML para 'parámetro' (pero sí otros
parámetros)
Parameter 'parameter' has no matching param tag in the XML comment for 'parameter' (but other parameters do)
Al utilizar la opción /doc del compilador se especificó un comentario para algunos, pero no todos los parámetros de un
método. Puede que se haya pasado por alto especificar un comentario para esos parámetros.
El código siguiente genera la advertencia CS1573:

// CS1573.cs
// compile with: /W:4
public class MyClass
{
/// <param name='Int1'>Used to indicate status.</param>
// enter a comment for Char1?
public static void MyMethod(int Int1, char Char1)
{
}

public static void Main ()


{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS1591


Mensaje de error
Falta el comentario XML para el tipo o miembro visible de forma pública 'Tipo_o_Miembro'
Missing XML comment for publicly visible type or member 'Type_or_Member'
Se especificó la opción /doc del compilador pero una o varias construcciones no tienen comentarios.
El código siguiente genera la advertencia CS1591:

// CS1591.cs
// compile with: /W:4 /doc:x.xml

/// text
public class Test
{
// /// text
public static void Main() // CS1591, remove "//" from previous line
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS1610


Mensaje de error
No se puede borrar el archivo temporal 'archivo' usado para el recurso Win32 predeterminado -- 'recurso'
Unable to delete temporary file 'file' used for default Win32 resource -- resource
Cuando se utiliza la opción /win32res del compilador y el directorio %TEMP% no tiene permiso de tipo DELETE, esta
advertencia indica que el compilador no pudo eliminar el archivo temporal que había creado.
Asegúrese de que dispone de permisos de lectura, escritura y eliminación en el directorio %TEMP%.
Si es necesario, se pueden eliminar manualmente estos archivos sin daño para C# ni para ninguno de los programas creados.
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 4) CS1712


Mensaje de error
El parámetro de tipo 'parámetro de tipo' no tiene ninguna etiqueta typeparam correspondiente en el comentario XML en 'tipo'
(pero sí otros parámetros de tipo)
Type parameter 'type parameter' has no matching typeparam tag in the XML comment on 'type' (but other type parameters
do)
Falta una etiqueta typeparam en la documentación de un tipo genérico. Para obtener más información, vea
<typeparam> (Guía de programación de C#).
Ejemplo
En el código siguiente se genera la advertencia CS1712. Para resolver este error, agregue una etiqueta typeparam para el
parámetro de tipo S.

// CS1712.cs
// compile with: /doc:cs1712.xml
using System;
class Test
{
public static void Main() {}
/// <param name="j"> This is the j parameter.</param>
/// <typeparam name="T"> This is the T type parameter.</typeparam>
public void bar<T,S>(int j) {} // CS1712
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1725


Mensaje de error
La referencia del ensamblado de confianza 'referencia' no es válida. Las declaraciones InternalsVisibleTo no pueden especificar
una versión, referencia cultural, símbolo (token) de clave pública o arquitectura de procesador.
Friend assembly reference 'reference' is invalid. InternalsVisibleTo declarations cannot have a version, culture, public key token,
or processor architecture specified.
No puede agregar una referencia cultural de versión en una referencia del ensamblado de confianza. Las clases parciales
deben ser visibles para los ensamblados de confianza.
Ejemplo
El código siguiente genera el error CS1725.

// CS1725.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("partial01,version=1.1.0.0")] // CS1725
// try the following line instead
// [assembly:InternalsVisibleTo("partial01")]

partial class TestClass


{
public static string strBar = "my string";
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1726


Mensaje de error
La referencia al ensamblado de confianza 'referencia' no es válida. Los ensamblados firmados con nombre seguro deben
especificar una clave pública en sus declaraciones de InternalsVisibleTo.
Friend assembly reference 'reference' is invalid. Strong-name signed assemblies must specify a public key in their
InternalsVisibleTo declarations.
Un ensamblado firmado con nombre seguro sólo puede conceder acceso de ensamblado de confianza, mediante
InternalsVisibleToAttribute, a otros ensamblados firmados con nombre seguro.
Para resolver el error CS1726, firme el ensamblado (asígnele un nombre seguro) al que desee conceder acceso de confianza o
no conceda acceso de confianza.
Para obtener más información, vea Ensamblados de confianza (Guía de programación de C#).
Ejemplo
El código siguiente genera el error CS1726.

// CS1726.cs
// compile with: /keyfile:CS1726.key /target:library
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("UnsignedAssembly")] // CS1726
// try the following line instead
// [assembly:InternalsVisibleTo("SignedAssembly, PublicKey=00240000048000009400000006020000
00240000525341310004000001000100031d7b6f3abc16c7de526fd67ec2926fe68ed2f9901afbc5f1b6b428bf6
cd9086021a0b38b76bc340dc6ab27b65e4a593fa0e60689ac98dd71a12248ca025751d135df7b98c5f9d09172f7
b62dabdd302b2a1ae688731ff3fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c581fc0f
2d966b77114b2c4")]

class A {}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 2) CS0472


Mensaje de error
El resultado de la expresión siempre es 'value1', dado que un valor de tipo 'value2' nunca es igual a 'null' de tipo 'value3'
The result of the expression is always 'value1' since a value of type 'value2' is never equal to 'null' of type 'value3'
El compilador debe advertir si se utiliza un operador con un valor nulo constante.
Ejemplo
El código siguiente genera la advertencia CS0472.

public class Test


{
public static int Main()
{
int i = 5;
int counter = 0;

// Comparison:
if (i == null) // CS0472
// To resolve, use a valid value for i.
counter++;
return counter;
}
}
Referencia de Visual C#: errores y advertencias

Error del compilador CS1727


Mensaje de error
No se puede enviar automáticamente el informe de errores sin autorización. Visite " para autorizar el envío del informe de
errores.
Cannot send error report automatically without authorization. Please visit '' to authorize sending error report.
El sitio Web mencionado en el texto del error explica cómo habilitar la notificación automática de errores para las herramientas
de línea de comandos Visual Studio 2005.
Ejemplo
El código siguiente genera el error CS1727.

// CS1727.cs
// compile with: /errorreport:send
// CS1727 expected
class Test {}
Referencia de Visual C#: errores y advertencias

Error del compilador CS0735


Mensaje de error
Tipo no válido especificado como argumento para el atributo TypeForwardedTo
Invalid type specified as an argument for TypeForwardedTo attribute
El código siguiente genera el error CS0735.

// CS735.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(int[]))] // CS0735
[assembly:TypeForwardedTo(typeof(string))] // OK
Referencia de Visual C#: errores y advertencias

Error del compilador CS1057


Mensaje de error
'miembro': las clases estáticas no pueden contener miembros protegidos"
'member': static classes cannot contain protected members"
Este error se genera al declarar un miembro protegido dentro de una clase estática.
Ejemplo
En el código siguiente se genera el error CS1057.

// CS1057.cs
using System;

static class Class1


{
protected static int x; // CS1057
public static void Main()
{
}
}
Referencia de Visual C#: errores y advertencias

Advertencia del compilador (nivel 1) CS1058


Mensaje de error
Una cláusula catch previa ya detecta todas las excepciones. Todas las excepciones generadas que no sean CLS se ajustarán en
System.Runtime.CompilerServices.RuntimeWrappedException
A previous catch clause already catches all exceptions. All non-CLS exceptions thrown will be wrapped in a
System.Runtime.CompilerServices.RuntimeWrappedException
Este atributo genera la advertencia CS1058 si un bloque catch() no tiene ningún tipo de excepción especificado después de
un bloque catch (System.Exception e). La advertencia informa de que el bloque catch() no detectará ninguna excepción.
Un bloque catch() después de un bloque catch (System.Exception e) puede detectar las excepciones que no son CLS si
RuntimeCompatibilityAttribute está establecido en false en el archivo AssemblyInfo.cs: [assembly:
RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)]. Si este atributo no está establecido explícitamente en
false, todas las excepciones generadas que no sean CLS se ajustarán como Exceptions y el bloque catch (System.Exception
e) las detectará. Para obtener más información, vea Cómo: Detectar excepciones no compatibles con CLS.

Ejemplo
El código siguiente genera el error CS1058.

// CS1058.cs
// CS1058 expected
using System.Runtime.CompilerServices;

// the following attribute is set to true by default in the C# compiler


// set to false in your source code to resolve CS1058
[assembly: RuntimeCompatibilityAttribute(WrapNonExceptionThrows = false)]

class TestClass
{
static void Main()
{
try {}

catch (System.Exception e) {
System. Console.WriteLine("Caught exception {0}", e);
}

catch {} // CS1058. This line will never be reached.


}
}
Referencia del lenguaje C#

Terminología de C#
Campo [field]
Miembro de datos de una clase o estructura a la que se tiene acceso directamente.
Clase [class]
Tipo de datos que describe un objeto. Las clases contienen datos y métodos que actúan en los datos. Para obtener más
información, vea Clases.
Clase base [base class]
Clase heredada por otra clase 'derivada'. Para obtener más información, vea Herencia.
Clase derivada [derived class]
Clase que utiliza la herencia para obtener, aumentar o modificar el comportamiento y los datos de otra clase 'base'. Para
obtener más información, vea Herencia.
Constructor [constructor]
Método especial de una clase o estructura que inicializa objetos de ese tipo. Para obtener más información, vea
Constructores (Guía de programación de C#).
Delegado [delegate]
Un delegado es un tipo que hace referencia a un método. Cuando se asigna un método a un delegado, éste se comporta
exactamente como el método. Para obtener más información, vea Delegados (Guía de programación de C#).
Descriptor de acceso [accessor]
Método que establece o recupera el valor de un miembro de datos privado asociado a una propiedad. Las propiedades de
lectura y escritura tienen descriptores de acceso get y set. Las propiedades que son de sólo lectura pueden tener sólo un
descriptor de acceso get. Para obtener más información, vea Propiedades.
Destructor [destructor]
Método especial de una clase o estructura que prepara la instancia para su destrucción por el sistema. Para obtener más
información, vea Destructores (Guía de programación de C#).
Evento [event]
Miembro de una clase o estructura que envía notificaciones de un cambio. Para obtener más información, vea
Events (Guía de programación de C#).
Genéricos [generics]
Los genéricos permiten definir una clase o método definidos con un parámetro de tipo. Cuando el código de cliente crea
instancias del tipo, especifica un tipo determinado como un argumento. Para obtener más información, vea
Genéricos (Guía de programación de C#).
Herencia [inheritance]
C# admite la herencia, de manera que una clase que se deriva de otra clase, conocida como clase base, hereda los mismos
métodos y propiedades. La herencia implica clases base y clases derivadas. Para obtener más información, vea Herencia.
IDE [IDE]
Entorno de desarrollo integrado. Aplicación que proporciona la interfaz de usuario unificada para las distintas herramientas
de desarrollo como el compilador, depurador, editor de código y diseñadores.
Interfaz [interface]
Tipo que contiene sólo las firmas de métodos públicos, eventos y delegados. Un objeto que hereda la interfaz debe
implementar todos los métodos y eventos definidos en la interfaz. Las clases o estructuras pueden heredar cualquier número
de interfaces. Para obtener más información, vea Interfaces (Guía de programación de C#).
Iterador [iterator]
Un iterador es un método que permite a los consumidores de una clase que contiene una colección o matriz utilizar
foreach, in (Referencia de C#) para recorrer esa colección o matriz.
Método [method]
Bloque de código con nombre que proporciona el comportamiento de una clase o estructura.
Método anónimo [anonymous method]
Un método anónimo es un bloque de código que se pasa como parámetro a un delegado. Para obtener más información,
vea Métodos anónimos (Guía de programación de C#).
Miembro [member]
Campo, propiedad, método o evento declarado en una clase o estructura.
Miembro accesible [accessible member]
Miembro al que se puede tener acceso mediante un tipo determinado. Un miembro accesible para un tipo no es
necesariamente accesible para otro tipo. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#) y Ensamblados de confianza (Guía de programación de C#).
Miembro inaccesible [inaccessible member]
Miembro al que no se puede tener acceso mediante un tipo determinado. Un miembro inaccesible para un tipo no es
necesariamente inaccesible para otro tipo. Para obtener más información, vea
Modificadores de acceso (Guía de programación de C#).
Modificador de acceso [access modifier]
Una palabra clave, como private, protected, internal o public, que restringe el acceso a un tipo o miembro de tipo. Para
obtener más información, vea Modificadores de acceso (Guía de programación de C#).
Objeto [object]
Instancia de una clase. Un objeto existe en memoria y tiene los datos y métodos que actúan sobre los datos. Para obtener
más información, vea Objetos, clases y estructuras (Guía de programación de C#).
Pila de llamadas [call stack]
Serie de llamadas a métodos que conducen del principio del programa a la instrucción que se ejecuta actualmente en tiempo
de ejecución.
Propiedad [property]
Miembro de datos al que se obtiene acceso por medio de un descriptor de acceso. Para obtener más información, vea
Propiedades (Guía de programación de C#).
Refactorización [refactoring]
Reutilizar código previamente escrito. El Editor de código de Visual C# Express puede cambiar de manera inteligente el
formato del código a, por ejemplo, convertir un bloque de código resaltado en un método. Para obtener más información,
vea Refactorización.
static [static]
Una clase o método declarado como static existe sin crearse primero instancias utilizando la palabra clave new. Main() es un
método estático. Para obtener más información, vea Clases estáticas y sus miembros (Guía de programación de C#).
struct [struct]
Tipo de datos compuesto que se utiliza normalmente para contener unas variables que tienen alguna relación lógica. Las
estructuras también pueden contener métodos y eventos. Las estructuras no admiten la herencia pero admiten interfaces.
Una estructura es un tipo de valor, mientras que una clase es un tipo de referencia. Para obtener más información, vea
Estructuras (Guía de programación de C#).
Tipo anidado [nested type]
Tipo declarado dentro de la declaración de otro tipo.
Tipo de referencia [reference type]
Tipo de datos. Una variable declarada como un tipo de referencia señala una ubicación donde se almacenan los datos. Para
obtener más información, vea Tipos de referencia.
Tipo de valor [value type]
Un tipo de valor es un tipo de datos que se asigna en la pila, a diferencia de un tipo de referencia que está asignado en el
montón. Los tipos integrados, entre los que se incluyen los tipos numéricos así como el tipo de estructura y el tipo que
acepta valores NULL, son todos tipos de valor. El tipo class y el tipo string son tipos de referencia. Para obtener más
información, vea Tipos de valores (Referencia de C#).
Tipo inmutable [immutable type]
Tipo cuyos datos de instancia (campos y propiedades) no cambian después de crear la instancia. La mayoría de los tipos de
valor son inmutables.
Tipo mutable [mutable type]
Tipo cuyos datos de instancia (campos y propiedades) pueden cambiar después de crear la instancia. La mayoría de los
tipos de referencia son mutables.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Referencia del lenguaje C#

Especificación del lenguaje C#


Las versiones 1.2 y 2.0 de las Características técnicas del lenguaje C# son el origen autorizado de la gramática y la sintaxis de
C#. Contienen información detallada sobre todos los aspectos del lenguaje, incluidos varios puntos que no se tratan en la
documentación del producto de Visual C#.
En las características técnicas de la versión 1.2 se describen las funciones que se agregaron al lenguaje antes de lanzar Visual
C# 2005 y las características técnicas de la versión 2.0 tratan funciones que se agregaron en Visual C# 2005.
Las Características técnicas del lenguaje C# están disponibles en formato de Microsoft Word en las ubicaciones siguientes:
En MSDN online en el Centro para desarrolladores de Visual C#.
En Visual Studio, en el directorio VC#\Specifications\1033\ bajo el directorio de instalación de Microsoft Visual Studio
2005.
Si no tiene Microsoft Word instalado en su equipo, puede ver, copiar e imprimir la versión para Word de las características
técnicas con la aplicación gratuita Word Viewer 2003.
Las Características técnicas del lenguaje C# también están disponibles como un libro publicado por Addison Wesley.
Vea también
Conceptos
Guía de programación de C#
Otros recursos
Referencia de C#
Ejemplos de Visual C#

Ejemplos de Visual C#
Puede tener acceso al código de ejemplo explorando los resúmenes de los ejemplos de esta sección. Cada resumen contiene
un vínculo para abrir o copiar los archivos del ejemplo. Además, el .NET Framework SDK incluye tecnología y ejemplos de
aplicaciones, así como tutoriales rápidos que muestran las características de .NET Framework y el código de Visual C#.
Los tutoriales son la forma más rápida de comprender lo que ofrece la tecnología de .NET Framework a los programadores.
Los tutoriales rápidos son una serie de ejemplos y documentación complementaria diseñados para informarle rápidamente de
la sintaxis, arquitectura y eficacia de Visual Studio y .NET Framework. Estos tutoriales incluyen ejemplos sobre aplicaciones
ASP.NET y formularios Windows Forms, así como muchas aplicaciones de aprendizaje que incluyen las características más
atractivas de la tecnología de .NET Framework.
Para tener acceso a los tutoriales rápidos, haga clic en Inicio, elija Programas, Microsoft .NET Framework SDK v2.0 y, a
continuación, haga clic en Tutoriales rápidos. Se muestra una página Web de la aplicación "Tutoriales rápidos de Microsoft
.NET Framework SDK". Para ejecutar los tutoriales rápidos, siga las instrucciones de esta página, que configura la base de datos
de ejemplos y finaliza la instalación. Para obtener más información, vea Ejemplos y tutoriales.
Nota
Los usuarios de Visual C# Express verán el mensaje siguiente al abrir el archivo de solución (.sln) de Visual Studio para cada
uno de estos ejemplos: "Las carpetas de soluciones no son compatibles con esta versión de de Visual Studio. La carp
eta de soluciones 'Solution Items' se mostrará como no disponible". Aunque esta carpeta no está disponible en Visual
C# Express, puede generar y ejecutar igualmente los proyectos.

En esta sección
Ejemplos preliminares
Ejemplo de delegados anónimos Muestra el uso de delegados sin nombre para reducir la complejidad de la a
plicación.

Ejemplo Arrays Muestra el uso de matrices.

Ejemplo de clases de colección Muestra cómo crear clases de colección no genéricas que pueden utilizarse
con la instrucción foreach.

Ejemplo de clases genéricas (C#) Muestra cómo crear clases de colección genéricas que pueden utilizarse con
la instrucción foreach.

Ejemplo de parámetros de la línea de comandos Muestra el procesamiento sencillo de la línea de comandos y la indización d
e matrices.

Ejemplo de métodos condicionales Este tutorial trata sobre los métodos condicionales, los cuales proporcionan
un poderoso mecanismo con el que las llamadas a métodos se pueden incl
uir u omitir dependiendo de si se ha definido o no un símbolo.

Ejemplo de delegados Muestra cómo se declaran, asignan y combinan los delegados.

Ejemplo de eventos Muestra cómo utilizar los eventos en C#.

Ejemplo de implementación explícita de interfaces Muestra cómo implementar explícitamente los miembros de interfaz.

Ejemplo Hello World Una aplicación Hello World.

Ejemplo de indizadores Muestra cómo utilizar la notación de matrices para obtener acceso a un obj
eto.
Ejemplo de propiedades indizadas Muestra cómo implementar una clase que utiliza propiedades indizadas. La
s propiedades indizadas permiten utilizar una clase que representa una cole
cción, semejante a una matriz, de diferentes tipos de elementos.

Ejemplo de propiedades Muestra cómo se declaran y utilizan las propiedades, así como el uso de las
propiedades abstractas.

Ejemplo Structs Muestra cómo utilizar structs en C#.

Ejemplo Operator Overloading Muestra cómo las clases definidas por el usuario pueden sobrecargar opera
dores.

Ejemplo User-Defined Conversions Muestra cómo definir conversiones a o desde tipos definidos por el usuario.

Ejemplo del control de versiones Ilustra el control de versiones en C# mediante el uso de las palabras clave o
verride y new.

Ejemplo de devolución de resultados Muestra cómo utilizar la palabra clave yield para filtrar los elementos de un
a colección.
Ejemplos intermedios y avanzados
Ejemplo de atributos Este tutorial muestra cómo crear clases de atributos personalizados, utilizarlas en el c
ódigo y consultarlas a través del mecanismo de reflexión.

Interoperabilidad COM, parte 1: ejemplo Muestra cómo utilizar C# para interoperar con objetos COM.

Interoperabilidad COM, parte 2: ejemplo Este tutorial muestra el uso de un servidor C# con un cliente COM de C++.

Ejemplo de bibliotecas Muestra cómo utilizar las opciones del compilador para crear una biblioteca DLL para
varios archivos de código fuente, así como su uso en otros programas.

Ejemplo Nullable Muestra tipos de valor que se pueden establecer en null.

Ejemplo de OLE DB Muestra cómo utilizar una base de datos de Microsoft Access desde C#. Enseña a crea
r un conjunto de datos y agregarle tablas de una base de datos.

Ejemplo de tipos parciales Muestra cómo las clases y estructuras se pueden definir en varios archivos de código
fuente de C#.

Ejemplo Platform Invoke Muestra cómo llamar a las funciones exportadas de un archivo DLL desde C#.

Ejemplo de seguridad Trata sobre la seguridad en .NET Framework y muestra dos formas de modificar los p
ermisos de seguridad en C# mediante: clases y atributos de permisos.

Ejemplo de subprocesamiento Muestra varias actividades con subprocesos, como la creación y ejecución de un subp
roceso, la sincronización e interacción entre subprocesos y el uso de un grupo de sub
procesos.

Ejemplo de código no seguro Muestra el uso de punteros.

Ejemplo XML Documentation Muestra cómo documentar el código desarrollado usando XML.

Secciones relacionadas
Ejemplos y tutoriales | Tutoriales de Visual C#
Ejemplos de Visual C#

Ejemplo Hello World


Download sample
En este ejemplo se muestran varias versiones del programa Hello World en C#.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir los archivos de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos o hacer clic de nuevo en Siguiente.
4. Asegúrese de que la casilla de verificación Mostrar archivos extraídos está activada y haga clic en Finalizar.
5. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría aparecer una advertencia de seguridad que
indica que la solución del proyecto no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de Hello World en Visual Studio
1. Abra la solución (HelloWorld.sln).
2. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto HelloWorld1 y, a
continuación, seleccione Establecer como proyecto de inicio.
3. En el menú Depurar, haga clic en Iniciar sin depurar.
4. Presione una tecla para cerrar HelloWorld1.
5. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto HelloWorld2 y, a
continuación, seleccione Establecer como proyecto de inicio.
6. En el menú Depurar, haga clic en Iniciar sin depurar.
7. Presione una tecla para cerrar HelloWorld2.
8. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto HelloWorld3 y, a
continuación, seleccione Establecer como proyecto de inicio.
9. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto HelloWorld3 y, a
continuación, seleccione Propiedades.
10. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
11. En la propiedad Argumentos de la línea de comandos, escriba A B C D y haga clic en Aceptar.
12. En el menú Depurar, haga clic en Iniciar sin depurar.
13. Presione una tecla para cerrar HelloWorld3.
14. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto HelloWorld4 y, a
continuación, seleccione Establecer como proyecto de inicio.
15. En el menú Depurar, haga clic en Iniciar sin depurar.
16. Presione una tecla para cerrar HelloWorld4.
Para generar y ejecutar los ejemplos de Hello World desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio HelloWorld.
2. Escriba lo siguiente:

cd HelloWorld1
csc Hello1.cs
Hello1

3. Escriba lo siguiente:

cd ..\HelloWorld2
csc Hello2.cs
Hello2

4. Escriba lo siguiente:

cd ..\HelloWorld3
csc Hello3.cs
Hello3 A B C D

5. Escriba lo siguiente:

cd ..\HelloWorld4
csc Hello4.cs
Hello4

Vea también
Conceptos
Hello World, su primer programa (Guía de programación de C#)
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de parámetros de la línea de comandos


Download sample
En este ejemplo se muestra cómo se puede obtener acceso a la línea de comandos, así como dos modos de obtener acceso a la
matriz de parámetros de la línea de comandos.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de parámetros de la línea de comandos en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto CmdLine1 y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto y, a continuación,
seleccione Propiedades.
3. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
4. En la propiedad Argumentos de la línea de comandos, escriba los parámetros de la línea de comandos y haga clic en
Aceptar. (Vea el tutorial para obtener un ejemplo.)
5. En el menú Depurar, haga clic en Iniciar sin depurar.
6. Repita los pasos anteriores para CmdLine2.
Para generar y ejecutar los ejemplos de parámetros de la línea de comandos desde la línea de
comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio CmdLine1.
2. Escriba lo siguiente:

csc cmdline1.cs
cmdline1 A B C

3. Utilice el comando Cambiar directorio para cambiar al directorio CmdLine2.


4. Escriba lo siguiente:
csc cmdline2.cs
cmdline2 John Paul Mary

Vea también
Tareas
Cómo: Mostrar argumentos de línea de comandos (Guía de programación de C#)
Cómo: Obtener acceso a argumentos de línea de comandos mediante Foreach (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo Arrays
Download sample
En este ejemplo se describen las matrices y se muestra cómo funcionan en C#. Para obtener más información, vea
Matrices (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo Arrays en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo Arrays desde la línea de comandos
Escriba lo siguiente en la línea de comandos:

csc arrays.cs
arrays

Vea también
Referencia
Pasar matrices como parámetros (Guía de programación de C#)
Pasar matrices mediante Ref y Out (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de propiedades
Download sample
En este ejemplo se muestra cómo las propiedades son una parte integrante del lenguaje de programación C#. Se explica cómo
se declaran y utilizan las propiedades. Vea Propiedades (Guía de programación de C#) para obtener más información.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de propiedades en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Person y seleccione
Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para shapetest.
Para generar y ejecutar los ejemplos de propiedades desde la línea de comandos:
1. Utilice el comando Cambiar directorio para cambiar al directorio person.
2. Escriba lo siguiente:

csc person.cs
person

3. Utilice el comando Cambiar directorio para cambiar al directorio shapetest.


4. Escriba lo siguiente:

csc abstractshape.cs shapes.cs shapetest.cs


shapetest

Vea también
Tareas
Cómo: Declarar y utilizar propiedades de lectura y escritura (Guía de programación de C#)
Cómo: Definir propiedades abstractas (Guía de programación de C#)
Referencia
Comparación entre propiedades e indizadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de bibliotecas
Download sample
En este ejemplo se muestra cómo crear y utilizar un archivo DLL en C#.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de bibliotecas en Visual Studio:
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto FunctionTest y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto FunctionTest y, a
continuación, seleccione Propiedades.
3. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
4. En la propiedad Argumentos de la línea de comandos, escriba 3 5 10.

5. Haga clic en Aceptar.


6. En el menú Depurar, haga clic en Iniciar sin depurar. Esto generará automáticamente la biblioteca en Functions y
ejecutará el programa.
Para generar y ejecutar el ejemplo Libraries desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Functions.
2. Escriba lo siguiente:

csc /target:library /out:Functions.dll Factorial.cs DigitCounter.cs

3. Utilice el comando Cambiar directorio para cambiar al directorio FunctionTest.


4. Escriba lo siguiente:

copy ..\Functions\Functions.dll .
csc /out:FunctionTest.exe /R:Functions.DLL FunctionClient.cs
FunctionTest 3 5 10
Vea también
Tareas
Cómo: Crear y utilizar archivos DLL de C# (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo del control de versiones


Download sample
Este ejemplo muestra el control de versiones en C# mediante el uso de las palabras clave override y new. El control de
versiones mantiene la compatibilidad entre las clases base y derivadas a medida que evolucionan. Para obtener información
adicional, vea Control de versiones con las palabras clave Override y New (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de control de versiones en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de control de versiones desde la línea de comandos
Escriba lo siguiente en la línea de comandos:

csc versioning.cs
versioning

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de clases de colección


Download sample
En este ejemplo se muestra cómo implementar una clase de colección que se puede utilizar con la instrucción foreach. Para
obtener más información, vea Clases de colección (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de clases de colección en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto CollectionClasses1 y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para CollectionClasses2.
Para generar y ejecutar los ejemplos de clases de colección desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio CollectionClasses1.
2. Escriba lo siguiente:

csc tokens.cs
tokens

3. Utilice el comando Cambiar directorio para cambiar al directorio CollectionClasses2.


4. Escriba lo siguiente:

csc tokens2.cs
tokens2

Vea también
Tareas
Cómo: Obtener acceso a una clase de colección mediante Foreach (Guía de programación de C#)
Referencia
System.Collections.Generic
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Tipos de colección utilizados normalmente
Ejemplos de Visual C#

Ejemplo Structs
Download sample
Este ejemplo presenta la sintaxis y el modo de uso de las estructuras. Asimismo, trata las diferencias principales entre clases y
estructuras. Para obtener más información, vea Objetos, clases y estructuras (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos Structs en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Struct1 y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Struct2.
Para generar y ejecutar los ejemplos Structs desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Struct1.
2. Escriba lo siguiente:

csc struct1.cs
struct1

3. Utilice el comando Cambiar directorio para cambiar al directorio Struct2.


4. Escriba lo siguiente:

csc struct2.cs
struct2

Vea también
Tareas
Cómo: Saber las diferencias entre pasar a un método una estructura y una referencia a clase (Guía de programación de C#)
Referencia
struct (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de indizadores
Download sample
En este ejemplo se muestra cómo las clases de C# pueden declarar indizadores para ofrecer un acceso a las clases similar al de
las matrices.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de indizadores en Visual Studio:
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Indexers y, a
continuación, seleccione Propiedades.
2. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
3. En la propiedad Argumentos de la línea de comandos, escriba ..\..\Test.txt.
4. Haga clic en Aceptar.
5. En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar los ejemplos de indizadores desde la línea de comandos
1. Para compilar el programa de ejemplo, escriba lo siguiente en la línea de comandos:

csc indexer.cs

2. El programa de ejemplo invierte los bytes de un archivo pasado como argumento de la línea de comandos. Por ejemplo,
para invertir los bytes en Test.txt y ver el resultado, emita los siguientes comandos:

indexers Test.txt
type Test.txt

3. Para restablecer el archivo invertido a su estado normal, ejecute el programa sobre el mismo archivo otra vez.

Vea también
Referencia
Utilizar indizadores (Guía de programación de C#)
Indizadores en interfaces (Guía de programación de C#)
Comparación entre propiedades e indizadores (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de propiedades indizadas


Download sample
En este ejemplo se muestra cómo las clases de C# pueden declarar propiedades indizadas para representar una colección de
diferentes tipos de conceptos similar a las matrices. Para obtener más información, vea
Propiedades (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de propiedades indizadas de Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar los ejemplos de propiedades indizadas desde la línea de comandos
Escriba lo siguiente en la línea de comandos:

csc indexedproperty.cs
indexedproperty

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo User-Defined Conversions


Download sample
En este ejemplo se muestra cómo definir y utilizar conversiones hacia o desde clases o estructuras. Para obtener más
información, vea Operadores de conversión (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos User-Defined Conversions en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Conversion1 y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Conversion2.
Para generar y ejecutar los ejemplos User-Defined Conversions desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Conversion1.
2. Escriba lo siguiente:

csc conversion.cs
conversion

3. Utilice el comando Cambiar directorio para cambiar al directorio Conversion2.


4. Escriba lo siguiente:

csc structconversion.cs
structconversion

Vea también
Tareas
Cómo: Implementar conversiones entre estructuras definidas por el usuario (Guía de programación de C#)
Referencia
Tabla de conversiones numéricas implícitas (Referencia de C#)
Tabla de conversiones numéricas explícitas (Referencia de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de clases genéricas (C#)


Download sample
Este ejemplo muestra cómo crear una clase de lista genérica personalizada con un parámetro de tipo único y cómo
implementar IEnumerable<T> para habilitar la iteración foreach sobre el contenido de la lista. El ejemplo también muestra
cómo el código de cliente crea una instancia de la clase especificando un argumento de tipo, y cómo las restricciones en el
parámetro de tipo permiten realizar las operaciones adicionales en los argumentos de tipo.
Para obtener un ejemplo de una clase de colección genérica que implementa un bloque de iteradores, vea
Cómo: Crear un bloque de iteradores para una lista genérica (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de clases genéricas en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de clases genéricas desde la línea de comandos
Escriba lo siguiente en la línea de comandos:

csc generics.cs
generics

Comentarios
Este ejemplo es una demostración que no debe utilizarse sin modificar el código de producción. Con el fin de obtener un
código de producción de calidad, es aconsejable utilizar las clases de colección del el espacio de nombres
System.Collections.Generic siempre que sea posible.
Vea también
Referencia
System.Collections.Generic
Conceptos
Genéricos (Guía de programación de C#)
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo Operator Overloading


Download sample
En este ejemplo se muestra cómo se pueden sobrecargar operadores mediante clases definidas por el usuario. Para obtener
más información, vea Operadores de C#.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos Operator Overloading en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto Complex y, a continuación,
en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Dbbool.
Para generar y ejecutar los ejemplos Operator Overloading desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Complex.
2. Escriba lo siguiente:

csc complex.cs
complex

3. Utilice el comando Cambiar directorio para cambiar al directorio Dbbool.


4. Escriba lo siguiente:

csc dbbool.cs
dbbool

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de delegados
Download sample
Este ejemplo trata sobre los tipos delegados. Se explica cómo asignar delegados a métodos de instancia y estáticos, y cómo
combinarlos para crear delegados de multidifusión.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de delegados en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Delegates1 y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Delegates2.
Para generar y ejecutar los ejemplos de delegados desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Delegates1.
2. Escriba lo siguiente:

csc bookstore.cs
bookstore

3. Utilice el comando Cambiar directorio para cambiar al directorio Delegates2.


4. Escriba lo siguiente:

csc compose.cs
compose

Vea también
Tareas
Cómo: Combinar delegados (delegados de multidifusión) (Guía de programación de C#)
Referencia
Utilizar delegados (Guía de programación de C#)
Conceptos
Delegados (Guía de programación de C#)
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de eventos
Download sample
En este ejemplo se explica cómo declarar, invocar y configurar eventos en C#. Para obtener más información, vea
Eventos (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de eventos en Visual Studio:
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Events1 y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Events2.
Para generar y ejecutar los ejemplos de eventos desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Events1.
2. Escriba lo siguiente:

csc events1.cs
events1

3. Utilice el comando Cambiar directorio para cambiar al directorio Events2.


4. Escriba lo siguiente:

csc events2.cs
events2

Vea también
Tareas
Cómo: Suscribir y cancelar la suscripción a eventos (Guía de programación de C#)
Cómo: Publicar eventos que cumplan las directrices de .NET Framework (Guía de programación de C#)
Cómo: Producir eventos de una clase base en clases derivadas (Guía de programación de C#)
Cómo: Implementar eventos de interfaz (Guía de programación de C#)
Cómo: Utilizar un diccionario para almacenar instancias de eventos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de implementación explícita de interfaces


Download sample
En este ejemplo se muestra cómo implementar explícitamente miembros de interfaz y cómo obtener acceso a esos miembros
desde instancias de una interfaz. Para obtener información general, consulte Interfaces (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de implementación explícita de interfaces en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto ExplicitInterface1 y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para ExplicitInterface2.
Para generar y ejecutar los ejemplos de implementación explícita de interfaces en la línea de
comandos.
1. Utilice el comando Cambiar directorio para cambiar al directorio ExplicitInterface1.
2. Escriba lo siguiente:

csc explicit1.cs
explicit1

3. Utilice el comando Cambiar directorio para cambiar al directorio ExplicitInterface2.


4. Escriba lo siguiente:

csc explicit2.cs
explicit2

Vea también
Tareas
Cómo: Implementar explícitamente miembros de interfaz (Guía de programación de C#)
Cómo: Implementar explícitamente miembros de interfaz con herencia (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de métodos condicionales


Download sample
Este ejemplo trata sobre los métodos condicionales, los cuales proporcionan un mecanismo eficaz con el que las llamadas a
métodos se pueden incluir u omitir dependiendo de si se ha definido o no un símbolo.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de métodos condicionales en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto y, a continuación, en
Propiedades.
2. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
3. Establezca la propiedad Argumentos de la línea de comandos en A B C.
4. En la carpeta Propiedades de configuración, haga clic en Generar.
5. Modifique el valor de la propiedad Constantes de compilación condicional. Por ejemplo, agregue o elimine DEBUG.
Haga clic en Aceptar.
6. En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de métodos condicionales desde la línea de comandos
Para incluir el método condicional, compile y ejecute el programa de ejemplo escribiendo lo siguiente en la línea de
comandos:

csc CondMethod.cs tracetest.cs /d:DEBUG


tracetest A B C

Vea también
Referencia
Conditional (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo XML Documentation


Download sample
En este ejemplo se muestra cómo documentar código mediante XML. Vea
Comentarios de documentación XML (Guía de programación de C#) para obtener información adicional.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar el ejemplo XML Documentation en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto y, a continuación,
en Propiedades.
2. Abra la carpeta Propiedades de configuración y haga clic en Generar.
3. Establezca la propiedad Archivo de documentación XML en XMLsample.xml.
4. En el menú Generar, haga clic en Generar. El archivo XML de resultados se situará en el directorio debug.
Para generar el ejemplo XML Documentation desde la línea de comandos
1. Para generar la documentación XML de ejemplo, escriba lo siguiente en la línea de comandos:

csc XMLsample.cs /doc:XMLsample.xml

2. Para ver la documentación XML generada, emita el comando siguiente:

type XMLsample.xml

Vea también
Tareas
Cómo: Utilizar las características de documentación XML (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo Platform Invoke


Download sample
En este ejemplo se muestra cómo llamar a invocaciones de plataforma (funciones exportadas de un archivo DLL) desde C#.
Para obtener más información, vea Interoperabilidad (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos Platform Invoke en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto PinvokeTest y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Marshal y Pinvoke.
Para generar y ejecutar los ejemplos Platform Invoke desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio PinvokeTest.
2. Escriba lo siguiente:

csc PinvokeTest.cs
PinvokeTest

3. Utilice el comando Cambiar directorio para cambiar al directorio Marshal.


4. Escriba lo siguiente:

csc Marshal.cs
Marshal

5. Utilice el comando Cambiar directorio para cambiar al directorio Pinvoke.


6. Escriba lo siguiente:
csc logfont.cs pinvoke.cs
pinvoke

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Interoperabilidad COM, parte 1: ejemplo


Download sample
En este ejemplo se explica cómo un programa de C# puede interoperar con un componente COM no administrado.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de interoperabilidad COM, parte 1, en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Interop1 y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto Interop1 y, a continuación,
seleccione Propiedades.
3. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
4. En la propiedad Argumentos de la línea de comandos, escriba el nombre de un archivo AVI, como por ejemplo:
c:\winnt\clock.avi.

5. Haga clic en Aceptar.


6. En el menú Depurar, haga clic en Iniciar sin depurar.
7. Repita los pasos anteriores para Interop2.
Si el archivo QuartzTypeLib.dll incluido en Interop1 no está actualizado
1. En el Explorador de soluciones, abra Referencias para Interop1.
2. Haga clic con el botón secundario del mouse en QuartzTypeLib y, a continuación, haga clic en Quitar.
3. Haga clic con el botón secundario del mouse en Referencias y, a continuación, haga clic en Agregar referencia.
4. En la ficha COM, seleccione el componente denominado "Biblioteca de tipos de control ActiveMovie".
5. Haga clic en Seleccionar y, a continuación, haga clic en Aceptar.
6. Vuelva a generar Interop1.
Nota
El agregar una referencia a un componente produce las mismas acciones que invocar a tlbimp desde la línea de coman
dos para crear QuartzTypeLib.dll (como se muestra más adelante).

Para generar y ejecutar los ejemplos de interoperabilidad COM, parte 1, desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Interop1.
2. Escriba lo siguiente:

tlbimp %windir%\system32\quartz.dll /out:QuartzTypeLib.dll


csc /r:QuartzTypeLib.dll interop1.cs
interop1 %windir%\clock.avi

3. Utilice el comando Cambiar directorio para cambiar al directorio Interop2.


4. Escriba lo siguiente:

csc interop2.cs
interop2 %windir%\clock.avi

Vea también
Referencia
Interoperabilidad (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Interoperabilidad COM, parte 2: ejemplo


Download sample
En este ejemplo se muestra el uso de un servidor C# con un cliente COM de C++.
Nota
Visual C++ debe estar instalado para compilar este ejemplo.

Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de interoperabilidad COM, parte 2, en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto COMClient y, a
continuación, seleccione Propiedades.
2. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
3. En la propiedad Argumentos de la línea de comandos, escriba un nombre.
4. Haga clic en Aceptar.
5. En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de interoperabilidad COM, parte 2, desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio COMInteropPart2\COMClient.
2. Copie el código del servidor C# en el directorio COMClient:

copy ..\CSharpServer\CSharpServer.cs

3. Compile el servidor:

csc /target:library CSharpServer.cs


regasm CSharpServer.dll /tlb:CSharpServer.tlb

4. Compile el cliente (compruebe que las variables de ruta de acceso y de entorno están configuradas correctamente con
vcvars32.bat):

cl COMClient.cpp

5. Ejecute el cliente:

COMClient friend

Vea también
Referencia
Interoperabilidad (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de atributos
Download sample
En este ejemplo se muestra cómo crear clases de atributos personalizados, utilizarlos en el código y consultarlos a través del
mecanismo de reflexión. Para obtener más información sobre los atributos, vea Atributos (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de atributos en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar los ejemplos de atributos desde la línea de comandos
Escriba lo siguiente en la línea de comandos:

csc AttributesTutorial.cs
AttributesTutorial

Vea también
Tareas
Cómo: Crear una unión de C/C++ mediante atributos (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de seguridad
Download sample
En este ejemplo se muestra cómo modificar los permisos de seguridad mediante clases de permiso y atributos de permiso.
Para obtener información adicional, vea Seguridad (Guía de programación de C#).
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de seguridad en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto Security1 y, a
continuación, en Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para Security2 y Security3.
Para generar y ejecutar los ejemplos de seguridad desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Security1.
2. Escriba lo siguiente:

csc ImperativeSecurity.cs
ImperativeSecurity

3. Utilice el comando Cambiar directorio para cambiar al directorio Security2.


4. Escriba lo siguiente:

csc DeclarativeSecurity.cs
DeclarativeSecurity

5. Utilice el comando Cambiar directorio para cambiar al directorio Security3.


6. Escriba lo siguiente:
csc SuppressSecurity.cs
SuppressSecurity

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de subprocesamiento
Download sample
Este ejemplo muestra las técnicas de subprocesamiento siguientes. Para obtener más información, vea
Subprocesamiento (Guía de programación de C#).
Crear, iniciar y finalizar un subproceso
Utilizar un grupo de subprocesos
Sincronización e interacción de subprocesos
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de subprocesamiento en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto ThreadStartStop y,
a continuación, seleccione Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. Repita los pasos anteriores para ThreadPool y ThreadSync.
Para generar y ejecutar los ejemplos de subprocesamiento desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Threads.
2. Escriba lo siguiente:

cd ThreadStartStop
csc ThreadStartStop.cs
ThreadStartStop

3. Escriba lo siguiente:

cd ..\ThreadPool
csc ThreadPool.cs
ThreadPool
4. Escriba lo siguiente:

cd ..\ThreadSync
csc ThreadSync.cs
ThreadSync

Vea también
Tareas
Cómo: Crear y terminar subprocesos (Guía de programación de C#)
Cómo: Utilizar un grupo de subprocesos (Guía de programación de C#)
Cómo: Sincronizar un subproceso productor y un subproceso consumidor (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de código no seguro


Download sample
En este ejemplo se muestra cómo utilizar código no administrado (código que utiliza punteros) en C#.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar los ejemplos de código no seguro en Visual Studio
1. En el Explorador de soluciones, haga clic con el botón secundario del mouse (ratón) en el proyecto FastCopy y, a
continuación, seleccione Establecer como proyecto de inicio.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
3. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto ReadFile y, a continuación,
seleccione Establecer como proyecto de inicio.
4. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto ReadFile y, a continuación,
seleccione Propiedades.
5. Abra la carpeta Propiedades de configuración y haga clic en Depurar.
6. En la propiedad Argumentos de la línea de comandos, escriba ..\..\ReadFile.cs.
7. Haga clic en Aceptar.
8. En el menú Depurar, haga clic en Iniciar sin depurar.
9. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto PrintVersion y, a
continuación, seleccione Establecer como proyecto de inicio.
10. En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar los ejemplos de código no seguro desde la línea de comandos
1. Utilice el comando Cambiar directorio para cambiar al directorio Unsafe.
2. Escriba lo siguiente:

cd FastCopy
csc FastCopy.cs /unsafe
FastCopy

3. Escriba lo siguiente:

cd ..\ReadFile
csc ReadFile.cs /unsafe
ReadFile ReadFile.cs

4. Escriba lo siguiente:

cd ..\PrintVersion
csc PrintVersion.cs /unsafe
PrintVersion

Vea también
Tareas
Cómo: Utilizar punteros para copiar una matriz de bytes (Guía de programación de C#)
Cómo: Utilizar la función ReadFile de Windows (Guía de programación de C#)
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo de OLE DB
Download sample
En este ejemplo se muestra cómo utilizar una base de datos de Microsoft Access desde C#. Enseña a crear un conjunto de
datos y agregarle tablas de una base de datos. La base de datos utilizada en el programa de ejemplo, BugTypes.mdb, es un
archivo .mdb de Microsoft Access 2000.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de OLE DB en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Nota
Si se está generando la solución en modo de versión de lanzamiento, copie BugTypes.mdb en la carpeta \bin\release.

Para generar y ejecutar los ejemplos de OLE DB desde la línea de comandos


Escriba lo siguiente en la línea de comandos:

csc oledbsample.cs
oledbsample

Vea también
Conceptos
Guía de programación de C#
Otros recursos
Ejemplos de Visual C#
Obtener acceso a datos (Visual Studio)
Ejemplos de Visual C#

Ejemplo de devolución de resultados


Download sample
Este ejemplo muestra cómo crear una clase de lista que implementa IEnumerable<int> y la palabra clave yield para habilitar
la iteración foreach sobre el contenido de la lista. Se definen dos propiedades: una que devuelve los números impares y otra
que devuelve los números pares.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de código Yield en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de código Yield desde la línea de comandos
1. Utilice el comando Change Directory (cd) para cambiar al directorio Yield.
2. Escriba lo siguiente:

csc Yield.cs
Yield

Vea también
Referencia
yield (Referencia de C#)
Conceptos
Iteradores (Guía de programación de C#)
Otros recursos
Ejemplos de Visual C#
Ejemplo de clases genéricas (C#)
Ejemplos de Visual C#

Ejemplo de delegados anónimos


Download sample
Este ejemplo muestra cómo utilizar un delegado anónimo para calcular una paga extraordinaria del sueldo de un empleado. El
uso de un delegado anónimo simplifica el programa ya que no necesita definir un método separado.
Los datos de cada empleado se almacenan en un objeto que contiene la información personal así como en un delegado que
hace referencia al algoritmo necesario para calcular la paga extraordinaria. Al definir el algoritmo mediante un delegado, se
puede utilizar el mismo método para realizar el cálculo de la paga extraordinaria, independientemente de cómo se haga este
cálculo. Observe también que una variable local, multiplicador, se transforma en una variable exterior capturada porque está
referenciada en un cálculo delegado.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.

Para generar y ejecutar el ejemplo de código AnonymousDelegates en Visual Studio


En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de código AnonymousDelegates desde la línea de comandos
1. Utilice el comando Cambiar directorio (cd) para cambiar al directorio AnonymousDelegates.
2. Escriba lo siguiente:

csc AnonymousDelegates.cs
AnonymousDelegates

Vea también
Referencia
Métodos anónimos (Guía de programación de C#)
Conceptos
Delegados (Guía de programación de C#)
Otros recursos
Ejemplos de Visual C#
Referencia de C#
Ejemplos de Visual C#

Ejemplo de tipos parciales


Download sample
Este ejemplo muestra el uso de tipos parciales que permiten definir una clase o estructura en dos o más archivos de C#.
Gracias a esto, varios programadores pueden trabajar en distintas partes de una clase al mismo tiempo y guardar diferentes
facetas de una clase compleja en archivos independientes.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de código PartialTypes en Visual Studio
En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de código PartialTypes desde la línea de comandos
1. Utilice el comando Change Directory (cd) para cambiar al directorio PartialTypes.
2. Escriba lo siguiente:

csc PartialTypes.cs
PartialTypes

Vea también
Referencia
partial (Referencia de C#)
Definiciones de clase parciales (Guía de programación de C#)
Otros recursos
Ejemplos de Visual C#
Ejemplos de Visual C#

Ejemplo Nullable
Download sample
Este ejemplo muestra cómo utilizar tipos que aceptan valores NULL. Esta función permite a los tipos de valor tener un estado
no inicializado, o vacío, similar a la manera en que los tipos de referencia se pueden establecer en null.
Nota de seguridad
Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que qui
zás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales
o especiales en caso de que el código de ejemplo se utilice para otros propósitos distintos de aquellos para los que se concibi
ó.

Para abrir el archivo de ejemplo en el Explorador de soluciones


1. Haga clic en Descargar ejemplo.
Aparece el cuadro de mensaje Descarga de archivos.
2. Haga clic en Abrir y, en la columna izquierda de la ventana de carpeta ZIP, haga clic en Extraer todos los archivos.
Se abre el Asistente para extracción.
3. Haga clic en Siguiente. Puede cambiar el directorio donde se extraerán los archivos y, a continuación, haga clic de nuevo
en Siguiente.
Asegúrese de que la casilla Mostrar archivos extraídos está activada y haga clic en Finalizar.
4. Haga doble clic en el archivo .sln del ejemplo.
La solución de ejemplo se muestra en el Explorador de soluciones. Podría obtener una advertencia de seguridad que
indica que la ubicación de la solución no es de confianza. Haga clic en Aceptar para continuar.
Para generar y ejecutar el ejemplo de código de tipos que aceptan valores NULL en Visual Studio
1. Abra Nullable.sln, el archivo de solución, haciendo doble clic en el archivo en el Explorador de Windows o haciendo clic
en Abrir en el menú Archivo.
2. En el menú Depurar, haga clic en Iniciar sin depurar.
Para generar y ejecutar el ejemplo de código de tipos que aceptan valores NULL desde la línea de
comandos
1. Utilice el comando Change Directory (cd) para cambiar al subdirectorio \Boxing, \Basics u \Operator situado bajo el
directorio Nullable.
2. Para el ejemplo de Boxing, escriba lo siguiente:

csc Boxing.cs
Boxing

Para el ejemplo de Basics, escriba lo siguiente:

csc Basics.cs
Basics

Para el ejemplo de Operator, escriba lo siguiente:

csc Operator.cs
Operator
Vea también
Conceptos
Tipos que aceptan valores NULL (Guía de programación de C#)
Otros recursos
Ejemplos de Visual C#

S-ar putea să vă placă și