Pergunta

Sorry guys! eu sou assim no código! que eu esqueci de colocar os erros do compilador.

Aqui está uma nova versão do código simplificado!

E isto são os erros:

Erro 1 O melhor correspondência método sobrecarregado para 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' tem alguns argumentos inválidos
Erro 2 Argumento '1': não podem converter de 'ref IWeird.Periods' para 'ref IWeird.IDataTable'

O problema: Eu não posso passar por referência uma interface com um struct nele, o que estou fazendo de errado?

Aqui está o novo código de exemplo:

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

Solução

O problema está na chamada de método DB.ModifyData<Period>(Data);. Seu campo Data é um struct, estruturas são passados ??para quaisquer métodos por valor o que significa que cada vez que você chamar um método cópia da estrutura é criada e é passado para o método . Então, na verdade seu método ModifyData está modificando uma cópia da estrutura Periods que é jogado fora logo após a chamada de método.

Outras dicas

Em seu código você não está passando uma interface com um struct nele, você está passando uma estrutura que implementa uma interface. Essas são duas coisas completamente diferentes. Como para resolver o seu problema, não vejo uma razão para estar usando uma estrutura em tudo, então eu mudaria períodos a uma classe.

Structs são tipos de valor, não tipos de referência. Se você quiser passá-lo por referência, você vai ter que usar a palavra-chave ref. Tenha em mente que ainda é um tipo de valor, e atribuí-la a uma outra variável que vai criar uma nova estrutura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top