Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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# Can';t使用从具有指定类型的泛型类继承的非泛型类的实例变量_C#_.net - Fatal编程技术网

C# Can';t使用从具有指定类型的泛型类继承的非泛型类的实例变量

C# Can';t使用从具有指定类型的泛型类继承的非泛型类的实例变量,c#,.net,C#,.net,我创建了如下类: abstract class AClass1<T> { // some code here } class Class2 : AClass1<int> { // some code here } class Class3 : AClass1<float> { // some code here } class Class4<T> : AClass1<T> { // some cod

我创建了如下类:

abstract class AClass1<T>
{
    // some code here
}

class Class2 : AClass1<int>
{
    // some code here
}

class Class3 : AClass1<float>
{
    // some code here
}

class Class4<T> : AClass1<T>
{
    // some code here
}

或者有时:

variable = new Class4<T>();
variable=newclass4();
这会产生一个编译错误,没有可能的强制转换或我尝试的任何其他操作。目前,我只是将所有继承类更改为泛型,如:

class Class2<T> : AClass1<T>
{
    // some code here
}
类2:AClass1
{
//这里有一些代码
}
但这感觉不对,因为没有通用方法或任何东西

问题是什么是正确的方法,为什么,为什么我不能用我原来的方法

顺便说一句,这是.NET2.0,因为我正在Unity3D中使用它

更清楚地说:


我有一些特定的情况,例如,对于int类型,我想专门处理,但还有一些我想有一个泛型类。因此,我创建了一些子类,这些子类专门处理一些类型,我还有一个泛型子类,在没有特定类型实现时使用。当我为一个类型创建一个特定的类时,它不应该是泛型的,因为它只处理一个类型。

一个
Class2
对象不能分配给
AClass1
变量,因为
Class2
不是从
AClass1
派生的,而是
AClass1
。这些类型不兼容,编译器无法在它们之间强制转换。因此出现了编译错误


也许您可以为
AClass1

引入一个非泛型基类。编译器正试图通过确保您不执行不保证工作的赋值来帮助您。这是不合法的:

void foo<T>() {
  ...
  if (typeof(T) == typeof(int)) {
    AClass1<T> variable = new Class2();
  }
  ...
}
如果错误,代码将在运行时失败,并出现
InvalidCastException


这种方法是可疑的,因为它提出了一个问题:为什么要使用泛型(编译时类型特性),然后在实际代码中绕过它们。像这样的代码必须仔细检查,看看这是否真的是最合适的解决方案。可能的替代方案是引入非泛型基类,对泛型类型使用包含,或者干脆不使用泛型(如果您实际上只使用
float
int
,那么泛型基类是否会添加任何内容?)

如果
variable
不需要在
AClass1
上定义的任何泛型成员,那么为什么要将其声明为这样。如果是这样的话,
类Class2:AClass1
看起来是正确的。你是对的,我没有提到有时候继承类是泛型的。我纠正了这个问题。我不完全清楚你想做什么,但不能。如果代码能够编译并解释您试图实现的目标,您是否可以发布您希望使用的代码,即不指定类型参数。然而,这是不允许的。同样,您也不能使用
列表变量
。您必须创建一个非泛型基类或接口。该类型只能保存独立于类型变量的成员。例如,类
List
可以实现一个非泛型接口
IList
,该接口包含属性
int Count{get;}
。另外:当然,
object
是任何类的非泛型基类,所以你可以使用它,但它的成员集有限。完成了,希望对无辜的未来读者有适当的资格。嗨,谢谢你的回答,但我不能-请看编辑后的问题,有时我的继承类是泛型的,我不知道我正在处理的类型。不幸的是,在我的实际情况中,它的类型比
float
int
多得多,我想从最终用户那里抽象出我的代码的内部工作,这样它就可以像普通的泛型类一样工作,但也有一些特定的情况。回答得很好,谢谢!
variable = new Class4<T>();
class Class2<T> : AClass1<T>
{
    // some code here
}
void foo<T>() {
  ...
  if (typeof(T) == typeof(int)) {
    AClass1<T> variable = new Class2();
  }
  ...
}
    AClass1<T> variable = (AClass1<T>) (object) new Class2();