无法分配给“ ”,因为它是 'method group' 初学者

Cannot assign to ' ' because it is a 'method group' beginner

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

Cannot assign to 'GetnewName' because it is a'method group'

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!");
        }
    }
}

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

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.SetName("Tweety");
            b.Chirp();

            Bird b2 = new Bird();
            b2.SetName("Woody");
            b2.Chirp();

            Console.ReadLine();
        }
    }
    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!");
        }
    }
}

看来你想要这个:

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; 将自动 return 您的 属性 的价值,无需私人支持 属性,通常您可以使用 setter 在 属性 中设置值,但由于您也需要传递一个参数,因此似乎将 setter 设为私有并创建一个单独的方法来实际设置它会满足您的需要。

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

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

您将 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; }