gpt4 book ai didi

c# - 当前类的类型可以作为泛型类型参数的值吗?

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

可以使用 C# 完成类似的事情吗?

public abstract class BaseClass
{
public abstract IInterface<T> CreateEditor() where T: the_actual_type_of_this_instance;
}

示例用法:

var instance = new DerivedClass();
var editor = instance.CreateEditor(); // IInterface<DerivedClass>

最佳答案

不,你不能那样做——部分原因是它在编译时没有意义。考虑对您的代码进行轻微更改:

BaseClass instance = new DerivedClass();
var editor = instance.CreateEditor();

编译器可以推断出 editor 的类型是什么?成为?它只知道 BaseClass , 所以它必须返回 IInterface<BaseClass> .视与否TIInterface<T>是协变的,这对于实际实现的东西可能是有效的IInterface<DerivedClass>也可能不是。

您可能希望将您的基类设为泛型:

public abstract class BaseClass<T> where T : BaseClass<T>
{
public abstract IInterface<T> CreateEditor();
}

public class DerivedClass : BaseClass<DerivedClass>
{
...
}

这有两个问题:

  • 当你深入一层以上时,它就不起作用了;如果你需要 DerivedClass 的子类, 你会有问题
  • 它不会阻止恶意模式的滥用,例如public class NastyClass : BaseClass<DerivedClass>

...但在很多情况下还是很实用的。

关于c# - 当前类的类型可以作为泛型类型参数的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603351/

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