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 deMonday
deux fois se comporte comme l'ajout deTuesday
. La bonne façon de retirer un drapeau estValue = (Value Or Arg1) Xor Arg1
.
Vous devez vous connecter pour publier un commentaire.
Pas. En C#, vous ne peut pas spécifier toutes les modificateurs (comme " out " ou
ref
) autres quethis
pour le premier paramètre d'une méthode d'extension - vous pouvez le faire pour les autres. Pas familier avec la Syntaxe VB, mais il semble être à l'aide d'une approche déclarative pour marquer une méthode d'extension.Quand vous l'appelez, vous ne pas spécifier la première
this
paramètre. Donc, marquant le paramètre ou ref ne fait pas sens que Vous ne pouvez pas spécifier le modificateur quand vous l'appelez comme vous le feriez pour les méthodes normalesJe pense que les difficultés que vous rencontrez ici est lié à des types de valeur étant immuable. Si les jours de la Semaine a été un type de référence, il travaille bien. Pour immuable types (les structures), la defacto moyen est de renvoyer une nouvelle instance avec la valeur requise. E. g. Voir la méthode Add sur la structure DateTime, il retourne une nouvelle instance de DateTime dont la valeur = récepteur de type DateTime de l'occurrence de la valeur + param valeur.
this
(Me
) comme unByRef
paramètre; malheureusement, le compilateur procède ensuite à permettre la lecture des structures exclusivement à être transmis. L'une des principales plaintes concernant les types de valeur mutables, c'est que depuis il n'y a rien pour indiquer les méthodes de muterthis
, ils permettent de telles méthodes à appeler inutilement sur les instances. Je trouve bizarre que l'vb.net les réalisateurs décident de permettre une extension de la méthode qui prend unByRef
paramètre--pratiquement en hurlant "je VAIS LA MUTATION de l'ARGUMENT!"--en lecture seule de contexte.Aïe, - vous réalisez une mutable immuable struct. Il rompt ce que les gens attendent de voir en C#, mais si vous devez, ensuite, vous pouvez toujours appeler directement la méthode:
Aucune méthode d'extension est directement appelable.
Aussi, une clarification:
Étrange que VB.NET permet ce et C# n'est pas...
Cependant, bien qu'il puisse faire sens à partir d'un point de vue technique (depuis une méthode d'extension est juste une méthode statique), je pense qu'il ne se sent pas le droit, parce que les méthodes d'extension sont utilisés comme s'ils étaient les méthodes d'instance et les méthodes d'instance ne peuvent pas modifier les
this
de référence.