2017-02-17 18 views
0

Это может быть глупый вопрос, и я не нуждаюсь в этом ни за что, но мне было просто интересно ...Cast экземпляр универсального типа в «шаблон» экземпляр

Лучший способ описать это с помощью пример, так вот:

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 < Т> аргумент

+0

Что вы подразумеваете под «treat obj1 as MyGeneric < T>», что вы хотите делать с 'obj1' в' Main'? –

+0

@YacoubMassad Я обновил example.Imagine T реализует интерфейс (или больше). Могу ли я создать переменную MyGeneric <"T"> и указать s на любую конкретную реализацию? Опять же, мне это не нужно, мне было любопытно, есть ли способ сделать этот компилятор –

ответ

1

Вы не можете бросить его MyGeneric<T> в Main, потому что в рамках Main нет такого типа, как T. На самом деле это не совсем понятно, что вы имеете в виду

для лечения obj1, как MyGeneric < T> в главном

При прохождении obj1 к MyMethod вы не «рассматривать его как MyGeneric<T>». Это компилятор, который выводит тип T для вас. Он знает, что T является Foo1 здесь и переводит ваш звонок

MyMethod(obj1); 

в

MyMethod<Foo1>(obj1); 

Так тип параметра arg внутри MyMethod будет в выполнения также MyObject<Foo1>, не неустановленное MyObject<T>.

+0

Вот что я думал, я был просто интересно, могу ли я злоупотреблять языком/компилятором, чтобы сделать эту работу –

1

Нет общего базового типа для MyGeneric и MyGeneric, поэтому я предполагаю, что ответ отрицательный. В отличие от Java generics в C# - строго типизированные типы, а не только заполнители, поэтому у них нет ничего общего - кроме имени. Однако на самом деле они разные типы, думают о них как о MyGeneric<T1>, являющемся типом Foo и MyGeneric<T2>, являющимся Bar.

Путь вокруг этого, чтобы определить, не родовую версию универсального класса:

public class Foo1 { } 
public class MyNonGeneric { } 
public class MyGeneric<T> : MyNonGeneric where T : new() { } 
+0

Спасибо HimBromBeere, но мне не нужен этот способ, мне не нужен этот код –