는 다음과 같은 두 가지 확장 방법을 고려 : 내 두 번째 방법을 썼을 때컴파일러는 IEnumerable <T>을 통해 IEnumerable로 대체를 선택하는 이유는 무엇입니까?
using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
public static bool Contains(this IEnumerable self, object obj)
{
foreach (object o in self)
{
if (Object.Equals(o, obj))
{
return true;
}
}
return false;
}
public static bool ContainsEither<T>(this IEnumerable<T> self, T arg1, T arg2)
{
return self.Contains(arg1) || self.Contains(arg2);
}
}
, 나는 일반 LINQ Enumerable.Contains<T>
방법 (사용에서 추론 형식 인수)를 호출 할 의도. 그러나, 나는 실제로 첫 번째 방법을 호출하는 것을 발견 (내 사용자 지정 Contains()
확장 방법은. 내 Contains()
방법을 언급 할 때, 두 번째 방법은 Enumerable.Contains<T>()
방법을 사용하여, 잘 컴파일합니다.
내 질문은, 왜 않습니다 컴파일러는 IEnumerable<T>
인수 Enumerable.Contains<T>()
이상의 제네릭이 아닌 IEnumerable
인수로 내 Contains()
방법을 선택 나는 그것이 IEnumerable<T>
더 IEnumerable
보다 파생 Enumerable.Contains<T>()
때문에 선택하는 기대
업데이트 :.. 위대한 답변 존 소총 덕분에 그것은 것 디자이너가 이런 식으로 선택한 이유를 알고 흥미 롭습니다. 이 상관 할 곳이야, 내가 한 생각 (그것이 손이 닿지 약간의 부여)
public static double Average(this IEnumerable self)
{
double sum = 0;
long count = 0;
foreach (object obj in self)
{
sum += Convert.ToDouble(obj);
nItems++;
}
return sum/count;
}
object[] junk = new object[] { "9000", (byte)99, -8.555, 3154254325345UL };
double[] clean = new double[] { 9000, 99, -8.555, 3154254325345 };
double junkAvg = junk.Average();
double cleanAvg = clean.Average(); // compiler is choosing your Average() method where you'd prefer it to choose Enumerable.Average(IEnumerable<double>)
제네릭이 더 구체적입니다. –
일반적으로 이와 같은 상황에서 "왜"라는 질문은 일반적으로 흥미 롭습니다.하지만 아마도 "어떻게하지 않습니까?"라는 질문이 더 중요 할 것입니다. –
@ LasseV.Karlsen 정말 이유에 대해서. Enumerable.Contains (...) 또는 Contains (...)을 쓸 수있었습니다. –