You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在方法返回值中使用带两个类型参数的泛型接口

代码问题修正与实现方案

你写的现有代码存在两处语法错误:

  • 泛型约束不合法: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:57:02