gpt4 book ai didi

c# - 类型参数 'T' 与外部类型 '...' 的类型参数同名

转载 作者:可可西里 更新时间:2023-11-01 03:07:53 40 4
gpt4 key购买 nike

public abstract class EntityBase { ... }

public interface IFoobar
{
void Foo<T>(int x)
where T : EntityBase, new();
}

public interface IFoobar<T>
where T : EntityBase, new()
{
void Foo(int x);
}

public class Foobar<T> : IFoobar, IFoobar<T>
where T : EntityBase, new()
{
public void Foo(int x) { ... }

void IFoobar.Foo<T>(int x) { Foo(x); }
}

我收到编译器警告:Type parameter 'T' has the same name as the type parameter from outer type '...'

我试过:void IFoobar.Foo<U>(int x) { Foo(x); } ,但是我不能保证 U 和 T 是相同的。 Foobar 类的实现方式相同非常重要。

我也试过:void IFoobar.Foo<U>(int x) where U : T { Foo(x); } ,但这并不能保证 U 和 T 相等,并且不允许我重新定义约束,因为它是在接口(interface)上定义的。

最佳答案

最大的问题是你的接口(interface)没有很好地定义,并且不符合你代码的意图。

如果您的 T 在界面上不公开可见,那么外部代码甚至不必知道有 T。您需要制作接收或返回 T 的方法,或者具有 T 类型的某些属性,或者您应该完全摆脱 T ,并使您的接口(interface)非通用。

一旦你支持了这一点,为什么你在这里不需要两个不同的接口(interface)就会变得更加明显,你应该不再需要协调它们。

如果事实证明您确实需要一个采用T 的版本和一个非T 版本,那么更惯用的方法是传递object 而不是 T:

public interface IFoo
{
void DoSomething(object o);
object DoSomethingElse();
}

public interface IFoo<T>
{
void DoSomething(T item);
T DoSomethingElse();
}

有关此示例,请参阅 IEnumerableICollectionIList 等接口(interface)。

但要慎重考虑。最后的设计折衷(同时具有通用版本和对象版本)总是会留下一些不足之处。

你会牺牲其中之一:

  • 直接传达设计契约的良好界面设计(如果您抛出异常或在传入错误类型时执行空操作)
  • 类型安全,以及随之而来的错误减少(如果您正确操作任何旧对象)

关于c# - 类型参数 'T' 与外部类型 '...' 的类型参数同名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740978/

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