这可能是一个愚蠢的问题,我真的不需要这个,但我只是好奇......
描述它的最好方法是使用一个例子,所以这里是:
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&lt; T&GT;在主要 但同时感觉很奇怪,因为我可以把它作为MyGeneric&lt; T&GT;参数
答案 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() { }
答案 1 :(得分:1)
您无法将其投放到MyGeneric<T>
中的Main
,因为Main
范围内没有T
这样的类型。
将obj1视为MyGeneric&lt; T&GT;在主要
将obj1
传递给MyMethod
时,您不会“将其视为MyGeneric<T>
”。编译器为您推断T
的类型。它知道此处T
为Foo1
并翻译您的电话
MyMethod(obj1);
到
MyMethod<Foo1>(obj1);
因此arg
内的参数MyMethod
在运行时的类型也是MyObject<Foo1>
,而不是未指定的MyObject<T>
。