Вы не можете, и я согласен, что это неприятно, хотя то, что я обнаружил, что мне нужно, это не столько то, что вы ищете, сколько переопределение на основе ограничения (чтобы я мог, например, иметь класс и struct struct того же самого метода или класса, и иметь соответствующую, используемую в зависимости от обстоятельств).
Есть два случая, когда мы можем хорошо жить.
Одна из причин, по которой мы не хотим использовать метод расширения, заключается в том, что он уже предоставлен как метод экземпляра. На самом деле мы получаем это бесплатно; методы экземпляра всегда используются вместо методов расширения (хотя derivedClass.method()
не будет использоваться при вызове baseClass.method()
, если он существует только в derivedClass
).
Другой случай - выбор времени выполнения:
public static T SomeMethod<T>(this object value) where T != IEnumerable
{
if(typeof(T).GetInterface("IEnumerable") != null)
{
//behaviour appropriate for IEnumerable
}
else
{
//other behaviour.
}
}
Это не идеально, особенно если единственное «поведение, подходящее для IEnumerable» - это генерировать исключение, но иногда этого может быть достаточно.