Msgstr "Невозможно неявно преобразовать тип 'thisMethod <T>' в 'T'" - PullRequest
2 голосов
/ 17 января 2012

У меня проблемы с приведенным ниже кодом, и я надеялся, что кто-нибудь там скажет мне, что с ним не так.

Ошибка, которую я получил:

Невозможно неявно преобразовать тип 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
    }
}

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

Ответы [ 8 ]

7 голосов
/ 17 января 2012

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

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

4 голосов
/ 17 января 2012

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

private T doSomethingElse<T>(string thisString)

должно быть:

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

для компиляции.

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

3 голосов
/ 17 января 2012

thisThing<T> - это универсальный тип с T в качестве параметра типа.Он не может быть преобразован в T.

Это было бы как сказать:

List<string> stringList = new List<string>();
string someString = stringList;   // Makes no sense.
3 голосов
/ 17 января 2012

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

private thisThing<T> doSomethingElse<T>(...) { ... }
2 голосов
/ 17 января 2012

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

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

2 голосов
/ 17 января 2012

Для меня ясно,

_thisThing имеет тип thisThing<T>, но тип возврата имеет тип T

1 голос
/ 17 января 2012
private thisThing<T> doSomethingElse<T>(string thisString) { }
0 голосов
/ 17 января 2012

Вы можете изменить свой 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 
        }
    } 
...