Интерфейсы со структурами, по ссылке с использованием Generics - PullRequest
2 голосов
/ 13 марта 2010

Простите, ребята! я так в коде! что я забыл поставить ошибки компилятора.

Вот новая версия упрощенного кода!

И это ошибки:

Ошибка 1 Наилучшее совпадение перегруженного метода для 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' имеет несколько неверных аргументов
Ошибка 2 Аргумент '1': невозможно преобразовать из 'ref IWeird.Periods' в 'ref IWeird.IDataTable'

Проблема: Я не могу передать по ссылке интерфейс со структурой в нем, что я делаю не так?

Вот новый пример кода:

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();
        }
    }

Ответы [ 3 ]

2 голосов
/ 13 марта 2010

В вашем коде вы не передаете интерфейс со структурой в нем, вы передаете структуру, которая реализует интерфейс. Это две совершенно разные вещи. Что касается решения вашей проблемы, я не вижу причины использовать структуру вообще, поэтому я бы изменил Periods на класс.

1 голос
/ 13 марта 2010

Проблема в DB.ModifyData<Period>(Data); вызове метода. Ваше Data поле является структурой, структуры передаются любым методам по значению , что означает, что каждый раз, когда вы вызываете метод копия структуры создается и передается методу , Так что на самом деле ваш метод ModifyData изменяет копию структуры Periods, которая выбрасывается сразу после вызова метода.

1 голос
/ 13 марта 2010

Структуры являются типами значений, а не ссылочными типами. Если вы хотите передать его по ссылке, вам придется использовать ключевое слово ref. Имейте в виду, что это все еще тип значения, и присвоение его другой переменной создаст новую структуру.

...