2010-03-13 19 views
2

Désolé les gars! Je suis tellement dans le code! que j'ai oublié de mettre les erreurs du compilateur.Interfaces avec les structures, par référence en utilisant Generics

Voici une nouvelle version du code simplifiée!

Et ce sont les erreurs:

erreur 1 Le match de la meilleure méthode surchargée pour 'IWeird.DataBase.ModifyData (ref IWeird.IDataTable)' a quelques arguments invalides
d'erreur 2 Argument '1': ne peut pas convertir de « ref IWeird.Periods » à « ref IWeird.IDataTable »

Le problème: Je ne peux pas passer par référence une interface avec un struct en elle, ce que je fais mal?

Voici le nouveau code exemple:

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

Quelle erreur obtenez-vous? Erreur de compilateur (si oui, quoi)? Exception (si oui, quoi)? Ne fonctionne pas comme prévu (si oui, que fait-il)? – itowlson

+0

Ce code compile très bien en 2010RC. Quelle erreur obtenez-vous et sur quelle ligne? – JaredPar

+2

Les structures sont appelées "types de valeurs" car elles sont transmises par valeur, et non par référence. Si vous voulez que quelque chose soit passé par référence, passez un type de référence. Les structures mutables sont une très, très mauvaise pratique de programmation de toute façon; vous devriez idéalement ne jamais avoir un setter sur une structure. –

Répondre

1

Le problème est dans l'appel de méthode DB.ModifyData<Period>(Data);. Votre champ Data est une structure, les structures sont passées à toutes les méthodes par la valeur, ce qui signifie que chaque fois que vous appelez une méthode , la copie de la structure est créée et transmise à la méthode. Donc en fait, votre méthode ModifyData modifie une copie de la structure Periods qui est jetée juste après l'appel de la méthode.

1

Structs sont les types de valeurs, pas les types de référence. Si vous voulez le passer par référence, vous devrez utiliser le mot-clé ref. Gardez à l'esprit que c'est toujours un type de valeur, et l'assigner à une autre variable va créer une nouvelle structure.

2

Dans votre code, vous ne passez pas une interface avec une struct, vous passez une structure qui implémente une interface. Ce sont deux choses complètement différentes. En ce qui concerne la résolution de votre problème, je ne vois pas de raison d'utiliser une structure du tout, donc je changerais les Périodes pour qu'elles soient une classe.