C#-fout: “Er is een objectverwijzing vereist voor het niet-statische veld, de methode of de eigenschap”

Ik heb twee klassen, een voor het definiëren van de algoritmeparameters en een andere om het algoritme te implementeren:

Klasse 1 (algoritmeparameters):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VM_Placement
{
    public static class AlgorithmParameters
    {
        public static int pop_size = 100;
        public static double crossover_rate = 0.7;
        public static double mutation_rate = 0.001;
        public static int chromo_length = 300;
        public static int gene_length = 4;
        public static int max_allowable_generations = 400;
        static Random rand = new Random();
        public static double random_num = rand.NextDouble();
    }
}

Klasse 2 (implementeer algoritme):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VM_Placement
{
    public class Program
    {
        public struct chromo_typ
        {
            public string   bits;
            public float    fitness;
            //public chromo_typ(){
            // bits = "";
            // fitness = 0.0f;
            //}
            chromo_typ(string bts, float ftns)
            {
                bits = bts;
                fitness = ftns;
            }
        };
        public static int GetRandomSeed()
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider rng =
              new System.Security.Cryptography.RNGCryptoServiceProvider();
            rng.GetBytes(bytes);
            return BitConverter.ToInt32(bytes, 0);
        }
        public string GetRandomBits()
        {
            string bits="";
            for (int i = 0; i < VM_Placement.AlgorithmParameters.chromo_length; i++)
            {
                if (VM_Placement.AlgorithmParameters.random_num > 0.5f)
                    bits += "1";
                else
                    bits += "0";
            }
            return bits;
        }
        public static void Main(string[] args)
        {
            Random rnd = new Random(GetRandomSeed());
            while (true)
            {
                chromo_typ[] Population = new chromo_typ[VM_Placement.AlgorithmParameters.pop_size];
                double Target;
                Console.WriteLine("\n Input a target number");
                Target = Convert.ToDouble(Console.ReadLine());
                for (int i = 0; i < VM_Placement.AlgorithmParameters.pop_size; i++)
                {
                    Population[i].bits = GetRandomBits();
                    Population[i].fitness = 0.0f;
                }
            }
        }
    }
}

Ik krijg een foutmelding op Population[i].bits = GetRandomBits();in Main().

Fout is:

Er is een objectverwijzing vereist voor het niet-statische veld, de methode of de eigenschap ‘VM_Placement.Program.GetRandomBits()’

Mis ik iets?


Antwoord 1, autoriteit 100%

De Mainmethode is Statisch. Je kunt een niet-statische methode niet aanroepen vanuit een statische methode.

GetRandomBits()

is geen statische methode. Ofwel moet u een instantie van Program

. maken

Program p = new Program();
p.GetRandomBits();

of maak

GetRandomBits()statisch.


Antwoord 2, autoriteit 12%

Het lijkt erop dat je wilt:

public static string GetRandomBits()

Zonder staticzou je een object nodig hebben voordat je de methode GetRandomBits()kunt aanroepen. Omdat de implementatie van GetRandomBits()echter niet afhankelijk is van de status van een Program-object, is het het beste om het staticte declareren.


Antwoord 3, autoriteit 2%

De Main-methode is statisch binnen de klasse Program. Je kunt een instantiemethode niet vanuit een statische methode aanroepen, daarom krijg je de foutmelding.

Om het op te lossen, hoeft u alleen uw GetRandomBits()-methode ook statisch te maken.

Other episodes