【发布时间】:2018-10-16 09:20:08
【问题描述】:
我正在寻找一种将对象转换为简单接口和从简单接口派生的通用接口的方法。
这是我的例子:
interface INonGeneric
{
}
interface IGeneric<T> : INonGeneric where T : ITypeParameter
{
T Build();
}
interface ITypeParameter
{
}
class TypeClass : ITypeParameter
{
}
这就是我尝试使用的设计。如果我对泛型的理解有缺陷(我想确实如此),那么这个错误对你来说应该是显而易见的。
然后我创建我想使用的类:
class MyClass : MyClassBase<TypeClass>
{
public override TypeClass Build()
{
return new TypeClass();
}
}
abstract class MyClassBase<T> : IGeneric<T> where T : ITypeParameter
{
public abstract T Build();
}
然后我尝试像这样投射它们:
void Main()
{
var myClass = new MyClass();
var cast1 = myClass as INonGeneric;
if(cast1 != null) Console.WriteLine("cast 1 works!"); //THIS WORKS
var cast2 = TestCast<ITypeParameter>(myClass);
if(cast2 != null) Console.WriteLine("cast 2 works!"); //THIS DOES NOT WORK
}
任何帮助将不胜感激。
编辑:抱歉,我忘了输入 TestCast 方法。这里是:
IGeneric<T> TestCast<T>(INonGeneric obj) where T : ITypeParameter
{
return obj as IGeneric<T>;
}
【问题讨论】:
-
我明白了,所以这一定意味着我需要将其更改为: class MyClass : MyClassBase
{ public override ITypeParameter Build() { return new TypeClass(); } } -
看看Covariance。如果您将接口定义更改为
interface IGeneric<out T>,那么您将能够使用所需的演员表。 -
是的,泛型中的
out关键字可以让编译器知道接口中的类型T是协变的(之后就可以进行这样的转换)
标签: c# generics types parameters casting