可以';t强制转换为泛型类型c#

本文关键字:转换 泛型类型 可以 | 更新日期: 2023-09-27 18:26:39

我有以下场景

public class A
{
}
public class BA : A
{
}
//other subtypes of A are defined
public class AFactory
{
    public T Create<T>() where T : A
    {
        //work to calculate condition
        if (condition)
            return new BA();
        //return other subtype of A
    }
}

引发以下编译错误:

错误CS0029无法将类型"B"隐式转换为"T"

怎么了?

可以';t强制转换为泛型类型c#

好吧,转换很容易失败。假设我有:

public class AB : A {}
B b = new B();
AB ab = b.Create<AB>();

这将导致尝试将B引用分配给AB类型的变量。这些是不相容的。

听起来你可能不应该让Create成为一个通用方法。或者也许您应该使A通用:

public abstract class A<T> where T : A
{
    public abstract T Create();
}
public class B : A<B>
{
    public override B Create()
    {
        return new B();
    }
}

这是可行的,但我们不知道你想要实现什么,所以这可能对你没有实际帮助。

或者,可以保留当前的设计,但使用:

public T Create<T>() where T :  A
{
    return (T) (object) new B();
}

如果用objectAB之外的任何类型参数调用Create,这将失败,这对我来说听起来有点奇怪…

T可以是从A派生的任何类。也可能有

class C : A { }

它匹配泛型约束,但不能从Create<C>()方法返回B的实例。

右侧。为了创建新的B类,您应该使用以下代码:

public class A
{
}
public class B : A
{
    public static T Create<T>() where T : A, new()
    {
        return new T();
    }
}
public class Example
{
    public void DoWork()
    {
        B b = B.Create<B>();
        A a = B.Create<A>();
    }
}