我有以下通用方法将一种类型的输入对象序列化为超类型,如下所示:
public string SerialiseAs<TResult, TInput>(TInput input) where TInput : TResult
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TResult));
MemoryStream stream = new MemoryStream();
ser.WriteObject(stream, input);
stream.Position = 0;
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
我必须调用此方法指定两种泛型类型,如下所示:
MySubType x = new MySubType();
string json = SerialiseAs<MySuperType, MySubType>(x);
我的问题是,为什么在这种情况下不能推断TInput
?是因为TResult
实际上并没有用作返回类型吗?以下代码更清晰,但由于缺少输入类型而无法编译:
MySubType x = new MySubType();
string json = SerialiseAs<MySuperType>(x);
答案 0 :(得分:7)
为什么不这样写:
public string SerialiseAs<TResult>(TResult input)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TResult));
MemoryStream stream = new MemoryStream();
ser.WriteObject(stream, input);
stream.Position = 0;
StreamReader reader = new StreamReader(stream);
return reader.ReadToEnd();
}
由于TInput
来自TResult
,因此您根本不需要指定。
答案 1 :(得分:6)
我的问题是,为什么不能在这种情况下推断TInput?
它可以 - 它是TResult
无法推断,并且无法指定“部分”推理。
d最终得到:
// Explicitly state TResult, and infer TInput
Serializer<MySuperType>.Serialize(x);