Как я могу использовать универсальный в неявном операторе? - PullRequest
4 голосов
/ 24 апреля 2009

У меня есть класс C ++, который очень прост:

struct Pt_t
{
    T x, y;
    template <class T2> operator Pt_t<T2>() { Pt_t<T2> pt = {x, y}; return pt; }
};

Это позволяет мне создать pt с T как любой тип, который я хочу. Я также могу сделать Pt_t<s8> = Pt_t<u64>; без проблем. Как мне сделать то же самое в C #? Я попробовал ниже и получил ошибку:

    class Pt<T>
    {
        public T x, y;
        //between operator and <T2>, error CS1031: Type expected
        public static implicit operator<T2> Pt<T>(Pt<T2> v) {
            Pt<T> r = new Pt<T>();
            r.x = v.x;
            r.y = v.y;
            return r; 
        }
    }

Ответы [ 2 ]

2 голосов
/ 24 апреля 2009

Нет, я не думаю, что это возможно. Возможно, вам придется добавить метод, например To<T>.

Следующая проблема будет «как перейти от T2 к T - вы не можете просто назначить их. Одним из вариантов может быть делегат преобразования:

public Pt<TDestination> To<TDestination>(
    Converter<T, TDestination> converter)
{
    if (converter == null) throw new ArgumentNullException("converter");
    Pt<TDestination> t = new Pt<TDestination>();
    t.x = converter(x);
    t.y = converter(y);
    return t;
}
...
var p = new Pt<int> { x = 1, y = 2 };
var p2 = p.To(t => t.ToString()); // a Pt<string>
0 голосов
/ 08 марта 2011

Вы можете использовать Nemerle: (http://github.com/rsdn/nemerle):

using System.Console;

class A[T]
{
    public static @:[From](x : A[From]) : A[T]
    {
      A()
    }
}


class Base{}
class Derived{}


def a = A.[Derived]();
def b : A[Base] = a;

WriteLine($"$a $b");

Выход:

A`1[Derived] A`1[Base]

Отражатель для кода:

internal class A<T>
{
    public static implicit operator A<T><From>(A<From> x)
    {
        return new A<T>();
    }
}

public class a
{
    public static void Main()
    {
        A<Derived> a = new A<Derived>();
        A<Base> a2 = (A<Base>) a;
        Console.WriteLine(Convert.ToString(a) + " " + Convert.ToString(a2));
    }
}
...