【发布时间】:2021-05-30 18:54:29
【问题描述】:
我有以下通用类:
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>,其中T 可以转换为S。我该怎么做?
(*不需要是显式/隐式转换,只需某种方式放入 InclusionData<T> 并取出具有相同内容的 InclusionData<S>。)
我尝试在InclusionData 中定义一个转换方法,如下所示:
public InclusionData<S> Cast<S>() where T : S
{
return new InclusionData<S>((S)ThisObject, (S)CopiedFromObject, OverwrittenOriginal);
}
但它给出了编译器错误:
-
where T : S中的T标记为红色,表示'InclusionData<T>.Cast<S>()' does not define type parameter 'T' -
(S)ThisObject和其他两个演员被标记为红色,说cannot convert type 'T' to 'S'
看来,虽然T 已经是一个类型参数,但我无法使用T 对S 定义约束。那么如何指定S 必须可转换为T?
【问题讨论】:
-
如果你使用一个接口,你可以让它协变
IInclusionData<out T>,然后IInclusionData<Cat>可以直接转换为iInclusionData<Animal>
标签: c# generics casting type-conversion