gpt4 book ai didi

c# - C# 扩展方法不允许通过引用传递参数吗?

转载 作者:IT王子 更新时间:2023-10-29 04:30:52 25 4
gpt4 key购买 nike

在实例作为引用传递的情况下,在 C# 中创建扩展方法真的不可能吗?

这是一个示例 VB.NET 控制台应用程序:

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

注意 Value 参数是通过 ByRef 传递的。

并且在 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;
}
}
}

Add 扩展方法在 C# 中不起作用,因为我不能使用 ref 关键字。有什么解决方法吗?

最佳答案

没有。在 C# 中,您不能为扩展方法的第一个参数指定除 this 之外的任何修饰符(如“out”或 ref)- 您可以为别人。 不熟悉 VB 语法,但它似乎使用声明性方法来标记扩展方法。

调用它时,您指定第一个this参数。因此,将参数标记为 out 或 ref 没有意义,因为您不能像调用普通方法那样在调用它时指定修饰符

void MyInstanceMethod(ref SomeClass c, int data) { ... } // definition

obj.MyInstanceMethod(ref someClassObj, 10); // call

void MyExtensionMethod(this SomeClass c, int data) {.... } // defn

c.MyExtensionMethod(10); // call

我认为您在这里遇到的问题与值类型不可变有关。如果 Weekdays 是一个引用类型,它就可以正常工作。对于不可变类型(结构),事实上的方法是返回一个具有所需值的新实例。例如。参见 struct DateTime 上的 Add 方法,它返回一个新的 DateTime 实例,其值 = 接收方 DateTime 实例的值 + 参数值。

public DateTime Add( TimeSpan value )

关于c# - C# 扩展方法不允许通过引用传递参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1259103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com