Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用params ref T参数创建方法_C#_C# 4.0 - Fatal编程技术网

C# 使用params ref T参数创建方法

C# 使用params ref T参数创建方法,c#,c#-4.0,C#,C# 4.0,这是我在一个项目中得到的,包括相当复杂的反射案例: static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ } // Example call: PopulateValues(propertyNames, ref list1); 但是,这给了我以下错误: 参数不能同时具有“params”和“ref”修饰符 我最初的想法是让list成为object[],但使用起来很难看

这是我在一个项目中得到的,包括相当复杂的反射案例:

static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }

// Example call:
PopulateValues(propertyNames, ref list1);
但是,这给了我以下错误:

参数不能同时具有“params”和“ref”修饰符

我最初的想法是让
list
成为
object[]
,但使用起来很难看(铸造
object
)。现在,我为每种类型调用一次该方法,执行不必要的多次枚举


已解决:我不需要
ref
来调用参数类上的反射方法(
SetValue
GetValue
InvokeMember
等),这意味着我可以完全跳过
ref
)。真的,我应该试一下。

这在C#的语法中是不可能的。此外,我无法想象这将如何工作。你得到了你的数组,但是在其中设置一个项目会设置参考值?

params
实际上是一个数组;因此,只需将其设置为数组参数(
T[]
,no
ref
),并在返回之前更改值即可。在tw一般情况下,这是最接近您管理的。例如:

Foo[] values =....
SomeMethod(values);
// now look at values[n] etc
ref
+
params
上: 成员不能是引用。由于
params
将每个参数转换为数组成员,因此这是不可能的

我唯一能想到的就是手动创建一些重载



但是在你的情况下,我不明白你为什么首先需要
ref
。要将成员添加到列表中,您无需更改引用本身,因此无需首先将其传递给my ref。

以下是一些有趣的解决方案:

public delegate RecursionRefFunc<T> RecursionRefFunc<T>(ref T arg);

public static RecursionRefFunc<T> Boo<T>(ref T input)
{
    Console.WriteLine(input); // Work in here
    return Boo;
}

public static void Main(string[] args)
{
    int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5;
    Boo(ref x1)(ref x2)(ref x3)(ref x4)(ref x5);
}

// Output: //
// 1
// 2
// 3
// 4
// 5
public委托RecursionRefFunc RecursionRefFunc(ref T arg);
公共静态递归reffunc Boo(ref T输入)
{
Console.WriteLine(输入);//在这里工作
返回Boo;
}
公共静态void Main(字符串[]args)
{
int x1=1,x2=2,x3=3,x4=4,x5=5;
Boo(参考x1)(参考x2)(参考x3)(参考x4)(参考x5);
}
//输出://
// 1
// 2
// 3
// 4
// 5
委托可以在递归中声明

在外部返回一个函数并再次调用

你会被代码审查员杀死



列表1和列表2中包含什么?您真的确定需要“ref”关键字吗?如果它是一个类,那么您可以修改该对象的属性,而无需更改对该对象的引用。您能更详细地描述一下您的实际问题吗?你在用那些列表参数做什么?你在传递什么?字段或局部变量?您示例中的
Foo
类对于方法参数3可能是
Bar
。这是正确的,我不需要
ref
来对参数进行更改反射
public delegate RecursionRefFunc<T> RecursionRefFunc<T>(ref T arg);

public static RecursionRefFunc<T> Boo<T>(ref T input)
{
    Console.WriteLine(input); // Work in here
    return Boo;
}

public static void Main(string[] args)
{
    int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5;
    Boo(ref x1)(ref x2)(ref x3)(ref x4)(ref x5);
}

// Output: //
// 1
// 2
// 3
// 4
// 5