“不能隐式地将类型'thisMethod <t>'转换为'T'”</t>

时间:2012-01-17 11:16:23

标签: c# .net generics compiler-errors

我遇到以下代码时出现问题,并希望有人可以告诉我它有什么问题。

我给出的错误是:

  

无法隐式将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 个答案:

答案 0 :(得分:7)

方法doSomethingdoSomethingElse的返回类型为T,而您实际上是在这些方法的正文中返回thisThing<T>。这些都不一样。

举一个简单的例子,这相当于将List<T>返回到您期望的T - 它们是完全不同的类。

答案 1 :(得分:4)

好吧,编译器说:

private T doSomethingElse<T>(string thisString)

需要:

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

要编译。

现在修复取决于你想要做什么(一个不使用其参数的方法已经被怀疑)。

答案 2 :(得分:3)

您要做的是将类型thisThing转换为类型T,这是不可能的。相反,您需要将doSomethingElse<T>(...)的返回类型更改为:

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

答案 3 :(得分:3)

thisThing<T>是一种通用类型,T作为类型参数。它无法转换为T

那就像是说:

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

答案 4 :(得分:2)

对我来说很明显

_thisThing的类型为thisThing<T>,但返回类型的类型为T

答案 5 :(得分:2)

您告诉代码该方法的返回类型为T,并且您尝试返回thisThing<T>。编译器不知道如何从另一个转换它,所以它向你抱怨它。

您需要更改方法的返回类型或更改方法中返回的内容。

答案 6 :(得分:1)

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

答案 7 :(得分: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 
        }
    }