2012-04-18 5 views
2

Я пытался создать общий метод для чтения значений столбцов из DataRow с помощью методов datarowextension:Неоднозначные ссылки между обобщенными методами

public static Nullable<T> SafeRead<T>(DataRow row, string fieldName) where T : struct 
    { 
     if (row.HasColumn(fieldName)) 
     { 
      return row.Field<Nullable<T>>(fieldName) ?? default(Nullable<T>); 
     } 
     else 
      return default(Nullable<T>); 
    } 

    public static T SafeRead<T>(DataRow row, string fieldName) where T : class 
    { 
     if (row.HasColumn(fieldName)) 
     { 
      return row.Field<T>(fieldName) ?? default(T); 
     } 
     else 
      return default(T); 
    } 

Когда я вызываю эту функцию из моего кода компилятор жалуется, что есть двусмысленная ссылка между двумя вызовами, которая очевидна, когда я смотрю на подписи метода. Однако я не уверен, как справиться с этим, не используя отдельные методы.

+0

Как вы даже управляя, чтобы * объявить * эти два метода? Я ожидаю, что компилятор пожалуется, что вы пытаетесь перегрузить только возвращаемое значение. –

+0

@john Вы правы насчет компилятора, жалующегося на неоднозначные методы. Я только пытался понять, может ли C# указать способ перегрузки на основе общих ограничений параметров. – koder

+0

Право - это просто. Нет, ты не можешь. –

ответ

3

Возвращаемое значение не является частью сигнатуры метода идентификации. Так что ваши методы выглядеть компилятор:

SafeRead<T>(DataRow row, string fieldName) 

и

SafeRead<T>(DataRow row, string fieldName) 

-> Там нет никакой разницы.

Вы должны переименовать один из методов.

+0

Я не уверен, что это технически важный момент. Соответствующий момент состоит в том, что * общий аргумент * не является частью сигнатуры метода. Подпись, в отношении CLR, является '' SafeRead'1 (...) '' в обоих случаях, независимо от фактического общего аргумента. –

+0

@ KonradRudolph Да. Вы правы, я просто хотел указать, что OP должен переименовать один из его методов. –

+0

@KonradRudolph: Общие * ограничения * не являются частью сигнатуры метода. * Номер * параметров типового типа. –

-2

Это потому, что оба пространства имен содержат один и тот же объект. Чтобы решить эту проблему, используйте псевдоним типа

Пример: Если System.Drawing.Image и System.Web.UI.WebControls вызывает ошибку, то следующие using заявления позволит создать псевдоним для System.Drawing классов:

using GdiImage = System.Drawing.Image; 
using System.Web.UI.WebControls; 
Смежные вопросы