Question

Désolé les gars! je suis dans le code! que j'ai oublié de mettre les erreurs du compilateur.

Voici une nouvelle version du code simplifié!

Et ce sont les erreurs:

Erreur 1 Le match de la meilleure méthode surchargée pour 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' a des arguments invalides
Erreur 2 Argument '1': ne peut pas convertir 'ref IWeird.Periods' pour 'ref IWeird.IDataTable'

Le problème: Je ne peux pas passer par référence une interface avec un struct en elle, ce que je fais mal?

Voici le nouveau code exemple:

class PeriodsProcessor
    {
        public PeriodsProcessor()
        {
            Periods Data = new Periods();
            DataBase DB = new DataBase();

            Console.WriteLine(Data.Value);
            DB.ModifyData(ref Data);
            Console.WriteLine(Data.Value);

            Console.ReadLine();
        }
    }


    public interface IDataTable
    {
        string Value { get; set; }
    }

    public struct Periods : IDataTable
    {
        public string Value { get; set; }
    }

    public class DataBase
    {
        public void ModifyData(ref IDataTable data) 
        {
            data.Value = "CHANGE";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PeriodsProcessor PeriodsProcessor = new PeriodsProcessor();
        }
    }
Était-ce utile?

La solution

Le problème est en appel de la méthode DB.ModifyData<Period>(Data);. Votre champ Data est un struct, struct sont transmises à des méthodes par la valeur ce qui signifie que chaque fois que vous appelez une méthode Copier de la struct est créé et est passé à la méthode . Donc en fait votre méthode de ModifyData modifie une copie de la structure de Periods qui est jeté juste après l'appel de méthode.

Autres conseils

Dans votre code, vous n'êtes pas de passage d'une interface avec un struct en elle, vous passez une struct qui implémente une interface. Ce sont deux choses différentes. En ce qui concerne la résolution de votre problème, je ne vois pas de raison d'utiliser un struct du tout, donc je change des périodes à une classe.

Structs sont les types de valeur, non types de référence. Si vous voulez passer par référence, vous allez devoir utiliser le mot-clé ref. Gardez à l'esprit qu'il est toujours un type de valeur, et l'affectation à une autre variable va créer une nouvelle struct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top