如何在方法返回值中使用带两个类型参数的泛型接口
代码问题修正与实现方案
你写的现有代码存在两处语法错误:
- 泛型约束不合法:C#不支持将
string、long这类密封类型直接作为泛型参数的约束 - 方法声明格式错误:C#方法声明需要遵循
访问修饰符 + 返回值类型 + 方法名 + 泛型声明的规则,现有写法不符合语法要求
根据你的实际需求,有两种常用实现方案:
方案1:固定两个类型为string和long,直接定义非泛型接口
如果你确定接口的两个对应值的类型永远是string和long,完全不需要用泛型,实现逻辑最简单:
// 定义接口,可根据需要补充成员 public interface IStringLong { string Text { get; set; } long Number { get; set; } } // 方法返回上述接口类型 public IStringLong GetStringLongData() { // 返回实现了IStringLong的类实例即可,示例如下 return new StringLongDemo { Text = "示例文本", Number = 999L }; } // 接口实现类示例 public class StringLongDemo : IStringLong { public string Text { get; set; } public long Number { get; set; } }
方案2:保留泛型结构,调整约束规则
如果你需要接口支持更多类型,可调整泛型约束为合法写法,实现如下:
// 泛型接口:约束T1为引用类型,T2为值类型 public interface IStringLong<out T1, out T2> where T1 : class where T2 : struct { T1 Text { get; } T2 Number { get; } } // 泛型方法返回泛型接口 public IStringLong<T1, T2> GetData<T1, T2>(T1 text, T2 number) where T1 : class where T2 : struct { return new StringLongImpl<T1, T2>(text, number); } // 泛型实现类 public class StringLongImpl<T1, T2> : IStringLong<T1, T2> where T1 : class where T2 : struct { public T1 Text { get; } public T2 Number { get; } public StringLongImpl(T1 text, T2 number) { Text = text; Number = number; } } // 调用示例 var result = GetData("测试内容", 1024L);
如果一定要用泛型接口且固定类型参数为string、long,也可以直接在方法返回值处指定具体的泛型参数类型:
public IStringLong<string, long> GetFixedTypeData() { return new StringLongImpl<string, long>("固定类型示例", 2048L); }
内容的提问来源于stack exchange,提问作者Mousa Ghajar Najafi
相关产品推荐
相关产品推荐

