我的所有属性都有{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()); 

    }
}
}

我的所有属性都有{get;set;}方法,但我一直得到一个错误"";需要一个get或set访问器&q

问题出在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);

并且属性不能是refout参数

参见工作小提琴

您遇到的问题(我认为(是解析语句。不能将outref作为类的属性或索引器传递。

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的实例。

此外,代码还有另外两个小问题。

  1. 重写ToString应该是一种与ToString()相同的方法
  2. 方法string.format(..)实际上是string.Format()

最后,正如其他人所指出的,Console.WriteLine(Transaction);应该是Console.WriteLine(myTransaction);

您的代码有几个问题:

  1. 你的ToString方法缺少括号,里面的return语句很可能就是你在问题中提到的错误
  2. String.Format是用小写的fString.format编写的,它不会编译
  3. 不能使用refout参数和目标属性,必须以变量为目标,如局部变量或字段
  4. Console.WriteLine(Transaction)无法写入,它必须写入object。因此您可能希望使用Console.WriteLine(myTransaction);

在代码中,将类的属性作为refout传递。你不能这样做,因为C#不知道属性后面是否有后端字段。为什么???你可以简单地拥有像这样的属性

public double Cost
{ 
   get { return 4.5; } 
   set { /* empty */ }
}

在这里,CLR将如何处理您的outref参数?它不能为属性设置任何值。

 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());     
}