gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:57:22 25 4
gpt4 key购买 nike

对于以下通用 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;
}
}

如果我要实现直接运算符隐式运算符 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);

我真的想尽可能避免显式转换。

这个问题延伸到 another SO question我以前提出过。

最佳答案

实现您自己的隐式转换逻辑的规则非常严格,如果您要执行像这样特别复杂的操作,您可能应该非常熟悉规范的第 6.4.4 节和第 10.10.3 节。

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

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

关于c# - 在通用 C# 类中链接隐式运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com