【发布时间】:2021-06-09 03:39:30
【问题描述】:
我目前的非编译代码是这样的:
public abstract class A { }
public class B { }
public class C : A { }
public interface IFoo<T>
{
void Handle(T item);
}
public class MyFoo<TA> : IFoo<TA>, IFoo<B>
where TA : A
{
public void Handle(TA a) { }
public void Handle(B b) { }
}
C# 编译器拒绝编译它,引用以下规则/错误:
'MyProject.MyFoo
' 不能同时实现 'MyProject.IFoo ' 和 'MyProject.IFoo ' 因为它们可能会统一用于某些类型参数替换
我了解此错误的含义;如果TA 可以是任何东西,那么它在技术上也可以是B,这会在两个不同的Handle 实现上引入歧义。
但 TA 不可能是任何东西。根据类型层次结构,TA 不能 是 B - 至少,我不认为它可以。 TA 必须派生自 A,而 不 派生自 B,显然 C#/.NET 中没有多类继承。
如果我删除泛型参数并将TA 替换为C,甚至A,它会编译。
那么为什么我会收到这个错误?它是编译器的错误还是一般的不智能,还是我还缺少其他东西?
是否有任何解决方法,还是我只需要将MyFoo 泛型类重新实现为每个可能的TA 派生类型的单独非泛型类?
【问题讨论】:
-
我认为 TItem 应该读 TA,不是吗?
-
它不太可能是编译器中的错误。公平地说,错误消息确实使用了“可能统一”这个词,我的猜测是因为你同时使用了这两个接口。
-
编辑:没关系,我认为 B 是一个类型参数。
是什么阻止您将相同的东西传递给类型参数B,因为您传递给TA? -
@JoshEinstein:
B不是类型参数,而是实际类型。唯一的类型参数是TA。 -
@Ramhound 我不明白为什么它“不太可能”成为编译器错误。我看不出其他解释,真的。这似乎是一个容易犯的错误,而且这种情况并不经常出现。