考虑:
// the ratioale for Wrapper is that it has a Json serializer that
// serialize through Field (not included in this example)
record Wrapper<T> where T : notnull {
protected Wrapper(T field) => Field = field;
protected Wrapper(Wrapper<T> wrapper) => Field = wrapper.Field;
protected readonly T Field;
public override string ToString() => Field.ToString() ?? "";
}
record MyRec : Wrapper<string> {
public MyRec(string s) : base(s) {}
}
public static class Program {
public static void Main(string[] args) {
var r = new MyRec("hello");
Console.WriteLine(r.ToString());
}
}
sharplab https://sharplab.io/#v2:EYLgtghgzgLgpgJwD4AEBMBGAsAKFwOwjDigAcIBjOAAhQwDoAlAV3xgEtj6BhAezFLsANogDKiAG7sqUXAG9c1JbQDMtNNQCSUAKIAPeAkJDN+djDkBfXNbx2A9PeowAFuyjUX0ahGpk4FOwQQn6IwuwAXojOXjChCEFCkTSuCLzMAOYu1ABi7HBCACa4jtQAFPi8cez4FELMhXCF1DUx7tRwekSkIgCUuAgBvAjNAOoIEKSkiAA8ACoAfNQA7i6INHPUINSVMPjMQiEKOEqkafAU8GMTU4hlmwBm+UW91AC8S3kFzW/UT98AbmoimoZyqASu1HGk2mCDK0NuCHmS2WN1hrw+uWePxWaMQ9C+RQBILBF0hgwghV4+CEAE9qJtCYViSdVNReBJEAlGrQMAAGBm8UQwBL4DJlDGfbH0OZCkU1cWvAD8SuoACI1SzbAMhiNqABZWmMAJbKF4pF0PlLY7KNmG40UMqWvyvbbAaBwMpQV5WGy4XDoNQ2tl0ABstAALAaIDUnfyANoAXR8CAy3uowdtEggCGoud++DgywNRoCZTVa0OvDVvRZtqUdAAnGUEDK5aLFbWQbZtXYgA==
看起来像基地ToString
不是继承的,编译器仍然自动生成派生的Tostring
这是为什么 ?有什么好的办法吗?
有一条评论为我解决了这个问题。肖恩说如果你添加sealed
该方法阻止编译器合成ToString
方法见下:
public sealed override string ToString() => Value;
请注意,密封覆盖的能力ToString
was 在 C# 10 中引入。 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#record-types-can-seal-tostring
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)