无法分配给“”,因为它是“方法组”初学者

时间:2018-09-12 15:51:35

标签: c# getter-setter

我正在练习setter和getter,收到此错误消息:

  

由于它是“方法组”,因此无法分配给“ GetnewName”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{

    public class Program
    {
        public static void Main(string[] args)
        {
            Bird b = new Bird();
            b.GetnewName = "Tweety";
            b.Chirp();

            Bird b2 = new Bird();
            b2.GetnewName = "Woody";
            b2.Chirp();
        }
    }
    public class Bird
    {
        private string name;
        private double weight = 30.5d;

        public void SetName(string newName)
        {
            if (newName != null && newName.Length > 2)
            {
                System.Console.WriteLine("Bird already has a name");
                this.name = newName;
            }
            else if (newName.Length < 3)
            {
                System.Console.WriteLine("New name must be longer than two chars");
            }
            else
            {
                name = newName;
            }
        }

        public string GetnewName()
        {
            return this.name;
        }

    public void Chirp()
        {
            System.Console.WriteLine(name + " says chirp!");
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您需要使用SetName方法设置名称。

CREATE TABLE [dbo].[LogFiles] (
[Id]           INT            IDENTITY (1, 1) NOT NULL,
[Path]         NVARCHAR (MAX) NULL,
[FileName]     NVARCHAR (MAX) NULL,
[Success]      BIT            NULL,
[ErrorMessgae] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.LogFiles] PRIMARY KEY CLUSTERED ([Id] ASC)
);

答案 1 :(得分:1)

您无法将字符串分配给方法,这会导致错误。 我c#我们不使用Java或C ++中的getter和setter。相反,我们使用了 properties 。您可以分配和读取值,就像它们在字段中一样,但是它们具有称为 accessors 的特殊方法。您应该像这样重构您的课程:

public class Bird
{
    private string name;
    private double weight = 30.5d;

    public string Name
    {
        get => name;
        set
        {
            if (value != null && value.Length > 2)
            {
                Console.WriteLine("Bird already has a name");
                name = value;
            }
            else if (value != null && value.Length < 3)
            {
                Console.WriteLine("New name must be longer than two chars");
            }
            else
            {
                name = value;
            }
        }
    }

    public void Chirp()
    {
        System.Console.WriteLine(name + " says chirp!");
    }
}

然后您可以将其用作:

var bird = new Bird();
// assign a value (equivalent to SetName method in your original code)
bird.Name = "Woody";
// read a value (equivalent to GetName method in your original code)
Console.WriteLine(bird.Name);

答案 2 :(得分:1)

您将GetnewName当作property使用,但您将其定义为一对方法。

属性语法以单个名称组合了getter和setter。然后,C#将路由重新分配给setter,并读取getter方法:

public string Name {
    get => name
    set {
         if (value != null && value.Length > 2) {
             System.Console.WriteLine("Bird already has a name");
             name = value;
         } else if (value.Length < 3) {
             System.Console.WriteLine("New name must be longer than two chars");
         } else {
             name = value;
         }
    }
}

注意:上面的get => name使用了新语法。相同的旧语法为get { return name; }

答案 3 :(得分:-1)

似乎您想要这样:

public string Name 
{
    get; private set;
}
public void SetName(string newName)
{
    if (newName != null && newName.Length > 2)
    {
        System.Console.WriteLine("Bird already has a name");
        Name = newName;
    }
    else if (newName.Length < 3)
    {
        System.Console.WriteLine("New name must be longer than two chars");
    }
    else
    {
        Name = newName;
    }
}

get;将自动返回属性的值,而不需要私有后备属性,通常,您可以在属性内使用设置器来设置值,但是由于需要传递参数同样,看起来好像是将setter私有化并创建一个单独的方法来实际设置它会满足您的需求。