Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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# 是否可以使用没有类型参数的泛型类?_C#_Templates_Generics - Fatal编程技术网

C# 是否可以使用没有类型参数的泛型类?

C# 是否可以使用没有类型参数的泛型类?,c#,templates,generics,C#,Templates,Generics,如果我有一个templatedgeneric类MyClass,是否可以执行以下操作: var b = someObject is MyClass; // without specifying <T> 不,不是,但您可以使用反射来检查类型: someObject.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(MyClass<>)) 不,不是,但您可以使用反射来检查类型: someObject.G

如果我有一个templatedgeneric类MyClass,是否可以执行以下操作:

var b = someObject is MyClass; // without specifying <T>

不,不是,但您可以使用反射来检查类型:

someObject.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(MyClass<>))

不,不是,但您可以使用反射来检查类型:

someObject.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(MyClass<>))

这里有一点肯定被误解了,MyClass是一个“MyClass”类型,它使用类型“T”执行某些操作

事实并非如此

在创建实例之前,MyClass至少在概念上不存在。每当使用类型参数(比如MyClass)创建这样的实例时,它就会成为一个具体的类型。也就是说,MyClass或MyClass或MyClass都是具有相似名称的不同类。这些类型被称为具有泛型的构造类型。您可以重复使用MyClass名称,否则您将拥有具有不同名称的类。事实上,泛型和非泛型实现可以同时存在,并被视为不同的类型

例如

public class MyClass<T>
{
}

public class MyClass
{

}

 private static void Main()
 {
    if(typeof(MyClass)==typeof(MyClass<>)) {  }
    else {  }
 }
如果您调试上面的类,您将在else部分结束


因此,在您声明MyClass之前,它根本不是一个类型。

这里有一点肯定会被误解,那就是MyClass是一个“MyClass”类型,它使用类型“T”执行某些操作

事实并非如此

在创建实例之前,MyClass至少在概念上不存在。每当使用类型参数(比如MyClass)创建这样的实例时,它就会成为一个具体的类型。也就是说,MyClass或MyClass或MyClass都是具有相似名称的不同类。这些类型被称为具有泛型的构造类型。您可以重复使用MyClass名称,否则您将拥有具有不同名称的类。事实上,泛型和非泛型实现可以同时存在,并被视为不同的类型

例如

public class MyClass<T>
{
}

public class MyClass
{

}

 private static void Main()
 {
    if(typeof(MyClass)==typeof(MyClass<>)) {  }
    else {  }
 }
如果您调试上面的类,您将在else部分结束

因此,在您声明MyClass之前,它根本不是一个类型。

MyClass和MyClass是两个不相关的类型。您可以自己创建关系并获得指定的行为

class MyClass {}

class MyClass<T> : MyClass {}
如果指定MyClass和MyClass之间的关系,则您的is运算符将在上面的代码中工作。

MyClass和MyClass是两种不相关的类型。您可以自己创建关系并获得指定的行为

class MyClass {}

class MyClass<T> : MyClass {}

如果您指定MyClass和MyClass之间的关系,那么您的is运算符将在上面的代码中工作。

您考虑过继承吗?MyClass继承非泛型MyClass有意义吗?在这种情况下,您可以使用is运算符。您考虑过继承吗?MyClass继承非泛型MyClass有意义吗?在这种情况下,您可以使用is运算符。感谢您的尝试,很难编辑。感谢您的尝试,很难编辑。