【发布时间】:2023-04-07 22:35:01
【问题描述】:
调用泛型方法时获取隐式转换异常。这样做的正确方法是什么?
这是我的接口和类定义:
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。我能否解释一下为什么会出现此错误以及如何改进此代码,请记住我需要从TestClass 返回strings 和List
【问题讨论】:
-
List<TestData>没有实现where T : TestData约束 -
放弃从方法返回完全不同类型的想法怎么样?你已经定义了这个约束
where T: TestData,你说你想返回一个字符串。字符串是否实现/继承TestData? -
@Alexander 字符串不能实现测试数据,但我需要知道如何执行此操作,因为这是一项要求。
-
好吧,
string没有实现这种类型,不可能让string这样做,你的要求就是这样做,对吧?