2012-01-25 2 views
8

Можно создать дубликат:
Generic constraints, where T : struct and where T : classНевозможности перегружать общие методы с ограничениями типа

Есть ли конкретная причина, по которой вы не можете перегружать общие методы с использованием взаимоисключающих ограничений типа в C#? Например, возьмем эти методы:

T DoSomething<T>(T arg) where T : class 
{ /* Do something */ } 

T DoSomething<T>(T arg) where T : struct 
{ /* Do something */ } 

и попытаться вызвать их с

DoSomething("1"); 
DoSomething(1); 

так, как я это вижу, DoSomething() методы являются взаимоисключающими, насколько параметры, которые они предпримут - первый принимает ссылочный тип, второй - тип значения. Компилятор должен иметь возможность сказать, что вызов DoSomething с аргументом строки переходит к первому методу, а вызов DoSomething с аргументом int переходит ко второму методу.

Я пропустил что-то концептуально с дженериками здесь? Или это просто функция, которая не была реализована на C#?

+1

Этот дубликатом текст может быть улучшена путем добавления ссылки на дубликате ответа. Это очень неприятно, если вы не можете найти решение, и поиск не возвращает никаких результатов или путей, слишком много результатов. –

ответ

8

Общие ограничения не являются частью сигнатуры метода

Посмотреть этот ответ Generic contraints on method overloads

Jon Skeet blog post on the topic

+0

Ссылки, предоставленные в этом ответе, в настоящее время нарушены (по состоянию на 4/26/2015). – devinbost

+0

@bostIT Huh. Интересно, что случилось с блогом Джона. Я посмотрю, смогу ли найти обновленную ссылку. – asawyer

+0

@bostIT Нашел обновление и исправил ссылку – asawyer

Смежные вопросы