具有多种类型的C#通用类型推断

Ada*_*ger 3 .net c# generics

我有以下通用方法将一种类型的输入对象序列化为超类型,如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

我必须调用此方法指定两种泛型类型,如下所示:

MySubType x = new MySubType();
string json = SerialiseAs<MySuperType, MySubType>(x);
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么不能TInput在这种情况下推断?是因为TResult实际上并没有用作返回类型吗?以下代码更清晰,但由于缺少输入类型而无法编译:

MySubType x = new MySubType();
string json = SerialiseAs<MySuperType>(x);
Run Code Online (Sandbox Code Playgroud)

Vil*_*lx- 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();
}
Run Code Online (Sandbox Code Playgroud)

既然TInput源自TResult,你真的根本不需要指定.


Jon*_*eet 6

我的问题是,为什么不能在这种情况下推断TInput?

它可以 - 它是TResult无法推断的,并且没有办法指定"部分"推理.

可以有时做的是单独的类型参数为药粥一个通用的通用和个方法,让你结了:

// Explicitly state TResult, and infer TInput
Serializer<MySuperType>.Serialize(x);
Run Code Online (Sandbox Code Playgroud)