与结构的接口,通过引用使用泛型

时间:2010-03-13 02:57:39

标签: c# generics struct pass-by-reference pass-by-value

对不起伙计们!我很喜欢这个代码!我忘了把编译错误。

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

这就是错误:

错误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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

问题出在DB.ModifyData<Period>(Data);方法调用中。您的Data字段是一个结构,结构会传递给任何方法按值,这意味着每次调用方法复制时都会创建结构传递给方法。实际上,您的ModifyData方法正在修改在方法调用之后丢弃的Periods结构的副本。