繁体   English   中英

具有基本类型的编译错误以及接口的通用方法的实现

[英]Compilation error with primitives types with implementations of generic methods of an interface

我想编写一个允许实现自由的接口。 基本上我不知道方法的返回类型和参数类型。 我只希望派生类使用相同的方法名称和参数编号来实现此协定。

所以我可以这样:

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();
    }
}

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

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不是类型,而是可以实例化到任何类的类型参数。 这意味着客户可以:

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

您的代码似乎只起作用,因为它什么也不做。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM