在调用泛型方法时获取隐式转换异常。正确的做法是什么?
这是我的界面和类定义:
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
方法中看到,我将返回不同的类型List
和string
。方法Call
和GETCG
实现接口TestData
。我可以解释一下为什么会收到此错误以及如何改进此代码的情况,但要记住我需要从strings
List
和TestClass
答案 0 :(得分:0)
这里的问题是,您已经为T
定义了一个约束,该约束必须实现TestData
接口,但是您将T
声明为List<TestData>
。
编译器告诉您List<T>
未实现TestData
接口,并且没有可用于实现该目标的隐式转换。
解决方案是删除约束或传递实现TestData
接口的类实例。