Обобщенная операция преобразования
От: _nn_ www.nemerleweb.com
Дата: 08.03.11 14:21
Оценка:
Nemerle позволяет написать такое:

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;


C# не позволяет (хотя Reflector парсит )
class A<T>
{
  public static implicit operator A<T><From>(A<From> x)// Error
  {
    return new A<T>();
  }
}


Можно ли это описать на C# вообще ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Обобщенная операция преобразования
От: catbert  
Дата: 08.03.11 14:25
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Nemerle позволяет написать такое:


__>[nemerle]

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

А вы этот код запускали? Мне помнится, когда я экспериментировал, такой каст вылетал с Exception-ом.
Re[2]: Обобщенная операция преобразования
От: _nn_ www.nemerleweb.com
Дата: 08.03.11 14:29
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Nemerle позволяет написать такое:


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

C>А вы этот код запускали? Мне помнится, когда я экспериментировал, такой каст вылетал с Exception-ом.

Конкретно этот код компилируется и работает.

Вот получше пример
[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));
    }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.