属性或索引器不能分配给"——"它是只读的
本文关键字: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();