在通用c#类中链接隐式运算符

Iai*_*oat 6 c# abstract-class operator-overloading

对于以下通用c#类,我想将T转换为K:

public abstract class ValueType<T,K> : IValueType<T> where K : ValueType<T,K>,new()
{     
    public abstract T Value { get; set; }     

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

如果我要实现直接运算符implicit operator K(T val),则会导致编译时错误(CS0556).

我以为我可以尝试链接隐式运算符:

public static implicit operator K(ValueType<T,K> vt){
    return (K)val;
}
Run Code Online (Sandbox Code Playgroud)

但是下面的例子仍然抱怨它无法转换:

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

Test t = 6; //complains it's unable to be converted
Console.WriteLine(t.Value);
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我真的想避免明确地施放.

这个问题延伸到我之前提出的另一个问题.

Eri*_*ert 13

实现自己的隐式转换逻辑的规则非常严格,如果你要做这样特别复杂的规则,你应该对规范的6.4.4和10.10.3非常熟悉.

简而言之,您应该知道的一些关键规则是:

  • 您定义转换的类型必须出现在用户定义转换的"到"或"从"部分.你不能创建一个定义从E到F的转换的C类; C必须在某处.
  • 永远不可能用你自己的一个替换内置的隐式转换; 例如,当您从C转换为对象时,您无法发生特殊行为.
  • 用户定义的隐式转换将与最多两个内置隐式转换"链接",但不与任何其他用户定义的转换一起使用.因此,例如,如果您有一个用户定义的从C到D的隐式转换,以及从D到IFoo的内置隐式转换,那么您将获得从C到IFoo的隐式转换.但是如果D有一个用户定义的隐式转换为E,那么你就不会免费获得从C到E的隐式转换.