2013-03-08 2 views
3

Я пытаюсь написать метод, который принимает общий ввод и возвращает значение null, если вход по умолчанию и XElement в противном случае.Параметр 'T' имеет то же имя, что и параметр типа

Btw, я довольно зеленый при общих методах и, по-видимому, в google-fu.

Вот что я до сих пор:

public static class ConversionClass<T> 
{ 
    public static XElement newXElementOrNull<T>(string name, T val) 
    { 
     if ((T.type == "String") && (val == String.Empty)) 
     { 
      return null; 
     } 

     if (val == default(T)) 
     { 
      return null; 
     } 
     else 
     { 
      return new XElement(name, val); 
     } 
    } 
} 

По какой-то причине, C# не нравится.

Он уклоняется от подписи методы (newXElementOrNull), говоря:

Типа параметр «T» имеет то же имя в качестве параметра типа от внешнего вида «AddXMLTest.Converter»

И это выдвигает на первый план в T угловые скобки и T в параметре.

Чтобы усугубить ситуацию, ему не нравится элемент val == default (T), поскольку он говорит, что оператор '==' не может быть применен к операндам типа T и T.

Что я делаю неправильно?

+1

Вам не хватает кода из этого примера, чтобы выяснить, что здесь действительно не так. Например, 'val == default (T)' недействительно, как вы написали пример. Кроме того, очевидно, что у вас есть «внешний тип», который также использует «T» в параметре типа, но вы не указали этот примерный код. –

+1

FYI соглашение об именах для всех не-частных методов (edit: not camelCase) PascalCase –

+0

Кроме того, if ((T.type == "String") && (val == String.Empty)) недопустим. Пожалуйста, предоставьте короткий, но полный пример, который воспроизводит проблему. –

ответ

5

Видимо, этот метод находится внутри класса, который уже указывает <T>. Это означает, что вы можете опустить параметр этого типа, методы общего класса также автоматически генерируются.

Я ожидал бы, что T.type вызовет ошибки, но это зависит от ограничений типа внешнего класса. Чтобы получить полный ответ, опубликуйте внешнее определение (не все участники) этого класса.

не нравится val == default(T)

То есть, скорее всего, последующие ошибки первого.

+0

Я бы добавил +1, если бы мог мой друг, но у меня нет голосов. Думаю, у нас обоих была такая же мысль. Приятно, когда вы отвечаете, это подтверждают такие люди, как вы! –

3

Тип параметра «Т» имеет такое же имя в качестве параметра типа от внешнего типа «AddXMLTest.Converter»

Так должно быть класс за пределами этого метода (не показан) с помощью <T>, а также , Вы не сможете этого сделать. Назовите его (по методу, который есть) примерно как <K>.

Чтобы ухудшить ситуацию, ему не нравится часть val == default (T), потому что он говорит, что оператор «==» не может применяться к операндам типа «T» и «T».

Это должен быть решен, когда вы прекратите использовать <T> и изменить его так, что-то вроде default(K).

Кроме того, я уверен, что этот T.type не собирается компилироваться.Я уверен, что оценка должна быть что-то вроде:

if ((val is typeof(string) && string.IsNullOrEmpty(val)) 
+2

Параметр 'is' предназначен для экземпляров, а не типов' T typeof (string) 'не работает –

+0

@GeorgeMauer, извините. Правильно, спасибо, спасибо, это исправлено! –

+1

В этом случае у нас есть проблема, что если val имеет значение null, то может быть строкой, но это не будет вызвано, поскольку 'null is String == false'. В значительной степени оператор 'is' - не совсем правильный инструмент для этого. Вы, вероятно, хотите провести прямое сравнение с типами, как в моем ответе, или проверить 'type1.IsAssignableFrom (type2)' –

1

Вы можете не раньше, чем делать T.type вы можете сделать String.type или MyClass.type

Что вы ищете что-то вроде

typeof(T) == typeof(String) 
0

Есть две недопустимые вещи: T.type == "String" && val == String.Empty и val == default(T). О нас:

public static XElement newXElementOrNull<T>(string name, T val) { 
    if (typeof(T) == typeof(String) && val.ToString() == String.Empty) { 
     return null; 
    } 

    if (EqualityComparer<T>.Default.Equals(val, default(T))) { 
     return null; 
    } 
    else { 
     return new XElement(name, val); 
    } 
} 
Смежные вопросы