将泛型类型的实例转换为“模板”实例

时间:2017-02-17 11:09:42

标签: c# generics casting

这可能是一个愚蠢的问题,我真的不需要这个,但我只是好奇......

描述它的最好方法是使用一个例子,所以这里是:

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

2 个答案:

答案 0 :(得分:1)

MyGeneric和MyGeneric没有通用的基类型,所以我认为答案是否定的。与C#中的Java泛型相比,强类型类型而不仅仅是占位符,因此它们没有任何共同点 - 除了名称。但实际上它们是不同的类型,将它们视为MyGeneric<T1>类型FooMyGeneric<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 的类型。它知道此处TFoo1并翻译您的电话

MyMethod(obj1);

MyMethod<Foo1>(obj1);

因此arg内的参数MyMethod运行时的类型也是MyObject<Foo1>,而不是未指定的MyObject<T>