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();
        }
    }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top