gpt4 book ai didi

C#创建从基类继承的泛型类的实例

转载 作者:太空狗 更新时间:2023-10-29 23:20:59 26 4
gpt4 key购买 nike

我正在尝试创建类 Bar 的实例,但我收到错误:

"Cannot implicitly convert type ConsoleApplication1.Bar to ConsoleApplication1.BaseFoo<ConsoleApplication1.baseOutput,
ConsoleApplication1.baseInput>
"

知道我遗漏了什么或做错了什么吗?任何建议都会很好。

public class baseOutput
{
public string output;
}

public class baseInput
{
public string input;
}

public class ExtendOutput : baseOutput
{
public long id;
}

public class ExtendInput : baseInput
{
public long id;
}

public class BaseFoo<baseOutput, baseInput>
{
protected virtual void DoSmth()
{

}
}

public class Bar : BaseFoo<ExtendOutput, ExtendInput>
{
protected override void DoSmth()
{
base.DoSmth();
}
}

public class Test
{
public void Show()
{

}

private BaseFoo<baseOutput, baseInput> CreateInstance()
{
return new Bar(); // Error right here
}
}

最佳答案

我会给你一个例子,说明为什么你不能这样做。

想象一下,你的类是这样写的:

public class BaseFoo<TOutput, TInput>
where TOutput : BaseOutput
{
public TOutput Something { get; set; }
}

public class Bar : BaseFoo<ExtendOutput, ExtendInput>
{

}

public class BaseInput { }
public class BaseOutput { }
public class ExtendOutput : BaseOutput { }
public class SomethingElse : BaseOutput { }

现在,你有了这个方法:

private BaseFoo<BaseOutput, BaseInput> CreateInstance()
{
//At this point, Something will be of type ExtendOutput.
return new Bar();
}

所以,我们这样调用它:

var myBar = CreateInstance();

现在,mybar.SomethingBaseOutput 类型。不过这很好,因为 ExtendOutput : BaseOutput,对吗?不完全是。

当我们这样做时会发生什么:

myBar.Something = new SomethingElse();

这是有效的,因为 Something 需要一个 BaseOutput,而 SomethingElse 是一个 BaseOutput但是,该对象实际上是一个Bar,它明确表示它应该是一个ExtendOutput

如果我们尝试将其倒转,问题会更清楚:

var myBaseFoo = CreateInstance();
myBaseFoo.Something = new SomethingElse();
Bar myBar = (Bar)myBaseFoo;
myBar.Something; // Here, we're told it's going to be an `ExtendOutput`,
// but we get a `SomethingElse`?

这显然是错误的。 这就是为什么你无法做你想做的事。您可以使用 covariance 来实现此行为.

协变使得传入 TOutput 是非法的。所以,这一行

public TOutput Something { get; set; }

将无效。我们只被允许公开 getter:

public TOutput Something { get; }

从而缓解了上述问题

关于C#创建从基类继承的泛型类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37497098/

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