投泛型类型的实例为“模板”的实例
这可能是一个愚蠢的问题,我并不真的需要这个任何东西,但我只是好奇......投泛型类型的实例为“模板”的实例
最好的办法是用描述例如所以这里是:
using System;
namespace GenericExample
{
public interface IFoo { }
public interface IFoo2 { }
public class Foo1: IFoo , IFoo2 { }
public class Foo2 : IFoo, IFoo2 { }
public class MyGeneric<T> where T : IFoo , IFoo2, new() { }
internal class Program
{
public static void Main(string[] args)
{
MyGeneric<Foo1> obj1 = new MyGeneric<Foo1>();
MyMethod(obj1);//I can treat obj1 as MyGeneric<T> in MyMethod
MyGeneric<Foo2> obj2 = new MyGeneric<Foo2>();
//But can I use is as MyGeneric<T> in this method???
//MyGeneric<?> obj3 = null;
//obj3 = (MyGeneric<?>)obj1;
//obj3 = (MyGeneric<?>)obj2;
Console.ReadLine();
}
public static void MyMethod<T>(MyGeneric<T> arg) where T : IFoo, IFoo2, new()
{
}
}
}
我不认为这是可能的主要
治疗OBJ1作为MyGeneric < T>,但同时也觉得很奇怪,因为我可以把它作为一个MyGeneric < T>参数
你不能将它转换为MyGeneric<T>
在Main
因为在Main
范围内有没有这样的类型T
。其实这不是真正清楚你的意思由
在主
治疗OBJ1作为MyGeneric < T>当传递到obj1
你MyMethod
不“把它当作MyGeneric<T>
”。它是编译器,其为推断为您的类型T
。它知道T
是Foo1
这里会将您的通话
MyMethod(obj1);
到
MyMethod<Foo1>(obj1);
所以参数arg
的MyMethod
里面的类型将在运行也MyObject<Foo1>
,而不是一个不确定MyObject<T>
。
这就是我认为,我是只是想知道我是否可以滥用语言/编译器来完成这项工作 –
MyGeneric和MyGeneric没有公共基类型,所以我假设答案是否定的。与C#中的Java泛型不同的是强类型类型,而不仅仅是占位符,所以它们没有任何共同之处 - 除了名称。然而,实际上它们是不同的类型,认为它们只是MyGeneric<T1>
是Foo
类型,而MyGeneric<T2>
是Bar
。
解决的办法是定义泛型类的非通用版本:
public class Foo1 { }
public class MyNonGeneric { }
public class MyGeneric<T> : MyNonGeneric where T : new() { }
感谢HimBromBeere,但我不需要一种解决方法,我不需要这个代码 –
什么意思是“把obj1当作MyGeneric ”,你想在'Main'中用'obj1'做什么? –
@YacoubMassad我更新了示例.Imagine T实现了一个接口(或更多)。我可以创建一个变量MyGeneric 并指向任何具体实现?再次,我不需要这个,我很好奇,如果有我的方式来编译 –