C# 如何强制转换a类型的泛型对象<;T>;到A<;T'>;?
我有一个类型为C# 如何强制转换a类型的泛型对象<;T>;到A<;T'>;?,c#,.net,generics,casting,C#,.net,Generics,Casting,我有一个类型为MyClass的对象,我需要将其转换为MyClass,因为我知道它包含int 如果我只是尝试执行强制转换,则不会编译: MyClass<object> a = new MyClass<object>(); MyClass<int> b = (MyClass<int>) a; MyClass a=新的MyClass(); MyClass b=(MyClass)a; 有什么问题,怎么做?您可以使用隐式强制转换运算符 class MyC
MyClass
的对象,我需要将其转换为MyClass
,因为我知道它包含int
如果我只是尝试执行强制转换,则不会编译:
MyClass<object> a = new MyClass<object>();
MyClass<int> b = (MyClass<int>) a;
MyClass a=新的MyClass();
MyClass b=(MyClass)a;
有什么问题,怎么做?您可以使用
隐式强制转换运算符
class MyClass<T>
{
public static implicit operator MyClass<T>(MyClass<object> input)
{
return null;
}
}
这意味着您仍然可以使用原始强制转换,但这将变得无效
//will not compile now !
MyClass<object> a = new MyClass<object>();
MyClass<int> b = a;
//现在不会编译!
MyClass a=新的MyClass();
MyClass b=a;
你不能,因为它们都不是另一个的超类。你不能,因为它们都不是另一个的超类。如果两种类型,T1
和T2
有继承关系,这并不意味着泛型类型G
和G
具有相同的继承关系(通常忽略一些协方差/逆变问题),那么您是否可以发布更多的代码来了解您为什么需要此类型,铸造不适用。同意:这是不可能的。如果尝试将var b=a作为MyClass,则会出现一个更具描述性的错误:“无法通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换将类型“MyClass”转换为“MyClass{int>”隐式
强制转换意味着您不必显式地强制转换:)。确切地说,移除MyClass
@YuvalItzchakov,强制转换代码仅用于参考,以匹配原始问题输入。创建显式
强制转换时,不要使用隐式
强制转换运算符。我不建议使用隐式
强制转换运算符。此相反有指导原则的cts,因为从对象
强制转换到任何T
可能会导致数据丢失/异常。@YuvalItzchakov i添加了显式强制转换的外观示例
class MyClass<T>
{
public static explicit operator MyClass<T>(MyClass<object> input)
{
return null;
}
}
//will not compile now !
MyClass<object> a = new MyClass<object>();
MyClass<int> b = a;