2012-01-17 2 views
2

У меня возникли проблемы с приведенным ниже кодом и надеялся, что кто-то там может сказать мне, что с ним не так.«Невозможно неявно преобразовать тип» thisMethod <T> 'to' T '"

Ошибка Я дал это:

Не может неявно преобразовать тип ThisThing<T> в T

Мой код:

class ThisThing<T> 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

class OtherThing 
{ 
    public T DoSomething<T>(string str) 
    { 
     T foo = DoSomethingElse<T>(str); 
     return foo; 
    } 

    private T DoSomethingElse<T>(string str) 
    { 
     ThisThing<T> thing = new ThisThing<T>(); 
     thing.A = "yes"; 
     thing.B = "no"; 

     return thing; // This is the line I'm given the error about 
    } 
} 

Мысли? Я ценю вашу помощь!

+3

Пожалуйста, начните имена типов с Captial, что делает его намного легче читать. И, пожалуйста, не начинайте локальные переменные с подчеркивания. Или, если вы это сделаете, начните все с подчеркивания. Это поможет нам (и, что более важно, вам) прочитать код и предотвратить ошибки. –

ответ

2

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

Вам нужно либо изменить тип возврата для своего метода, либо изменить то, что вы возвращаете в методе.

3

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

private thisThing<T> doSomethingElse<T>(...) { ... } 
7

Методы doSomething и doSomethingElse имеют тип возврата T, в то время как вы на самом деле возвращает thisThing<T> в теле этих методов. Это не одно и то же.

Для удобства, это было бы эквивалентно возврату List<T>, где вы ожидаете всего T - они совершенно разные классы.

2

Это ясно для меня

_thisThing имеет тип thisThing<T> но тип возвращаемого значения типа T

4

Ну, компилятор говорит, что это:

private T doSomethingElse<T>(string thisString) 

должны были бы быть:

private thisThing<T> doSomethingElse<T>(string thisString) 

для его компиляции ,

Теперь исправление зависит от того, что вы пытаетесь сделать (метод, который не использует его параметр, уже подозревается).

3

thisThing<T> является типовым типом с параметром типа T. Он не может быть преобразован в T.

Это было бы, как говорят:

List<string> stringList = new List<string>(); 
string someString = stringList; // Makes no sense. 
0

Вы можете изменить свой класс код otherThing как приведенный ниже код и попробуйте

class otherThing 
    { 
     public otherThing() 
     { 
     } 
     public thisThing<T> doSomething<T>(string thisString) 
     { 
      thisThing<T> foo = doSomethingElse<T>(thisString); 
      return foo; 
     } 
     private thisThing<T> doSomethingElse<T>(string thisString) 
     { 
      thisThing<T> _thisThing = new thisThing<T>(); 
      _thisThing.A = "yes"; 
      _thisThing.B = "no"; 
      return _thisThing; //This is the line I'm given the error about 
     } 
    } 
Смежные вопросы