Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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#中,什么是<;T>;在方法声明之后?_C#_Methods_Declaration - Fatal编程技术网

在C#中,什么是<;T>;在方法声明之后?

在C#中,什么是<;T>;在方法声明之后?,c#,methods,declaration,C#,Methods,Declaration,我是一个VB.Net的家伙。(因为我必须这样做,因为签支票的人是这么说的。:P)我在Java中长大,当我有机会的时候,我通常不会挣扎着用C语言读写。今天我遇到了一些我从未见过的语法,我似乎无法理解 在下面的方法声明中,代表什么 静态void Foo(参数T[]x) 我见过与声明泛型集合和其他东西一起使用,但我一辈子都不知道它对这个方法有什么作用 为了以防万一,我在考虑一些问题时遇到了它。第六个摘要包含整个代码段。这定义了一个,它是的一种形式,在C#2.0中被添加到C#中 方法sig应为: sta

我是一个VB.Net的家伙。(因为我必须这样做,因为签支票的人是这么说的。:P)我在Java中长大,当我有机会的时候,我通常不会挣扎着用C语言读写。今天我遇到了一些我从未见过的语法,我似乎无法理解

在下面的方法声明中,代表什么

静态void Foo(参数T[]x)

我见过与声明泛型集合和其他东西一起使用,但我一辈子都不知道它对这个方法有什么作用

为了以防万一,我在考虑一些问题时遇到了它。第六个摘要包含整个代码段。

这定义了一个,它是的一种形式,在C#2.0中被添加到C#中

方法sig应为:

static void Foo<T>(params T[] x)
{ // ...
静态void Foo(参数T[]x)
{ // ...
这允许您将任意数量的任何(特定)类型的参数传递到方法Foo中,并作用于该参数数组。它与泛型类型的工作方式类似,只是作用域仅限于方法。
指定传递到方法中的参数的类型,因此您可以这样调用:

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
Foo(myClassInstance、myClassInstance 2、mySubclassInstance);

是泛型方法的泛型类型参数

一旦在调用方法时为T指定了类型,.NET就可以基于该类型参数确保类型安全

static void Foo<T>(params T[] x) { }
静态void Foo(参数T[]x){
将被称为:

string[] names = new string[] {"Foo", "Bar", "Baz"};

Foo<string>(names);
string[]names=新字符串[]{“Foo”、“Bar”、“Baz”};
Foo(姓名);
但这会导致编译器错误:

int[] nums = new int[] {1, 2, 3};

Foo<string>(nums); // nums is not string[]
int[]nums=newint[]{1,2,3};
Foo(nums);//nums不是字符串[]
T是a,在这种情况下可以是任何东西(可以指定约束,但这里没有约束)。如果没有此功能,您必须为计划使用的每种类型声明方法:

static void Foo(params int[] x)    
static void Foo(params string[] x)    
static void Foo(params Customer[] x)    
etc...

有关泛型的更多信息,请访问MSDN:。

您要问的是c#中泛型的概念。通过使用泛型,您可以将此方法用于所需的类型

假设您必须创建一个函数来添加两个数字。 在这种情况下,您的函数是

//For integer :
public int sum(int a, int b)
{ 
  return a + b;
}



//For floating point numbers :
public float sum( float a, float b)
{
  return a + b;
}
按照这个逻辑,如果您想要一个将两个双精度数字相加的函数,您可以再创建一个函数,依此类推

注意:上面的代码不适用于C#,但它只是为了方便地解释概念,它只是sudo代码。如果您可以轻松地使用可空类型或引用类型,或者需要编写逻辑将值转换为主类型,它将适用于C#

Bu在泛型的帮助下,您可以替换所有这些函数并编写以下代码

public T sum<T>(T a, T b)
{
  return a + b;
}
publictsum(ta,tb)
{
返回a+b;
}
这将适用于所有数字类型以及字符串


查看此项了解更多详细信息:

具体来说,它定义了方法中泛型类型的名称。我的理解是,在这段代码中,(params T[]x)负责声明该方法接受任意数量的T类型参数,并将它们存储在x引用的数组中。如果这是正确的,则方法名称后的会添加到声明中什么?@Drew:您声明一个要在函数中使用的类型。编译器不知道您使用
T[]的意思
,因为没有类型
T
,它是用
声明的。作为函数的调用者,您可以设置类型。例如
Foo(1,2,3);
Foo(1.0,2.0,3.0);
@draw:与变量声明类似,您可以使用任何您想要的名称。您还可以编写:
静态void Foo(参数栏[]x){
。例如,在字典中使用
T
、或
TKey
TValue
只是一种惯例。@Drew:还要注意,调用函数时可以省略
,只要编译器可以推断出来。例如,
Foo(new Bar(),new Bar())
相当于
Foo(new Bar()),新条())
。编译器无法确定应该使用哪种类型的示例可能是在使用公共基类型或匿名方法传递多个不同类型的对象时。下面是有关泛型类型+1的MSDN页面,以获取代码示例和简单易懂的示例!显示了对所问问题的清晰理解以及OP的und级别这个例子很容易理解,但是它不起作用。你不能添加两个泛型类型的变量。参见:解决方法是从外部库中使用泛型运算符:谢谢我获得的信息,更多的是面向C++模板。