Domanda

Scusate ragazzi! Sono così nel codice! che ho dimenticato di mettere gli errori del compilatore.

Ecco una nuova versione del codice semplificato!

E questo sono gli errori:

di errore 1 Il metodo match migliore overload per 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' ha alcuni argomenti non validi
Errore 2 Argomento '1': impossibile convertire da 'IWeird.Periods ref' a 'IWeird.IDataTable ref'

Il problema: Non posso passare per riferimento un'interfaccia con una struttura in esso, quello che sto facendo di sbagliato?

Ecco il nuovo codice di esempio:

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();
        }
    }
È stato utile?

Soluzione

Il problema è nel metodo DB.ModifyData<Period>(Data); chiamata. Il vostro campo Data è una struttura, le strutture vengono passati tutti i metodi di valore che significa che ogni volta che si chiama un metodo di copia della struct è stato creato ed è passato al metodo . Quindi in realtà il metodo ModifyData sta modificando una copia della struttura Periods che viene gettato via subito dopo la chiamata al metodo.

Altri suggerimenti

Nel codice non sta passando un'interfaccia con una struct in esso, si passa una struttura che implementa un'interfaccia. Queste sono due cose completamente diverse. Per quanto riguarda il risolvere il tuo problema, non vedo un motivo per essere utilizzando una struttura a tutti, quindi mi piacerebbe cambiare periodi da una classe.

Structs sono i tipi di valore, non tipi di riferimento. Se si desidera passare per riferimento, si sta andando ad avere per utilizzare la parola chiave ref. Occorre tuttavia tenere presente che è ancora un tipo di valore, e l'assegnazione ad un'altra variabile sta andando a creare una nuova struct.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top