【问题标题】:implementing a cast operator in a generic abstract class在通用抽象类中实现强制转换运算符
【发布时间】:2011-08-22 09:44:57
【问题描述】:

我试图偷懒并在抽象基类中而不是在每个派生的具体类中实现强制转换运算符。我已经设法施放一种方式,但我无法施放另一种方式。我认为这可能是不可能的,但想在放弃之前选择集体 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;
    }
}

【问题讨论】:

  • 我的一部分认为你可以通过反射来做到这一点,但我大多数人说在派生类中这样做更有意义,因为知道如何从 T 出发是个体派生类的工作对它来说,不是抽象类的工作。
  • 实际上,我认为即使使用反射也无法做到,因为它们是静态方法,而我认为需要实例方法。
  • @Matt Ellen 我同意最好在具体类中执行此操作,但我宁愿编写一次方法而不是将其复制到数十个派生类中。

标签: c# generics abstract-class operator-keyword


【解决方案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);

【讨论】:

  • 我看到您仍然需要将 int 显式转换为 Test: Test t2 = (Test)6;。我猜那是因为我们无法实现public static implicit operator K(T val){...} 而不会导致编译时错误(CS0556)。
  • 我想到了一个链接隐式运算符的解决方案,但卡在那里,请参阅:stackoverflow.com/questions/6001854/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多