我的所有属性都有{get;set;}方法,但我一直得到一个错误"";需要一个get或set访问器&q
本文关键字:quot 一个 set get 访问 错误 属性 方法 我的 一直 | 更新日期: 2023-09-27 18:02:28
如果这看起来很愚蠢,很抱歉,但我已经查看了有关此问题的其他问题,但找不到任何内容。我正在从Java过渡到C#,所以我可能错过了一些与属性有关的内容,而这些内容我本可以使用Java中的方法来完成。
在Monodedevelop,我不断得到
需要获取或设置访问器
作为我编译时的错误。
这是我的密码。
程序.cs:
class MainClass
{
public static void Main (string[] args)
{
Transaction myTransaction = new Transaction ();
string[] data = Console.ReadLine ().Split(',');
while (data[0] != "#") {
myTransaction.Name = data [0];
Double.TryParse (data [1], out myTransaction.Cost);
Int32.TryParse (data [2], out myTransaction.Quantity);
Console.WriteLine (Transaction);
data = Console.ReadLine ().Split(',');
}
}
}
}
交易类别:
using System;
public class Transaction
{
//private vars//
//string name;
//double cost;
//int quantity;
//Constructor//
public Transaction ()
{
}
//Properties//
public string Name{ get; set;}
public double Cost{ get; set;}
public int Quantity{ get; set;}
//methods//
public double CalcTotal(){
return Quantity * Cost;
}
public override String ToString{
return String.format("{0:0.00} x {1:0.00} @ ${2:0.00} Total: ${3:0.00}", Name, Quantity, Cost, CalcTotal());
}
}
}
问题出在ToString方法中,您忘记了()
public override string ToString () {
return string.Format("{0:0.00} x {1:0.00} @ ${2:0.00} Total: ${3:0.00}", Name, Quantity, Cost, CalcTotal());
}
此外,你还有几个问题:
Console.WriteLine(Transaction);
应该是
Console.WriteLine(myTransaction);
并且属性不能是ref
和out
参数
参见工作小提琴
您遇到的问题(我认为(是解析语句。不能将out
或ref
作为类的属性或索引器传递。
Transaction myTransaction = new Transaction();
string[] data = Console.ReadLine().Split(',');
while (data[0] != "#")
{
myTransaction.Name = data[0];
Double.TryParse(data[1], out myTransaction.Cost); //<-- this is the issue
Int32.TryParse(data[2], out myTransaction.Quantity); //<-- here again
Console.WriteLine(myTransaction);
data = Console.ReadLine().Split(',');
}
您需要做的是将值保存在一个单独的变量中,然后将其作为.分配给Transaction
对象
Transaction myTransaction = new Transaction();
string[] data = Console.ReadLine().Split(',');
while (data[0] != "#")
{
myTransaction.Name = data[0];
double dCost;
int dQty;
Double.TryParse(data[1], out dCost); //<-- this is hte issue
Int32.TryParse(data[2], out dQty); //<-- here again
myTransaction.Cost = dCost;
myTransaction.Quantity = dQty;
Console.WriteLine(myTransaction);
data = Console.ReadLine().Split(',');
}
如您所见,我们在循环dCost
&dQty
在循环期间,值被解析为局部变量,然后这些变量被设置为事务myTransaction
的实例。
此外,代码还有另外两个小问题。
- 重写
ToString
应该是一种与ToString()
相同的方法 - 方法
string.format(..)
实际上是string.Format()
最后,正如其他人所指出的,Console.WriteLine(Transaction);
应该是Console.WriteLine(myTransaction);
您的代码有几个问题:
- 你的
ToString
方法缺少括号,里面的return
语句很可能就是你在问题中提到的错误 String.Format
是用小写的f
、String.format
编写的,它不会编译- 不能使用
ref
或out
参数和目标属性,必须以变量为目标,如局部变量或字段 Console.WriteLine(Transaction)
无法写入类,它必须写入object。因此您可能希望使用Console.WriteLine(myTransaction);
在代码中,将类的属性作为ref
和out
传递。你不能这样做,因为C#不知道属性后面是否有后端字段。为什么???你可以简单地拥有像这样的属性
public double Cost
{
get { return 4.5; }
set { /* empty */ }
}
在这里,CLR
将如何处理您的out
和ref
参数?它不能为属性设置任何值。
Double.TryParse (data [1], out myTransaction.Cost);
Int32.TryParse (data [2], out myTransaction.Quantity);
这里你需要
Console.WriteLine (myTransaction);
不是
Console.WriteLine (Transaction);
和ToString(
(必须是
public override string ToString(){
return String.format("{0:0.00} x {1:0.00} @ ${2:0.00} Total: ${3:0.00}", Name, Quantity, Cost, CalcTotal());
}