簡體   English   中英

將泛型類型的實例轉換為“模板”實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM