Interfaces con estructuras, por referencia usando genéricos
-
19-09-2019 - |
Pregunta
¡Lo siento chicos!¡Estoy tan metido en el código!que olvidé poner los errores del compilador.
¡Aquí hay una nueva versión del código simplificada!
Y estos son los errores:
Error 1 La mejor coincidencia de método sobrecargado para 'IWeird.DataBase.ModifyData(ref IWeird.IDataTable)' tiene algunos argumentos no válidos
Error 2 Argumento '1':no se puede convertir de 'ref IWeird.Periods' a 'ref IWeird.IDataTable'
El problema:No puedo pasar por referencia una interfaz con una estructura, ¿qué estoy haciendo mal?
Aquí está el nuevo código de ejemplo:
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();
}
}
Solución
El problema está en llamada al método DB.ModifyData<Period>(Data);
. Su campo de Data
es una estructura, estructuras se pasan a cualquier método por valor que significa que cada vez que se llama a un método Copiar de la estructura se crea y se pasa al método . Así que en realidad el método de ModifyData
está modificando una copia de la estructura Periods
que se tira justo después de la llamada al método.
Otros consejos
En el código no está de paso de una interfaz con una estructura en él, está de paso una estructura que implementa una interfaz. Esas son dos cosas completamente diferentes. En cuanto a la solución de su problema, no veo una razón para estar utilizando una estructura en absoluto, así que me gustaría modificar los períodos de ser una clase.
Las estructuras son los tipos de valor, no tipos de referencia. Si quieres pasarlo por referencia, vas a tener que utilizar la palabra clave ref
. Tenga en cuenta sin embargo que todavía es un tipo de valor, y asignarlo a otra variable va a crear una nueva estructura.