Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 与C中的泛型参数混淆#_C#_Generics - Fatal编程技术网

C# 与C中的泛型参数混淆#

C# 与C中的泛型参数混淆#,c#,generics,C#,Generics,我正在尝试这样的事情 我在这里用 也就是说,我将人员列表传递给泛型方法Print,但在方法内部,在数据中,我只有对象的标准方法,没有任何类型 如何迭代我将要传递的不同类型的列表 关于当你有一个没有任何约束的泛型方法时,你会说:这个方法适用于任何类型,无论是int、string还是任何像MyType这样的任意类型。这通常不是你真正想要的 相反,您似乎有一个非常具体的要求:不仅仅是任何类型的,而且只有几个非常具体的。为了描述这些特定类型,您可以添加一个通用约束。在您的例子中,数据-参数似乎总是一

我正在尝试这样的事情

我在这里用

也就是说,我将人员列表传递给泛型方法Print,但在方法内部,在数据中,我只有对象的标准方法,没有任何类型

如何迭代我将要传递的不同类型的列表


关于当你有一个没有任何约束的泛型方法时,你会说:这个方法适用于任何类型,无论是
int
string
还是任何像
MyType
这样的任意类型。这通常不是你真正想要的

相反,您似乎有一个非常具体的要求:不仅仅是任何类型的,而且只有几个非常具体的。为了描述这些特定类型,您可以添加一个通用约束。在您的例子中,
数据
-参数似乎总是一些集合,例如列表,因此让我们稍微更新一下您的签名:

public int Print<T>(string concepto, List<T> data) { ... }
实际上,您知道只有少数几种类型是可能的,例如,仅
个人
。理想情况下,这些类型实现一个通用接口,您可以将其用于泛型约束:

public int Print<T>(string concepto, List<T> data) { ... } where T: MyInterface
现在,您可以在
print
-方法中访问为该接口定义的每个成员:

public int Print<T>(string concepto, List<T> data) where T: MyInterface
{
    foreach(var element in data)
    {
        var myMember = element.MyMember; // element is of type T which is MyInterface
    }
}
public int-Print(字符串概念,列表数据),其中T:MyInterface
{
foreach(数据中的var元素)
{
var myMember=element.myMember;//元素的类型为T,即MyInterface
}
}

当你有一个没有任何约束的泛型方法时,你会说:这个方法适用于任何类型,无论是
int
string
还是任何像
MyType
这样的任意类型。这通常不是你真正想要的

相反,您似乎有一个非常具体的要求:不仅仅是任何类型的,而且只有几个非常具体的。为了描述这些特定类型,您可以添加一个通用约束。在您的例子中,
数据
-参数似乎总是一些集合,例如列表,因此让我们稍微更新一下您的签名:

public int Print<T>(string concepto, List<T> data) { ... }
实际上,您知道只有少数几种类型是可能的,例如,仅
个人
。理想情况下,这些类型实现一个通用接口,您可以将其用于泛型约束:

public int Print<T>(string concepto, List<T> data) { ... } where T: MyInterface
现在,您可以在
print
-方法中访问为该接口定义的每个成员:

public int Print<T>(string concepto, List<T> data) where T: MyInterface
{
    foreach(var element in data)
    {
        var myMember = element.MyMember; // element is of type T which is MyInterface
    }
}
public int-Print(字符串概念,列表数据),其中T:MyInterface
{
foreach(数据中的var元素)
{
var myMember=element.myMember;//元素的类型为T,即MyInterface
}
}

修改
打印方法以接受泛型类型:

public int Print<T>(string concepto, IEnumerable<T> data)
{

}

修改
Print
方法以接受泛型类型:

public int Print<T>(string concepto, IEnumerable<T> data)
{

}

除非您不添加泛型约束,否则编译器将采用
t
的最基本类型,即
object
。因此,您应该在方法签名中添加一个
,其中T:MyType
。但是,我们不知道您希望
t
使用什么类型。在您的示例中有
列表
,但我假设还有更多。否则泛型方法将毫无意义。您需要告诉编译器所需的类型。否则,您的数据可能是任何内容。例如,和int-您不能迭代int。您可能的类(例如
Person
)有什么共同点吗?然后,您可以为它们提取一个公共基本接口,并将参数更改为打印(string conceptop,IEnumerable data),其中T:MyInterface
,当方法需要完全不同的属性时,您希望该方法做什么?除非您不添加泛型约束,否则编译器将采用
t
的最基本类型,即
object
。因此,您应该在方法签名中添加一个
,其中T:MyType
。但是,我们不知道您希望
t
使用什么类型。在您的示例中有
列表
,但我假设还有更多。否则泛型方法将毫无意义。您需要告诉编译器所需的类型。否则,您的数据可能是任何内容。例如,和int-您不能迭代int。您可能的类(例如
Person
)有什么共同点吗?然后,您可以为它们提取一个公共基接口,并将参数更改为打印(string conceptop,IEnumerable data),其中T:MyInterface
。假设您传入一个不同的类型,当该方法需要完全不同的属性时,您希望该方法做什么?对于最后一行。。。列表仍然没有属性“MyMember”。在这里,您可能指的是
元素.MyMember
:),尽管最后一个示例也缺少类型约束。您好。实际上,这是一个知道如何使用泛型的示例,但在我的实际应用中,我需要打印IEnumerable,其中T将是不同类型的类,所有这些类都具有相同的属性,其中一个属性是名为CalendarioValores的IEnumerable,但在我的方法中,我尝试了以下操作:foreach(data.First()中的var项CalendarioValores)属性“CalendarioValores”不可用accessible@kintela您现在有什么通用约束?显示与constraint.Solved匹配的接口/基类。我使用了一个接口和一个约束,现在我发现最后一行的属性。。。列表仍然没有属性“MyMember”。在这里,您可能指的是
元素.MyMember
:),尽管最后一个示例也缺少类型约束。您好。实际上,这是一个知道如何使用泛型的示例,但在我的实际应用中,我需要打印IEnumerable,其中T将是不同类型的类,所有这些类都具有相同的属性,其中一个属性是名为CalendarioValores的IEnumerable,但在我的方法中,我尝试了以下操作:foreach(data.First()中的var项CalendarioValores)“CalendarioVa”酒店