在这种情况下,您能帮我理解错误吗?

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
{
}

10-06 09:55