在这种情况下,您能帮我理解错误吗?
public interface IGeneralInterface
{
}
public class A : IGeneralInterface
{
}
public class B : IGeneralInterface
{
}
public class SomeClass<TGenericType> where TGenericType : IGeneralInterface
{
private TGenericType internalValue;
public SomeClass(TGenericType InitValue)
{
internalValue = InitValue;
}
public TGenericType CreateAnother()
{
TGenericType val1 = new B(); //Error here: class B() could not be converted to TGenericType
return val1;
}
}
即使我将
SomeClass<T>
构建为SomeClass<IGeneralInterface> someClass = new SomeClass<IGeneralInterface>();
我显式地传递基本接口以包含所有(?)情况,但仍会引发错误
最佳答案
更改
TGenericType val1 = new B(); //Error here: class B() could not be converted to TGenericType
至
IGeneralInterface val1 = new B();
您正在尝试将TypeCast
IGeneralInterface
更改为TGenericType
,这是导致错误的原因。TGenericType
可能还有其他约束,例如它是从ISpecificInterface
继承的,而B
不会继承。在这种情况下,分配将变得无效。例:
public class SomeClass< TGenericType> where TGenericType : IGeneralInterface, ISpecificInterface
TGenericType val1 = new B(); // TGenericType should be ISpecificInterface also, B is not.
对于以上运行。
IGenericInterface
应该总是比TGenericType
更具体。 public class SomeClass <IGenericInterface>
或者,您可以使用
is
关键字找出对象是否可分配给TGenericType
,然后使用强制转换。TGenericType val1 = default(TGenericType);
var val = new B();
if ( val is TGenericType)
{
val1 = (TGenericType)val;
}
编辑以下评论
在运行时如何可能会有其他要求?我放在这里列出的编译器中的所有内容
CreateAnother()
创建非通用类型B
的实例。请看下面的例子
SomeClass<C> c = new SomeClass<C();
C another = c.CreateAnother(); // C is not assignable from B. (C is below). But It would be valid, if compiler did not flag the error
public class C : IGeneralInterface, IDisposable
{
}