gpt4 book ai didi

c# - 是否可以将 C# 泛型方法类型参数约束为 "assignable from"包含类的类型参数?

转载 作者:太空狗 更新时间:2023-10-29 17:50:59 24 4
gpt4 key购买 nike

我怀疑答案是否定的,但我想知道是否可以这样做:

public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>()
// This doesn't compile.
where TSomeClass : TSomeInterface
{
//...
}
}

在上面的(非工作)示例中,我的意思是要限制 TSomeInterface,使其可以是任何基类、已实现的接口(interface),或者(如果你真的想要花哨的话)MyGenericClass 的隐式转换。

注意:我怀疑这从未在 C# 中实现的原因是通用约束不是真正意味着代码契约,这就是我在这里尝试使用它们的方式。我真的不关心 TSomeInterface 是什么类型,只要它由 TSomeClass 实现即可。

到目前为止,我已经破解了这个:

public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TIntermediateType, TSomeInterface>()
where TIntermediateType : TSomeClass, TSomeInterface
{
//...
}
}

这或多或少地强制执行了我想要的约束(TSomeClass 必须继承自,或者在接口(interface)的情况下,实现 TSomeInterface ),但是调用它非常笨拙,因为我必须指定 TIntermediateType(即使我真的希望它根据 TSomeClass 进行评估):

var myGenericInstance = new MyGenericClass<TSomeClass>();
myGenericInstance.MyGenericMethod(TSomeClass, TSomeInterface);

此外,上面的 hack 被破坏了,因为调用者理论上可以将 TSomeClass 的子类指定为第一个类型参数,其中只有子类实现 TSomeInterface

我想这样做的原因是我正在为 WCF 服务编写流畅的工厂模式,我喜欢阻止调用者(在编译时time) 从尝试创建具有服务类未实现的契约(Contract)的端点。我显然可以在运行时检查它(WCF 实际上为我做了这个),但我是编译时检查的忠实拥护者。

是否有更好/更优雅的方式来实现我在这里的目标?

最佳答案

我能够理解无法编译的原因如下:

考虑这个程序编译:

class Program {
class Class1 { }
class Class2 { }
public class MyGenericClass<TSomeClass> {
public void MyGenericMethod<TSomeInterface>() where TSomeClass : TSomeInterface {
}
}
static void Main(string[] args) {
var inst = new MyGenericClass<Class1>();
}
}

一切都很好。编译器很高兴。现在考虑我更改 Main 方法:

static void Main(string[] args) {
var inst = new MyGenericClass<Class1>();
inst.MyGenericMethod<Class2>();
}

编译器会提示Class1 没有实现Class2。但是哪一行是错误的?约束在对 MyGenericMethod 的调用上,但有问题的代码行是创建 MyGenericClass

换句话说,哪一个得到红色波浪线?

关于c# - 是否可以将 C# 泛型方法类型参数约束为 "assignable from"包含类的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255558/

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