gpt4 book ai didi

c# - 转换类型不起作用

转载 作者:行者123 更新时间:2023-11-30 16:15:49 27 4
gpt4 key购买 nike

我有以下类(class):

// abstract
abstract class Module
{
public Options Params;
}

abstract class Options { }

// implementation
class MyModule : Module
{
public new MyOptions Params = new MyOptions();
}

class MyOptions : Options
{
public string Param1;
}

和代码:

var MyMod = new MyModule();
MyMod.Params.Param1 = "new value"; // ok

// convert
Module Mod = MyMod; // if use MyModule Mod - ok
if (Mod.Params as MyOptions != null)
{
MessageBox.Show("cast OK"); // not execute
}

Modules 可以有不同的类型(我不知道它们),但它总是继承自 Module。我需要确定字段 Params 是否是实例(或实现)MyOptions 并获取值(如果为真)。我会对任何决定感到满意。

最佳答案

您正在使用 new 关键字隐藏 Options 字段,因此它只能在从 MyModule 调用时访问。

Module.ParamsMyModule.Params 之间没有任何联系,即使运行时知道 Mod 是一个 MyModule,它仍然从 Module.Params 中获取值,该值是 null

参见 Knowing When to Use Override and New Keywords

如果你想要真正的继承,你需要使用虚拟方法(或者在这种情况下,虚拟属性):

abstract class Module
{
public abstract Options Params { get; set; }
}

class MyModule : Module
{
private Options myParams = new MyOptions();
public override Options Params
{
get { return myParams; }
set { myParams = value; }
}
}

var MyMod = new MyModule();
(MyMod.Params as MyOptions).Param1 = "new value";

Module Mod = MyMod;
if (Mod.Params as MyOptions != null)
{
Console.WriteLine("cast OK");
}

关于c# - 转换类型不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19156185/

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