对不起你们!我很入代码!我忘记把编译错误。

下面是简化的代码的一个新版本!

和这是错误:

错误1的最好重载方法匹配“IWeird.DataBase.ModifyData(参照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();
        }
    }
有帮助吗?

解决方案

问题是在DB.ModifyData<Period>(Data);方法调用。您的Data字段是一个结构,结构将被传递到的任何方法按值这意味着每个一次调用该结构的复制的方法创建,并传递给方法。所以实际上你ModifyData方法修改只是在方法调用后扔掉Periods结构的副本。

其他提示

在你的代码是不及格的接口,在它的结构体,要传递一个实现了接口结构。这是两个完全不同的事情。作为解决你的问题,我没有看到一个原因是使用在所有的结构体,所以我会改变周期内为一类。

的Structs 是值类型,而不是引用类型。如果你想通过引用传递它,你将不得不使用ref关键字。但请记住,它仍然是一个值类型,并将其分配给另一个变量是要创建一个新的结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top