Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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:class { 公共空写() { Console.Write(typeof(T).FullName); } }_C#_Generics - Fatal编程技术网

C# 泛型类和泛型方法 类测试,其中T:class { 公共空写() { Console.Write(typeof(T).FullName); } }

C# 泛型类和泛型方法 类测试,其中T:class { 公共空写() { Console.Write(typeof(T).FullName); } },c#,generics,C#,Generics,在上面的类中,可以为类传入字符串(test test=new test),然后为方法传入int?如果是,输出是什么?如果没有,这会导致什么问题?尽管经常使用泛型(在我自己的类中)和泛型集合,但我实际上并没有尝试过这种方法 我编写/查看泛型类的方式如下: class test <T> where T : class { public void Write<T>() { Console.Write(typeof(T).FullName);

在上面的类中,可以为类传入字符串(
test test=new test
),然后为方法传入int?如果是,输出是什么?如果没有,这会导致什么问题?尽管经常使用泛型(在我自己的类中)和泛型集合,但我实际上并没有尝试过这种方法

我编写/查看泛型类的方式如下:

class test <T> where T : class
{
    public void Write<T>()
    {
        Console.Write(typeof(T).FullName);
    }
}
class,其中T:class
{
公共文件不能写()
{
Console.Write(T.ToString());
}
}

您需要在方法中分别向类声明一个类型变量-

class <T> where T : class
{
    public T Write()
    {
        Console.Write(T.ToString());
    }
}
类测试,其中T:class{
公共作废法(U val){
Console.WriteLine(typeof(U).FullName);
}
}

正如最初编写的一样,不,您不能。为了在类中的不同点使用不同的类型,必须具有多个泛型参数。可以在方法级别定义一个不同的方法,并使您的示例正常工作

class Test<T> where T : class {

    public void Method<U>(U val) {
        Console.WriteLine(typeof(U).FullName);
    }

}
类测试,其中T:class{
公共无效写入(U arg1){
Console.WriteLine(arg1.ToString());
}
}
用法

var t=newtest();
t、 写作(42);

正如Scott指出的,您可以使用相同的命名参数。虽然这样做会引起警告,一般来说会让人困惑。为当前范围内的所有泛型参数指定不同的名称要干净得多。

我实际上并没有尝试做任何事情。今天我不得不参加C#考试,我提出了一个与我建议的非常相似的问题/代码。我不确定答案,所以我想在这里问一下。不幸的是,我记不清代码的原样。如果你看一下这个方法,“t”实际上是一个方法参数。它与类的参数同名,因此将生成警告。然而,这在这里实际上并不违法。(尽管我会像你建议的那样建议将其重命名为U)@Scott,我实际上认为C#会在那里发出错误而不是警告。奇怪的:(
class Test<T> where T : class {
  public void Write<U>(U arg1) {
    Console.WriteLine(arg1.ToString());
  }
}
var t = new Test<string>();
t.Write(42);