Подтвердить что ты не робот

Реализация оператора трансляции в обобщенном абстрактном классе

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

public interface IValueType<T>
{
    T Value{ get; set; }
}

public abstract class ValueType<T> : IValueType<T> {
    public abstract T Value { get; set; }
    public static explicit operator T(ValueType<T> vt) {
        if(vt == null)
            return default(T);
        return vt.Value;
    }

    public static implicit operator ValueType<T>(T val) {
        ValueType<T> vt = new ValueType<T>(); //<--- obviously this won't work as its abstract
        vt.Value = val;
        return vt;
    }
}
4b9b3361

Ответ 1

Вам нужно ввести еще один общий параметр для идентификации конкретного типа.

что-то вроде..

public interface IValueType<T> 
{    
    T Value{ get; set; } 
} 

public abstract class ValueType<T,K> : 
    IValueType<T> where K : ValueType<T,K>,new()
{     
    public abstract T Value { get; set; }     
    public static explicit operator T(ValueType<T,K> vt) 
    {         
        if(vt == null)            
            return default(T);         
        return vt.Value;     
    }      

    public static implicit operator ValueType<T,K>(T val) 
    {         
        K k = new K();
        k.Value = val;
        return k;    
    } 
} 

Создайте свой конкретный класс

public class Test : ValueType<int,Test>
{
    public override int Value {get;set;}
}

Тогда

var t = new Test();
t.Value = 99;
int i = (int)t;
Test t2 = (Test)6;

Console.WriteLine(i);
Console.WriteLine(t2);