2017-02-17 108 views
0

这可能是一个愚蠢的问题,我并不真的需要这个任何东西,但我只是好奇......投泛型类型的实例为“模板”的实例

最好的办法是用描述例如所以这里是:

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>参数

+0

什么意思是“把obj1当作MyGeneric < T>”,你想在'Main'中用'obj1'做什么? –

+0

@YacoubMassad我更新了示例.Imagine T实现了一个接口(或更多)。我可以创建一个变量MyGeneric <"T">并指向任何具体实现?再次,我不需要这个,我很好奇,如果有我的方式来编译 –

回答

1

你不能将它转换为MyGeneric<T>Main因为在Main范围内有没有这样的类型T。其实这不是真正清楚你的意思由

在主

治疗OBJ1作为MyGeneric < T>当传递到obj1MyMethod不“把它当作MyGeneric<T>”。它是编译器,其为推断为您的类型T。它知道TFoo1这里会将您的通话

MyMethod(obj1); 

MyMethod<Foo1>(obj1); 

所以参数argMyMethod里面的类型将在运行MyObject<Foo1>,而不是一个不确定MyObject<T>

+0

这就是我认为,我是只是想知道我是否可以滥用语言/编译器来完成这项工作 –

1

MyGeneric和MyGeneric没有公共基类型,所以我假设答案是否定的。与C#中的Java泛型不同的是强类型类型,而不仅仅是占位符,所以它们没有任何共同之处 - 除了名称。然而,实际上它们是不同的类型,认为它们只是MyGeneric<T1>Foo类型,而MyGeneric<T2>Bar

解决的办法是定义泛型类的非通用版本:

public class Foo1 { } 
public class MyNonGeneric { } 
public class MyGeneric<T> : MyNonGeneric where T : new() { } 
+0

感谢HimBromBeere,但我不需要一种解决方法,我不需要这个代码 –