首页 > 解决方案 > 为所有可转换类型定义通用转换

问题描述

我有以下通用类:

public class InclusionData<T>
{
    public T ThisObject { get; private set; }
    public T CopiedFromObject { get; private set; }
    public object OverwrittenOriginal { get; private set; }

    internal InclusionData(T thisObj, T copiedFromObj, object ovrwrtnOrgnl)
    {
        ThisObject = thisObj;
        CopiedFromObject = copiedFromObj;
        OverwrittenOriginal = ovrwrtnOrgnl;
    }
}

我希望这个类可以转换为任何InclusionData<S>可转换TS. 我怎么做?

(*不需要是显式/隐式强制转换,只需以某种方式放入InclusionData<T>和取出InclusionData<S>具有相同内容的 an。)

我试图在内部定义一个铸造方法,InclusionData如下所示:

public InclusionData<S> Cast<S>() where T : S
{
    return new InclusionData<S>((S)ThisObject, (S)CopiedFromObject, OverwrittenOriginal);
}

但它给出了编译器错误:

所以看起来,虽然T已经是一个类型参数,但我无法定义S使用的约束T。那么我如何指定S必须可以转换为T

标签: c#genericscastingtype-conversion

解决方案


这是不可能的:

public InclusionData<S> Cast<S>() where T : S

因为 T 是具有约束的类型,但 T 没有在方法级别定义。它是在类级别定义的。例如,这是可能的

public InclusionData<S> Cast<S>() where S : T

S(在方法级别定义的类型)将具有成为 T(在类级别定义)的子级的约束。

在所有其他编译错误消失之后,但我不知道这是否是您想要实现的目标?


推荐阅读