属性或索引器不能分配给“ - ”它是只读的

时间:2016-06-27 12:20:28

标签: c# string readonly

所以我试图将一个本地字符串传递给c#项目中的另一个表单。这是我的代码:

表格1:

...
Main frm = new Main();
frm.Passvalue = usrTxt.Text;
frm.ShowDialog();

表格2

...
public string Username;
public string Passvalue
{
    get { return Username; }
}

我收到了错误:

  

属性或索引器“Main.Passvalue”无法分配给“ - ”它是只读的

我从来没有宣称任何事情为ReadOnly,有谁知道这里的问题是什么?

6 个答案:

答案 0 :(得分:10)

它没有setter,这使它成为readonly属性,将其更改为:

public string Passvalue
{
    get { return Username; }
    set { Username = value; }
}

顺便说一句,这似乎有点多余,因为你无论如何公开曝光Username。将类字段设为私有通常被认为是一种好习惯。

答案 1 :(得分:3)

如果您希望设置您的属性,则必须添加 set 处理程序:

public string Passvalue
{
    get { return Username; }
    set { Username = value; }
}

虽然立即使用自动实现的属性会更容易:

public string Username
{
    get;
    set;
}

答案 2 :(得分:2)

你的财产错过了二传手。将其更改为:

public string Passvalue
{
    get { return Username; }
    set { Username = value; }
}

答案 3 :(得分:2)

问题是您只有Form2.Passvalue getter ,但没有 setter 。在Form2中添加:

public string Passvalue
{
    get { return Username; }
    set { Username = value; } // add this setter
}

答案 4 :(得分:1)

物业没有设定者。

以下是可用于自动实现的getter和setter的代码。

public string Username { get; set; } 
public string Passvalue { get; set; } 

或者,如果您想从Passvalue获取和设置UserName的值,您可以使用

public string Username { get; set; }
public string Passvalue
{
    get { return Username; }
    set { Username = value; }
}

答案 5 :(得分:0)

正如许多其他人所说,您需要允许为属性 Username 设置一个值。这可以通过多种方式完成:

可能是最简单的 - 只需添加一个 get;

public string Username { get; set; }

您可以使用扩展版本,如此处的其他答案所示,但我认为只有在您想向其中添加某种逻辑时才有意义(从 C# 7.0 开始允许):

private string passValue; 
public string Passvalue
{
    get { return Username; }
    set { this.passValue = value ?? "MysteriousStranger"; }
}

C# 9 中的新功能:仅初始化设置器

您可能不想允许在创建后更改属性。为此,C# 9 添加了 init only setter。这些将允许您仅在实例化对象时设置值。在您的情况下,它应该允许您执行以下操作:

// Declare the prop using INIT instead of SET:
public string Username { get; init; }

// Now you can set the value of the property as you initiate 
// the frm object. 
Main frm = new Main(){ Passvalue = usrTxt.Text; };

// Trying to change the value later would cause a compile time error:
// frm.Passvalue = "whatever";     

frm.ShowDialog();