所以我试图将一个本地字符串传递给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
,有谁知道这里的问题是什么?
答案 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 添加了 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();