gpt4 book ai didi

C# 泛型重载 - 编译器无法确定正确的调用

转载 作者:太空狗 更新时间:2023-10-29 23:04:43 25 4
gpt4 key购买 nike

我不明白为什么编译器无法解析这里使用的正确重载。 (下面的代码)只有一个版本的 Add() 是合适的——BigFoo 是一个 IFoo,并且不实现 IEnumerable,其中 T 是一个 IFoo。但它坚持报告有歧义。有任何想法吗?我尝试添加第二个泛型类型参数 - 添加 where T : IFoo where U : IEnumerable。但是即使是合法使用,过载也会被完全忽略。

我知道我可以通过转换和指定泛型类型参数来解决这个问题,但那时我已经打败了重载的目的。您可能会质疑过载,但语义对我来说是正确的 - 我在我的类中实现的行为是 Add() 将对象批发添加为集合中的单个条目。 (第二个 Add() 不应是 AddRange()。)

namespace NS
{
interface IFoo { }

class BigFoo : IFoo, IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}

class FooContainer
{
public void Add(IFoo item) { }
public void Add<T>(IEnumerable<T> group) where T : IFoo { }
}

class DemoClass
{
void DemoMethod()
{
BigFoo bigFoo = new BigFoo();
FooContainer fooContainer = new FooContainer();
// error CS0121: The call is ambiguous between the following methods or properties:
// 'NS.FooContainer.Add(NS.IFoo)' and
// 'NS.FooContainer.Add<int>(System.Collections.Generic.IEnumerable<int>)'
fooContainer.Add(bigFoo);
}
}
}

最佳答案

通用重载决策不考虑约束,因此它认为 Add<T>适用的版本,推断 T=int .

这两种方法都适用,没有一个肯定比另一个好,因为IEnumerable<int>之间没有转换。和 IFoo .虽然泛型方法被认为比非泛型方法“更不具体”,但这仅在类型参数替换后参数类型相同时才有意义,而在本例中并非如此。

关于C# 泛型重载 - 编译器无法确定正确的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965423/

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