返回通用类型时出错(无隐式转换)

时间:2019-01-31 17:37:49

标签: c# implicit-conversion

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

这是我的界面和类定义:

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

返回ListTestClass

1 个答案:

答案 0 :(得分:0)

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

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

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