是否可以将C#泛型方法类型参数约束为"可从"包含类的类型参数"赋值"?

Chr*_*ain 9 c# generics type-constraints

我怀疑答案是否定的,但我想知道是否有可能做到这样的事情:

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

我在上面(非工作)示例中表示的意思是约束TSomeInterface,使得它可以是任何基类,实现的接口,或者(如果你真的想要得到幻想)隐式转换MyGenericClass.

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

到目前为止,我已经将它们整合在一起:

public class MyGenericClass<TSomeClass> {
    public void MyGenericMethod<TIntermediateType, TSomeInterface>() 
        where TIntermediateType : TSomeClass, TSomeInterface 
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var myGenericInstance = new MyGenericClass<TSomeClass>();
myGenericInstance.MyGenericMethod(TSomeClass, TSomeInterface);
Run Code Online (Sandbox Code Playgroud)

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

我想这样做的原因是,我写了一个WCF服务一口流利的工厂模式,我会,以防止来电(在编译时)从试图创建与该服务类没有按"合同端点实施.我显然可以在运行时检查这个(WCF实际上是为我做的),但我是编译时检查的忠实粉丝.

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

ken*_*ken 3

我能够理解为什么它不能编译的原因如下:

考虑这个程序的编译:

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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