属性或索引器不能分配给"——"它是只读的

本文关键字:quot 只读 索引 不能 分配 不能分 属性 | 更新日期: 2023-09-27 17:51:17

所以我试图将本地字符串传递到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,有人知道这里的问题是什么吗?

属性或索引器不能分配给"——"它是只读的

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

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

顺便说一下,这似乎有点多余,因为您无论如何都要公开暴露Username。将类字段设为私有通常被认为是一种好做法。

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

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

直接使用自动实现的属性会更容易:

public string Username
{
    get;
    set;
}

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

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

属性没有setter

这是你可以用来自动实现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; }
}

您的属性缺少setter。改为:

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

正如许多人所说,您需要允许为属性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新增功能:Init Only setter

您可能不希望允许在创建后更改属性。为此,c# 9只添加了init 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();