gpt4 book ai didi

c# - 泛型类型参数的多个约束的优先级

转载 作者:太空狗 更新时间:2023-10-29 21:44:36 26 4
gpt4 key购买 nike

在下面的例子中,我有两个约束,FoobarIFoobar<T> , 在泛型类中的类型 T FoobarList<T> .但是编译器报错:Cannot implicitly convert type 'Foobar' to 'T'。存在显式转换(是否缺少强制转换?)

interface IFoobar<T>
{
T CreateFoobar();
}

class Foobar : IFoobar<Foobar>
{
//some foobar stuffs
public Foobar CreateFoobar() { return new Foobar(); }
}

class FoobarList<T> where T : Foobar, IFoobar<T>
{
void Test(T rFoobar)
{
T foobar = rFoobar.CreateFoobar(); //error: cannot convert Foobar to T
}
}

编译器似乎将 CreateFoobar 视为 Foobar 中的一种方法,而不是 IFoobar 中的方法。我可以通过将 Foobar 划分为基类 FoobarBase,并在其派生类中实现接口(interface) IFoobar 来修复编译,如下所示:

interface IFoobar<T>
{
T CreateFoobar();
}

abstract class FoobarBase
{
//some foobar stuffs
}

class Foobar : FoobarBase, IFoobar<Foobar>
{
public Foobar CreateFoobar() { return new Foobar(); }
}

class FoobarList<T> where T : FoobarBase, IFoobar<T>
{
void Test(T rFoobar)
{
T foobar = rFoobar.CreateFoobar();
}
}

把Foobar分成两类比较麻烦。有没有更好的方法来解决这个问题?

最佳答案

刚投rFoobarIFoobar<T> :

T foobar = ((IFoobar<T>)rFoobar).CreateFoobar();

这样你就调用了一个返回 T 的方法而不仅仅是 Foobar .

正如 Rotem 所建议的那样,更改 Foobar 中的方法使用显式接口(interface)实现也可以:

Foobar IFoobar<Foobar>.CreateFoobar() { return new Foobar(); }

这样就不会在T 中找到该方法, 因此它将再次解析为接口(interface)方法。

关于c# - 泛型类型参数的多个约束的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23619675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com