Können C # Extension-Methoden Parameter nicht als Referenz übergeben?

Ist es wirklich unmöglich zu schaffen, eine Erweiterung Methode in C#, in dem die Instanz übergeben wird, die als Referenz?

Hier ist ein Beispiel VB.NET console app:

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

Hinweis der Wert der parameter ByRef übergeben wird.

Und (fast) das gleiche in 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;
    }
  }
}

Den Add extension-Methode funktioniert nicht in C#, weil ich nicht verwenden können, die ref Schlüsselwort. Gibt es Abhilfe für dieses?

Kommentar zu dem Problem
Nur zur Vervollständigung halber: der richtige Weg, um "Hinzufügen" einen Wert von " flag-enum ist Wert = Wert Oder Arg1, wenn Sie möchten, dass das hinzufügen von Montag zwei mal verhält sich wie das hinzufügen von Dienstag. Der richtige Weg, um ein flag zu entfernen ist Wert = (Wert-Oder Arg1) Xor Arg1. Kommentarautor: LWChris

InformationsquelleAutor der Frage Jakob Gade | 2009-08-11

Schreibe einen Kommentar