2

对不起大家!我太喜欢代码了!我忘了把编译器错误。

这是新版本的代码简化!

这是错误:

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

3 回答 3

2

在您的代码中,您不是在传递一个带有结构的接口,而是在传递一个实现接口的结构。这是两个完全不同的东西。至于解决您的问题,我根本没有理由使用结构,所以我将 Periods 更改为一个类。

于 2010-03-13T05:35:38.043 回答
1

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

于 2010-03-13T03:04:42.937 回答
1

问题在于DB.ModifyData<Period>(Data);方法调用。您的Data字段是一个结构,结构通过传递给任何方法,这意味着每次调用该结构的方法时都会创建该结构的副本并将其传递给该方法。因此,实际上您的方法正在修改在方法调用之后被丢弃ModifyData的结构的副本。Periods

于 2010-03-13T10:09:03.450 回答