Ne prend pas en C# les Méthodes d'Extension permettent de passer des paramètres par référence?

Est-il vraiment impossible de créer une méthode d'extension en C#, où l'instance est passé comme une référence?

Voici un échantillon VB.NET application console:

Imports System.Runtime.CompilerServices

Module Module1
  Sub Main()
    Dim workDays As Weekdays

    workDays.Add(Weekdays.Monday)
    workDays.Add(Weekdays.Tuesday)

    Console.WriteLine("Tuesday is a workday: {0}", _ 
      CBool(workDays And Weekdays.Tuesday))
    Console.ReadKey()
  End Sub
End Module

<Flags()> _
Public Enum Weekdays
  Monday = 1
  Tuesday = 2
  Wednesday = 4
  Thursday = 8
  Friday = 16
  Saturday = 32
  Sunday = 64
End Enum

Module Ext
  <Extension()> _
  Public Sub Add(ByRef Value As Weekdays, ByVal Arg1 As Weekdays) 
    Value = Value + Arg1
  End Sub
End Module

Notez la Valeur du paramètre est passé ByRef.

Et (presque) la même chose en C#:

using System;

namespace CS.Temp
{
  class Program
  {
    public static void Main()
    {
      Weekdays workDays = 0;

      workDays.Add(Weekdays.Monday); //This won't work
      workDays.Add(Weekdays.Tuesday);

      //You have to use this syntax instead...
      //workDays = workDays | Weekdays.Monday;
      //workDays = workDays | Weekdays.Tuesday;

      Console.WriteLine("Tuesday is a workday: {0}", _ 
        System.Convert.ToBoolean(workDays & Weekdays.Tuesday));
      Console.ReadKey();
    }
  }

  [Flags()]
  public enum Weekdays : int
  {
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
  }

  public static class Ext
  {
    //Value cannot be passed by reference? 
    public static void Add(this Weekdays Value, Weekdays Arg1) 
    {
      Value = Value | Arg1;
    }
  }
}

La Add méthode d'extension ne fonctionne pas en C# parce que je ne peux pas utiliser le ref mot-clé. Est-il une solution pour cela?

  • Juste pour l'achèvement du souci: la bonne façon de "Ajouter" une valeur d'un indicateur enum est Value = Value Or Arg1 sauf si vous voulez que l'ajout de Monday deux fois se comporte comme l'ajout de Tuesday. La bonne façon de retirer un drapeau est Value = (Value Or Arg1) Xor Arg1.
InformationsquelleAutor Jakob Gade | 2009-08-11