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# вообще ?
Здравствуйте, 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));
}
}