c# - 为所有可转换类型定义通用转换
问题描述
我有以下通用类:
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>
具有相同内容的 an。)
我试图在内部定义一个铸造方法,InclusionData
如下所示:
public InclusionData<S> Cast<S>() where T : S
{
return new InclusionData<S>((S)ThisObject, (S)CopiedFromObject, OverwrittenOriginal);
}
但它给出了编译器错误:
- 里面标记为红色,
T
说where T : S
'InclusionData<T>.Cast<S>()' does not define type parameter 'T'
(S)ThisObject
另外两个演员被标记为红色,说cannot convert type 'T' to 'S'
所以看起来,虽然T
已经是一个类型参数,但我无法定义S
使用的约束T
。那么我如何指定S
必须可以转换为T
?
解决方案
这是不可能的:
public InclusionData<S> Cast<S>() where T : S
因为 T 是具有约束的类型,但 T 没有在方法级别定义。它是在类级别定义的。例如,这是可能的
public InclusionData<S> Cast<S>() where S : T
S(在方法级别定义的类型)将具有成为 T(在类级别定义)的子级的约束。
在所有其他编译错误消失之后,但我不知道这是否是您想要实现的目标?
推荐阅读
- vue.js - 如何将整个 VSCode 本身添加到 VueJS webapp 中?
- c++ - C++递减迭代器
- python - 使用“in”查找值是否存在于 Pandas 数据框列中不起作用?
- security - 如何在 Tor 上获取 GET Requests 下列出的地址
- loops - 当我运行 katalon 测试套件集合时,Jenkins 卡住了
- tensorflow - 如何解读 TensorFlow Lite 基准测试应用结果?
- reactjs - 单击单元格时如何删除表格中单元格的轮廓?
- javascript - 邮递员中的表单数据将空正文发送到nodejs
- c++ - 使用 autodiff 包的问题:“致命错误:autodiff/forward/dual.hpp:没有这样的文件或目录”
- python - 如何使用 API 从 SharePoint 中的列表下载附件?