gpt4 book ai didi

c# - 派生类型中的 `Activator.CreateInstance` 和 `new` 属性

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:18 25 4
gpt4 key购买 nike

我有以下类(class):

public class HeaderBase
{
public int HeaderSize { get { return sizeof(byte); } }
public byte[] Content { get; private set; }

public HeaderBase(byte[] bytes)
{
Content = bytes;
}
}

public class BiggerHeader : HeaderBase
{
public new int HeaderSize { get { return sizeof(byte) + sizeof(UInt32); } }

public BiggerHeader(HeaderBase header) : base(header.Content)
{ }
}

我还有一个模板化方法来编码和实例化 BiggerHeader类型

public static T Get<T>() where T : HeaderBase
{
HeaderBase b = new HeaderBase(new byte[]{});
T instance = (T)Activator.CreateInstance(typeof(T), b);
return instance;
}

根据 MSDN :

where T : <base class name>: The type argument must be or derive from the specified base class.

但是,HeaderSize的值是 1 而不是我预期的 5。为什么会这样,我如何实例化一个将使用 new 的对象?来自派生类型的属性?

DotNetFiddle

相关:Generics in C# - how can I create an instance of a variable type with an argument?

最佳答案

new 成员与基本成员同名,但在其他方面不相关。看起来您想在基类中使用 virtual 并在派生类中使用 override

使用 new,您基本上消除了警告您的警告。 new 没有任何功能影响。

对 T 的调用被解析为就好像 THeaderBase。其他任何事情都需要运行时根据您调用的名称在运行时执行动态绑定(bind)。想象一下 T t; t.Xyz();。该代码无法编译,因为未静态找到 Xyz。但是你在做同样的事情!在编译该方法时,没有可见的 Derived.HeaderSize,因为我们不知道 T 将被 Derived。它最终可能会变成别的东西。这就是调用静态绑定(bind)到 Base.HS 的原因。 B.HSD.HS 同名这一事实没有任何意义。这是一个巧合。

关于c# - 派生类型中的 `Activator.CreateInstance` 和 `new` 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745257/

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