我一直在询问我的想法might be solutions,但是有人指出我陷入了XY问题,我应该问一下我的确切问题。
我有一个结构,我希望其他人能够在自己的程序中使用。它需要可以从其他现有类型隐式转换为此类型,但同时在分配后需要保留一些信息。这是一个简单的问题示例:
using System;
public struct MyStruct {
public string SomethingImportant;
public MyStruct(string s) {
SomethingImportant = s;
}
//this function needs to have no knowledge of how/where the struct is being used
public bool SomeFunction(string s) {
return s == SomethingImportant;
}
public static implicit operator MyStruct(double x) {
return new MyStruct();
}
}
public class MyClass {
MyStruct child = new MyStruct("important");
public MyClass() {
//prints out "important"
Console.WriteLine(child.SomethingImportant);
child = 7.5;
//prints out ""
Console.WriteLine(child.SomethingImportant);
}
}
在使用隐式转换中的新结构替换结构后,SomethingImportant
中存储的信息将丢失。这将是重载赋值运算符的自然位置,但不幸的是,这在c#中是不可能的。
我的想法转向了属性,因为在初始声明对象之后不需要修改额外的信息,如果持久性被限制在类的字段中,那么它将是最可接受的。看起来这不是一个可行的选择,因为结构不能访问与之关联的属性,除非它知道它所在的类型。
有没有办法在c#中像这样远程完成某些事情?我知道添加像MyStruct.Update(double x)
这样的显式更新函数会产生所需的行为,但是,根据库的运行方式,这对用户来说在重写大量现有代码方面会是一个巨大的负担。我宁愿在我自己的代码中做一些混乱,不安全或模糊的事情,而不是需要为图书馆用户进行如此多的重写。
感谢您的任何想法!
答案 0 :(得分:0)
我说这根本不可能,因为"重要的事情"并非所有MyStruct
个实例都相等(在这种情况下,简单的解决方案是使static
)。
隐式转换会创建一个新对象,该对象无法知道它分配给哪个变量,即使它根本没有分配。因此,您无法访问该变量中的任何数据。
也许您对属性的想法值得追求,也就是说,在类层次结构中将标记移动一级。
为了澄清我的观点,这个的预期结果是什么:
public class MyClass
{
public MyClass()
{
MyStruct child1 = new MyStruct( "abc" );
// should print "abc"
Console.WriteLine(child1.SomethingImportant);
MyStruct child2 = 7.5;
// should print out what?
Console.WriteLine(child2.SomethingImportant);
MyStruct child3 = new MyStruct( "cde" );
child3 = 5.7;
// will never, ever print "cde" (if not static)
Console.WriteLine(child2.SomethingImportant);
}
}
但这会奏效:
public MyOtherClass
{
public MyStruct TheChild;
public string SomethingImportantAssociatedToTheChild;
}
[...]
MyOtherClass a;
a.SomethingImportantAssociatedToTheChild = "abc";
a.TheChild = 7.5;