Значение типа ‘T’ не может быть преобразовано в

Это, скорее всего, новичок, но google неожиданно не дал ответа.

У меня этот довольно искусственный метод

T HowToCast(T t) { if (typeof(T) == typeof(string)) { T newT1 = "some text"; T newT2 = (string)t; } return t; } 

Исходя из фона на C ++, я ожидал, что это сработает. Однако он не может скомпилировать с помощью «Невозможно неявно преобразовать тип« Т »в строку» и «Невозможно преобразовать тип« Т »в строку» для обоих указанных выше назначений.

Я либо делаю что-то концептуально неправильно, либо просто имею неправильный синтаксис. Пожалуйста, помогите мне разобраться с этим.

Спасибо!

Несмотря на то, что он находится внутри блока if , компилятор не знает, что T является string .
Поэтому он не позволяет вам делать бросок. (По той же причине, что вы не можете DateTime в string )

Вам нужно передать object (который может быть использован любым T ), а оттуда – к string (поскольку object может быть перенесен в string ).
Например:

 T newT1 = (T)(object)"some text"; string newT2 = (string)(object)t; 

Обе линии имеют одинаковую проблему

 T newT1 = "some text"; T newT2 = (string)t; 

Компилятор не знает, что T является строкой и поэтому не знает, как это назначить. Но так как вы проверили, вы можете просто заставить его

 T newT1 = "some text" as T; T newT2 = t; 

вам не нужно бросать t, так как это уже строка, также необходимо добавить ограничение

 where T : class 

Если вы проверяете явные типы, почему вы объявляете эти переменные как T ?

 T HowToCast(T t) { if (typeof(T) == typeof(string)) { var newT1 = "some text"; var newT2 = t; //this builds but I'm not sure what it does under the hood. var newT3 = t.ToString(); //for sure the string you want. } return t; } 

Вы также получите эту ошибку, если у вас есть общее объявление как для вашего classа, так и для вашего метода. Например, приведенный ниже код дает эту ошибку компиляции.

 public class Foo  { T var; public  void doSomething(Class  cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

Этот код компилирует (примечание T удалено из объявления метода):

 public class Foo  { T var; public void doSomething(Class  cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

Измените эту строку:

 if (typeof(T) == typeof(string)) 

Для этой строки:

 if (t.GetType() == typeof(string)) 
  • Передача одного элемента в виде IEnumerable
  • Как создать универсальную модель объекта для использования в QML?
  • В чем разница между SortedList и SortedDictionary?
  • Динамически Создать общий шаблон для шаблона
  • Общий код C # и оператор Plus
  • Почему C # запрещает общие типы атрибутов?
  • Java Class.cast () против оператора трансляции
  • Как получить тип T от члена общего classа или метода?
  • Почему C # (4.0) не допускает совпадения и контравариантность в типах универсального classа?
  • Что означает в C #
  • C # Создать новый T ()
  • Давайте будем гением компьютера.