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