2017-02-17 145 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,但我不需要一種解決方法,我不需要這個代碼 –