name indexadores c#

name - indexadores c#



El accessor debe ser más restrictivo que la propiedad o el indexador. (2)

Bueno, el error dice toda la información requerida :

modificador de accesibilidad ... el acceso debe ser más restrictivo que la propiedad ...

private OdbcConnection db { // <- property as whole is "private" get; private set; // <- accessor (set) is explictly declared as "private" }

Así que puedes hacer cualquiera

// property as a whole is "public", but "set" accessor is "private" // and so the accessor is more restrictive than the property public OdbcConnection db { // <- property as whole is "public" get; private set; // <- accessor is "private" (more restrictive than "public") }

O

private OdbcConnection db { get; set; // <- just don''t declare accessor modifier }

Tengo la siguiente clase:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Odbc; namespace Framework { public class OracleProvider { private OdbcConnection db { get; private set; } private String dbUsername = Settings.Default.Username; private String dbPassword = Settings.Default.Password; public OracleProvider() { connect(); } public void connect() { db = new OdbcConnection("Driver={Microsoft ODBC for Oracle};Server=CTIR; UID="+dbUsername+";PWD="+dbPassword+";"); } } }

Ahora me sale el siguiente error:

Error 11: El modificador de accesibilidad del acceso ''Framework.OracleProvider.db.set'' debe ser más restrictivo que la propiedad o el indexador ''Framework.OracleProvider.db''

He estado buscando preguntas similares pero realmente no he encontrado una respuesta.

¿Alguien puede explicarme por qué esto está sucediendo? Tengo muchas ganas de aprender.


Este es el problema:

private OdbcConnection db { get; private set; }

Suponiendo que realmente quieres que tanto el captador como el establecedor sean privados, esto debería ser:

private OdbcConnection db { get; set; }

El colocador ya es private , ya que esa es la accesibilidad de la propiedad en general.

Alternativamente, si desea que el getter no sea privado y el setter sea privado, necesita especificar algún otro modificador, por ejemplo

internal OdbcConnection db { get; set; }

Básicamente, si vas a especificar un modificador de acceso en la get; o set; parte de una propiedad, tiene que ser más restrictiva de lo que sería de otra manera.

De la sección 10.7.2 de la especificación de C #:

El modificador de acceso debe declarar una accesibilidad que es estrictamente más restrictiva que la accesibilidad declarada de la propiedad o el propio indexador. Para ser preciso:

  • Si la propiedad o el indexador tiene una accesibilidad public declarada, el modificador de acceso puede ser protected internal , internal , protected o private .
  • Si la propiedad o el indexador tiene una accesibilidad declarada de protected internal , el modificador de acceso puede ser internal , protected o private .
  • Si la propiedad o el indexador tiene una accesibilidad declarada de internal o protected , el modificador de acceso debe ser private .
  • Si la propiedad o el indexador tiene una accesibilidad declarada de private , no se puede utilizar un modificador de acceso.

(Además, si es privado tanto para leer como para escribir, probablemente sería mejor solo usar un campo. La mayoría de los beneficios de usar una propiedad solo están presentes si se expone más allá de la clase actual. Y si la conservas como propiedad, considere cambiarle el nombre para seguir las convenciones de nomenclatura normales de .NET.)