具有接口泛型方法实现的基元类型的编译错误

Compilation error with primitives types with implementations of generic methods of an interface

我想编写一个允许自由实现的接口。基本上我不知道 return 类型既不是方法的参数类型。我只希望派生 classes 以相同的方法名称和参数编号实现此合同。

所以我可以这样做:

public interface IImageRecognitionEngine<TFoo0, TFoo1, TFoo2, TFoo3>
{
    TFoo0 Learn(TFoo1 param);
    TFoo2 Recognize(TFoo3 param);
}

public class FooImageRecognitionEngine : IImageRecognitionEngine<byte[], string, List<double>, string>
{
    public byte[] Learn(string param)
    {
        throw new NotImplementedException();
    }

    public List<double> Recognize(string param)
    {
        throw new NotImplementedException();
    }
}

但我更喜欢泛型方法而不是整个接口。但是我不明白为什么我可以这样做:

public interface IImageRecognitionEngine2
{
    TFoo0 Learn<TFoo0, TFoo1>(TFoo1 param);
    TFoo2 Recognize<TFoo2, TFoo3>(TFoo3 param);
}

public class FooExampleClass
{

}

public class FooExampleClass2
{

}

public class Foo1ImageRecognitionEngine2 : IImageRecognitionEngine2
{
    public FooExampleClass Learn<FooExampleClass, FooExampleClass2>(FooExampleClass2 param)
    {
        throw new NotImplementedException();
    }

    public FooExampleClass Recognize<FooExampleClass, FooExampleClass2>(FooExampleClass2 param)
    {
        throw new NotImplementedException();
    }
}

但是对于基本类型,编译器给我错误:

public class Foo2ImageRecognitionEngine2 : IImageRecognitionEngine2
{
    public byte[] Learn<byte[], string>(string param)
    {
        throw new NotImplementedException();
    }

    public List<double> Recognize<List<double>, string>(string param)
    {
        throw new NotImplementedException();
    }
}

我不想在实例化 class 实现的对象时选择要使用的类型。例如,我不想编写这样的实现:

public class Foo2ImageRecognitionEngine2 : IImageRecognitionEngine2
{
    public TFoo0 Learn<TFoo0, TFoo1>(TFoo1 param)
    {
        throw new NotImplementedException();
    }

    public TFoo2 Recognize<TFoo2, TFoo3>(TFoo3 param)
    {
        throw new NotImplementedException();
    }
}

并且能够做到这一点:

var fooEngine = new Foo2ImageRecognitionEngine2();
fooEngine.Learn<string, int>(52);

这也行不通:

public interface IImageRecognitionEngine3
{
    object Learn(object param);
    object Recognize(object param);
}

public class Foo1ImageRecognitionEngine3 : IImageRecognitionEngine3
{
    public byte[] Learn(string param)
    {
        throw new NotImplementedException();
    }

    public List<double> Recognize(string param)
    {
        throw new NotImplementedException();
    }
}

谢谢

public FooExampleClass Learn<FooExampleClass, FooExampleClass2>(FooExampleClass2 param)
{
    throw new NotImplementedException();
}

并没有按照您的想法行事 - FooExampleClassFooExampleClass2 不是类型,而是可以实例化为任何 class 的类型参数。这意味着客户可以这样做:

var e = new Foo1ImageRecognitionEngine2();
e.Learn<string, object>(new object());

您的代码似乎有效,因为它什么也没做。

像这样的通用方法必须适用于客户端选择的任何参数,因此无法限制参数适用于特定参数。如果您想这样做,您需要将它们移动到第一个示例中的接口定义中。