Interfacce con le strutture, di riferimento utilizzando Generics
-
19-09-2019 - |
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();
}
}
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.