在泛型抽象类中实现强制转换运算符

本文关键字:转换 运算符 实现 泛型 抽象类 | 更新日期: 2023-09-27 17:56:02

我试图偷懒并在抽象基类中而不是在每个派生的具体类中实现强制转换运算符。 我已经设法投出一种方式,但我无法投掷另一种方式。 我认为这可能是不可能的,但想在放弃之前选择集体 SO 思想:

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;
    }
}

在泛型抽象类中实现强制转换运算符

您需要引入另一个泛型参数来标识具体类型。

类似的东西..

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);