首页 > 解决方案 > 返回泛型类型时出错(无隐式转换)

问题描述

调用泛型方法时获取隐式转换异常。这样做的正确方法是什么?

这是我的接口和类定义:

public interface TestData
{
    string field { get; set; }
    string fieldName { get; set; }
    string type { get; set; }
}

public class TestClass
{
    public static T Call<T>(string Project, string type) where T : TestData
    {
        var returning = GETCG<T>(test, type);

        return (T)Convert.ChangeType(returning, typeof(T), CultureInfo.InvariantCulture);
    }

    private static T GETCG<T>(string test, string type) where T : TestData
    {
        var fields = nodees.Cast<XmlNode>().Select(x => new
        {
            // some data
        }).ToList();

        if (fields != null)
        {
            return (T) Convert.ChangeType(templateFields, typeof(T), 
                CultureInfo.InvariantCulture);
        }
        else
        {
            return (T)Convert.ChangeType("SomeString", typeof(T), 
                CultureInfo.InvariantCulture);
        }
    }
}

我收到以下异常:

类型“System.Collections.Generic.List”不能用作泛型类型或方法“TestClass.Call(string, string)”中的类型参数“T”。没有从“System.Collections.Generic.List”到“Test.TestData”的隐式引用转换

在下面的代码行:

var test = TestClass.Call<List<TestData>>("ProjName", "Audio");

如果您在GETCG方法中看到我返回不同的类型Liststring. 方法CallGETCG实现接口TestData。我能否解释一下为什么会出现此错误以及如何改进此代码,请记住我需要strings同时List返回TestClass

标签: c#implicit-conversion

解决方案


这里的问题是您已经定义了一个T必须实现TestData接口的约束,但是您将其声明TList<TestData>.

编译器告诉您List<T>没有实现该TestData接口,并且没有可以用来实现该接口的隐式转换。

解决方案是删除约束或传入实现TestData接口的类实例。


推荐阅读