неявное приведение универсального <T>обратно к T - PullRequest
8 голосов
/ 06 января 2010

Если я напишу универсальный класс, такой как класс MyGeneric<T>, можно ли написать неявное приведение к типу T, чтобы я мог делать такие вещи, как:

public class MyGeneric<T>
{
...
}

public class GenericProperties
{
   public MyGeneric<string> MyGenericString {get;set;}

   public void UseMyGeneric()
   {
       string sTest = MyGenericString;
       MyGenericString = "this is a test";
   }
}

Возможно ли это сделать перегрузкой операторов? Я знаю, что это можно было сделать, если бы мой класс не был общим ...

Ответы [ 4 ]

21 голосов
/ 06 января 2010

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

class Wrapper<T>
{
    public T Value {get; private set;}
    public Wrapper(T val) {Value = val;}

    public static implicit operator T(Wrapper<T> wrapper) {return wrapper.Value;}
    public static implicit operator Wrapper<T>(T val) {return new Wrapper<T>(val);}
}



var intWrapper = new Wrapper<int>(7);
var usingIt = 7 * intWrapper; //49

Wrapper<int> someWrapper = 9; //woohoo
19 голосов
/ 06 января 2010

Ну да, но ради любви к зомби Иисус не делает этого. Это действительно сбивает с толку. Я думаю, вы немного неправильно понимаете назначение дженериков. Он не используется для «превращения» класса в этот тип, он используется для того, чтобы этот тип (MyGenericString) «знал» о нужном типе для различных целей (как правило, для целей коллекции).

14 голосов
/ 06 января 2010

Как уже говорили другие, это законно , но опасно . Есть много ловушек, в которые вы можете попасть. Например, предположим, что вы определили пользовательский оператор преобразования между C<T> и T. Затем вы говорите

C<object> c = new C<object>("hello");
object o = (object) c;

Что происходит? выполняется пользовательское преобразование или нет? Нет, потому что c уже является объектом.

Как я уже сказал, есть сумасшедшие ситуации, в которые вы можете попасть, когда пытаетесь определить универсальные операторы преобразования; не делайте этого, если у вас нет глубокого и детального понимания раздела 10.10.3 спецификации.

0 голосов
/ 06 января 2010

Да, это возможно при неявной Перегрузке оператора преобразования

class Program
{
    static void Main(string[] args)
    {
        myclass<string> a = new myclass<string>();
        a.inner = "Hello";
        string b = a;
        Console.WriteLine(b);
    }
}

class myclass<T>
{
    public T inner;
    public myclass()
    {

    }
    public static implicit operator T(myclass<T> arg1)
    {
        return arg1.inner;
    }
}
...