[英]Cast instance of generic type to “template” instance
這可能是一個愚蠢的問題,我真的不需要這個,但是我很好奇...
描述它的最佳方法是使用一個示例,因此在這里是:
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視為Main中的MyGeneric <T>
但與此同時,這感覺很奇怪,因為我可以將其作為MyGeneric <T>參數傳遞
MyGeneric和MyGeneric沒有通用的基本類型,因此我認為答案是否定的。 與Java中的C#相反,泛型是強類型類型,而不僅僅是占位符,因此它們沒有任何共同點-除了名稱。 但是實際上它們是不同的類型,可以將它們視為MyGeneric<T1>
是Foo
類型,而MyGeneric<T2>
是Bar
。
一種解決方法是定義泛型類的非泛型版本:
public class Foo1 { }
public class MyNonGeneric { }
public class MyGeneric<T> : MyNonGeneric where T : new() { }
您不能將其MyGeneric<T>
為Main
中的MyGeneric<T>
,因為在Main
范圍內沒有T
這樣的類型。 其實還不清楚你是什么意思
在Main中將obj1視為MyGeneric <T>
將obj1
傳遞給MyMethod
您不必“將其作為MyGeneric<T>
”。 是編譯器為您推斷T
的類型 。 它知道T
在這里是Foo1
並轉換您的呼叫
MyMethod(obj1);
至
MyMethod<Foo1>(obj1);
因此, MyMethod
中的參數arg
的類型在運行時也將是MyObject<Foo1>
,而不是未指定的MyObject<T>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.