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;