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
. InformationsquelleAutor der Frage Jakob Gade | 2009-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. In C#, Sie nicht geben Sie alle Modifikatoren (wie 'aus' oder
ref
) andere alsthis
für den ersten parameter einer extension-Methode - Sie können für die anderen. Kennt Sie nicht, die VB-Syntax, aber es scheint zu sein, mit einem deklarativen Ansatz zu markieren eine extension-Methode.Wenn Sie Sie nennen, Sie nicht geben Sie die erste
this
parameter. Daher kennzeichnet den parameter als out-oder ref nicht sinnvoll, da Sie nicht geben Sie den Modifizierer, wenn Sie nennen Sie es wie Sie tun würde, für den normalen MethodenIch denke, die Mühe, du bist hier in Bezug auf Wert-Arten unveränderlich sind. Wenn Wochentags wurde ein Referenz-Typ, es würde funktionieren gut. Für unveränderliche Typen (structs), der de facto Weg ist, um wieder eine neue Instanz mit den gewünschten Wert ein. E. g. Finden Sie die Add-Methode auf die Struktur DateTime, es gibt einen neuen DateTime-Instanz, deren Wert = Empfänger DateTime-Instanz den Wert + param Wert.
InformationsquelleAutor der Antwort Gishu
Huch - du machst eine veränderliche unveränderlich struct. Es bricht, was die Menschen erwarten, um zu sehen, in C#, aber wenn Sie müssen, dann können Sie immer direkt die Methode aufrufen:
Jede Erweiterung Methode wird direkt aufrufbar.
Außerdem eine Klarstellung:
InformationsquelleAutor der Antwort Sam Harwell
Seltsam, dass VB.NET dies ermöglicht, und C# nicht...
Jedoch, obwohl es sinnvoll ist, aus technischer Sicht (da eine Erweiterung die Methode ist eine statische Methode) finde ich es nicht richtig fühlen, weil die Erweiterung Methoden verwendet werden, als ob Sie waren beispielsweise Methoden und Instanz-Methoden nicht ändern können
this
Referenz.InformationsquelleAutor der Antwort Thomas Levesque