上下文:我是c#的新手,我必须生成c#代码(我正在使用OCaml)。我在SO上调查过类似的问题,但无济于事,这就是我在这里问的原因。
我有一个命名空间Types定义基本类型,例如:
public class Address{
private string _value;
public Address(string addr){
_value = addr;
}
public static implicit operator string(Address a) => a._value;
public static implicit operator Address(string s) => new Address(s);
}
我正在生成c#代码,我想在其中定义"别名"。与某些外部接口交互的类型。例如,在我的代码生成的一个这样的接口中,我有一个类型ConstructorOperator
,它实际上是Types.Address
的别名。现在,我用这种方式生成它:
public class Constructor_operator : Types.Address {
public Constructor_operator(Types.Address v) : base(v) {}
public static implicit operator string(Constructor_operator a) => (string) (Types.Address) a;
public static implicit operator Constructor_operator(string a) => (Constructor_operator) (Types.Address) a;
}
然而,一个问题是我不断需要将类Types.Address
的元素转换为类型Constructor_operator
,这就是当我遇到运行时错误时,例如,
public static Constructor_operator _operatorGenerator(){
return (Constructor_operator)Types.AddressGenerator ();}
当调用时,生成错误:
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'Address' to type 'generatedinterface.Constructor_operator'.
at generatedinterface.Functions._operatorGenerator() in ~/test_csharp/src/csharp_sdk/generatedinterface_csharp_interface.cs:line 422
at FactoriTypes.Types.OptionGenerator[T](Func`1 generator) in ~/test_csharp/src/csharp_sdk/factori_types.cs:line 1720
at generatedinterface.Functions.storageGenerator() in ~/test_csharp/src/csharp_sdk/generatedinterface_csharp_interface.cs:line 1914
at Program.<<Main>$>g__main|0_0() in ~/test_csharp/src/csharp_sdk/Program.cs:line 11
at Program.<Main>$(String[] args) in ~/test_csharp/src/csharp_sdk/Program.cs:line 15
我知道我不能这样做的一般原因是你不能将一个类强制转换为它的子类。然而,(至少在我的意图中)子类实际上与基类相同。在任何情况下,有没有人知道我如何才能成功地将Address
转换为ConstructorOperator
?
在c#中不能将基对象强制转换为子对象。
下面的将抛出异常:
Constructor_operator con = (Constructor_operator)new Address("address");
这是因为我们试图将Address
类型对象强制转换为具有比现有信息更多信息的类型(Constructor_operator
)。
可以将被视为基类型的对象强制转换回其原始类型。
下面将不抛出异常:
Address add = new Constructor_operator(new Address("address"));
Constructor_operator con = (Constructor_operator)add;
这是因为add
实际上是Constructor_operator
类型,并且已经拥有了我们将其视为Constructor_operator
所需的所有信息