2010-03-13 72 views
2

对不起!我深入代码!我忘了把编译器错误。与结构体的接口,通过引用使用泛型

这是新版本的代码简化!

这是错误的:

错误1为最佳重载方法匹配“IWeird.DataBase.ModifyData(REF IWeird.IDataTable)”有一些无效参数
错误2参数“1”:不能转换从“裁判IWeird.Periods”到“裁判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(); 
     } 
    } 
+1

你得到什么错误?编译器错误(如果是的话)?异常(如果是这样)?没有按预期工作(如果是的话,它在做什么)? – itowlson 2010-03-13 03:02:07

+0

这段代码在2010RC编译得很好。你有什么错误,在什么方面? – JaredPar 2010-03-13 03:04:59

+2

结构被称为“值类型”,因为它们是按值传递的,而不是通过引用。如果你想通过引用传递一些东西,传递一个引用类型。无论如何,可变结构是非常非常糟糕的编程实践;理想情况下,你最好不要在结构体上放置setter。 – 2010-03-13 03:17:36

回答

1

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

1

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

2

在你的代码中,你没有传递一个带有结构体的接口,而是传递了一个实现接口的结构体。那是两件完全不同的事情。至于解决你的问题,我没有看到有任何理由使用结构,所以我会改变周期为一个类。