C# 在C中如何将泛型对象分配给非泛型引用#

C# 在C中如何将泛型对象分配给非泛型引用#,c#,generics,C#,Generics,我是一个Java爱好者,试图用C实现一些代码。我做了一个小时的研究,但什么也没找到。 我有一个我声明为泛型的接口,称为 interface TypeSerializer<T> 这段代码不会编译,但是在Java中会编译类似的代码 我也试过了 TypeSerializer<Object>[] serializers = new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSer

我是一个Java爱好者,试图用C实现一些代码。我做了一个小时的研究,但什么也没找到。 我有一个我声明为泛型的接口,称为

interface TypeSerializer<T>
这段代码不会编译,但是在Java中会编译类似的代码

我也试过了

TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()};
TypeSerializer[]序列化程序=
新的TypeSerializer[2]{new ByteArraySerializer(),new StringSerializer()};
还是不行

在不知道泛型类型的情况下,如何声明此数组并访问实例

编辑

根据下面的答案,很明显我应该有两个接口;有无泛型。 下面是接口方法。请你也说明一下如何实施它们

public interface ITypeSerializer<T>:TypeSerializer
{
    void write(BinaryWriter writer, T obj);
    T read(BinaryReader reader);
}
公共接口ITypeSerializer:TypeSerializer
{
无效写入(二进制写入程序,T obj);
T读取(二进制读取器);
}

您可以创建泛型版本继承的接口的非泛型版本,这会像往常一样强制实现类

interface ITypeSerializer { }
interface ITypeSerializer<T> : ITypeSerializer { }
class StringSerializer : ITypeSerializer<string> { } // implements ITypeSerializer, too 

// non-generic array
ITypeSerializer[] serializers = ...
在实现
ITypeSerializer
时,还需要为
ITypeSerializer
方法提供实现。一种常见的模式是隐式实现泛型,显式实现非泛型,这样非泛型方法只有在通过接口引用类时才可见

class StringSerializer : ITypeSerializer<string>
{
    // implicit implementation of ITypeSerializer<string>
    public void Write(BinaryWriter writer, string obj)
    {
        // provide core implementation here
    }

    public string Read(BinaryReader reader)
    {
        // provide core implementation here
    }

    // explicit implementation of ITypeSerializer
    void ITypeSerializer.Write(BinaryWriter writer, object obj)
    {
        if (!(obj is string)) throw new ArgumentException("obj");

        this.Write(writer, (string)obj);
    }

    object ITypeSerializer.Read(BinaryReader reader)
    {
        return this.Read(reader);
    }
}
类StringSerializer:ITypeSerializer
{
//ITypeSerializer的隐式实现
public void Write(二进制writer,string obj)
{
//在这里提供核心实现
}
公共字符串读取(二进制读取器)
{
//在这里提供核心实现
}
//ITypeSerializer的显式实现
void ITypeSerializer.Write(BinaryWriter编写器,对象obj)
{
如果(!(obj是字符串))抛出新的ArgumentException(“obj”);
这个.Write(writer,(string)obj);
}
对象ITypeSerializer.Read(二进制读取器)
{
返回此。读取(读卡器);
}
}

请注意,非泛型方法是如何简单地传递给泛型方法的。

这应该可以做到:

interface ITypeSerializer { }
interface ITypeSerializer<T> : ITypeSerializer { }
接口ITypeSerializer{}
接口ITypeSerializer:ITypeSerializer{}

请注意,命名以大写字母
I

开头的接口是C#惯例。如果您不知道泛型类型,那么使用泛型接口并不理想。我很想使用:

interface ITypeSerializer {...}
使用与
对象
一起工作的API。在大多数情况下,这不会出现问题,因为您很可能正在序列化类(因此没有装箱)。偶尔的演员阵容不是问题


如果你真的想要,你可以有一个双重的通用/非通用API,但除非你需要它,否则这可能是过分的(有人说,他花了很多时间来处理几乎完全相同的场景)。

你的接口可以这样声明:

TypeSerializer[] serializers = 
new TypeSerializer[2] {new ByteArraySerializer(), new StringSerializer()};
interface TypeSerializer<out T>
接口类型序列化程序
“out”使您可以使用C#的通用方差特性,并且您可以编译您尝试的第二种形式:

TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()};
TypeSerializer[]序列化程序=
新的TypeSerializer[2]{new ByteArraySerializer(),new StringSerializer()};

这将在C#4.0及更高版本中起作用

欢迎来到C#的光明世界@史蒂文:谢谢,在这个光明的世界里,我遇到了一些麻烦:)我用的是单声道,所以这没用?没有编译。有我应该使用的名称空间吗?嗯,不确定。我认为Mono对C#4.0功能有一定的支持,但不能具体说明它是否有这个功能。你能演示一下如何实现它吗?我更新了问题。非常感谢。
interface ITypeSerializer {...}
interface TypeSerializer<out T>
TypeSerializer<Object>[] serializers = 
new TypeSerializer<Object>[2] {new ByteArraySerializer(), new StringSerializer()};