对于以下通用 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;
}
}
如果我要实现直接运算符implicit operator K(T val)
这会导致编译时错误 (CS0556)。
我想我可以尝试链接隐式运算符:
public static implicit operator K(ValueType<T,K> vt){
return (K)val;
}
但下面的例子仍然抱怨它无法转换:
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);
如果可能的话,我真的想避免显式强制转换。
这个问题延伸至另一个问题 https://stackoverflow.com/questions/5949390我之前提过。
实现您自己的隐式转换逻辑的规则非常严格,如果您要执行像这样的特别复杂的操作,您可能应该非常熟悉规范的第 6.4.4 节和 10.10.3 节。
简而言之,您应该了解的一些关键规则是:
- 您定义转换的类型必须出现在用户定义转换的“to”或“from”部分中。你不能创建一个类 C 来定义从 E 到 F 的转换; C 一定在某个地方。
- 永远不可能用您自己的隐式转换来替换内置的隐式转换;例如,当从 C 转换为对象时,您不能使特殊行为发生。
- 用户定义的隐式转换将与最多两个内置隐式转换“链接”,但不会与任何其他用户定义的转换“链接”。例如,如果您有一个从 C 到 D 的用户定义隐式转换,以及一个从 D 到 IFoo 的内置隐式转换,那么您将获得从 C 到 IFoo 的隐式转换。但是,如果 D 有用户定义的到 E 的隐式转换,那么您就无法免费获得从 C 到 E 的隐式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)