2011-07-27 12 views
14

compilador de C# me dio el siguiente errorvalor de asignación de variable de sólo lectura en el método privado llamado solamente por los constructores

CS0191: Un campo de sólo lectura no se puede asignar a (excepto en un constructor o un inicializador de variable)

Do Tengo que mover el código (en mi función privada) al constructor? Eso suena incomodo.

Tenga en cuenta que el método privado solo fue creado por el constructor. Espero que haya algún tipo de atributo que pueda usar para marcar el método correspondiente.

Respuesta

4

Sí. ¿Has probado el encadenamiento de constructores como alternativa al uso de un método común?

public StuffClass(string a, char b, int c) 
{ 
    _a = a; 
    _b = b; 
    _c = c; 
} 

public StuffClass(string a, char b) 
    : this(a, b, 2) 
{} 
+0

El método privado fue la única finalidad de ser llamado por el constructor. Espero que haya algún tipo de atributo que pueda usar para marcar el método correspondiente. – tom

+0

@tom - No entiendo lo que quiere decir con respecto al atributo, pero el encadenamiento de constructores es una manera idiomática de C# de hacer lo que está describiendo. –

0

Si desea modificarlo, no debe hacerlo solo en primer lugar. Una vez que se lee una variable sólo puede modificar sólo en el constructor o al momento de la declaración como sugiere el error

De acuerdo con MSDN

readonly La palabra clave es un modificador que se puede utilizar en los campos. Cuando una declaración de campo incluye un modificador readonly, las asignaciones a los campos introducidos por la declaración solo pueden ocurrir como parte de la declaración o en un constructor en la misma clase.

1

Los miembros readonly solo se pueden asignar en el nivel de clase o en su constructor. ese es el beneficio de usar la palabra clave readonly.

class Foo 
{ 
    private readonly Foo _foo = new Foo(); // Valid 

    public Foo() 
    { 
     _foo = new Foo(); // Valid 
    } 

    private void SomeMethod() 
    { 
     _foo = new Foo(); // Not valid 
    } 
} 

Puede utilizar readonly como alternativa a la palabra clave const al utilizar clases "otra que la clase string", debido a que el compilador no permitirá asignar un const a unas clases.

4

El campo de solo lectura solo puede ser asignado por el constructor. Lo que puede hacer es inicializar el campo con un método:

class Foo 
{ 
    private readonly Bar _bar = InitializeBar(); 

    private Bar InitializeBar() 
    { 
     // Add whatever logic you need to obtain a Foo instance. 
     return new Bar(); 
    } 
} 
20

pesar de lo que los demás puestos están diciendo, no es en realidad una forma (algo inusual) para hacer esto y en realidad asignar el valor en un método :

public class Foo 
{ 
    private readonly string _field; 

    public Foo(string field) 
    { 
     Init(out _field, field); 
    } 

    private static void Init(out string assignTo, string value) 
    { 
     assignTo = value; 
    } 
} 

Ejemplo derivado de here.

Alternativamente, también puede devolver el valor de un método privado y asignarlo en el constructor de la siguiente manera:

class Foo 
{ 
    private readonly string _field; 

    public Foo() 
    { 
     _field = GetField(); 
    } 

    private string GetField() 
    { 
     return "MyFieldInitialization"; 
    } 
} 
Cuestiones relacionadas