【问题标题】:C# Generic method return valuesC# 泛型方法返回值
【发布时间】:2011-01-17 11:20:58
【问题描述】:

我刚学泛型,有一个关于方法返回值的问题。

比如说,我想要一个泛型方法,因为方法签名所需的泛型部分只是返回值。该方法将始终将一个字符串作为其参数,但可以返回一个双精度数或一个整数。这可能吗?

实际上我想获取一个字符串,解析其中包含的数字(可以是双精度或整数),然后返回该值。

谢谢。

【问题讨论】:

  • 这将是对泛型的低效使用(除非您这样做只是为了学习)。由于您需要提前知道类型,因此使用 Convert.ToDouble 或 Convert.ToInt32 可以更好地完成此特定任务。 parse 方法无法仅通过查看字符串来“自动”确定类型。在传递字符串之前,您仍然需要知道类型。

标签: c# generics


【解决方案1】:

这样的?

void Main()
{
    int iIntVal = ConvertTo<int>("10");
    double dDoubleVal = ConvertTo<double>("10.42");
}

public T ConvertTo<T>(string val) where T: struct
{
    return (T) System.Convert.ChangeType(val, Type.GetTypeCode(typeof(T)));
}

【讨论】:

  • var kvp = ConvertTo&lt;KeyValuePair&lt;int, List&lt;string&gt;&gt;&gt;("1, 2"); 怎么样? :)
  • @Benjol:嗯,System.Convert.ChangeType 通常应该会失败。无法检查 T 类型是否在编译时可转换,因为“简单”值类型没有通用约束(struct 约束至少会阻止使用引用类型)。所以我们将在运行时将类型验证留给System.Convert.ChangeType
【解决方案2】:

如果泛型方法不返回任何其他类型,则不能返回 doubleint

例如,我可能有一个 Foo 类,而您的通用解析方法将允许进行此调用:

Foo result = Parse<Foo>("111");

你可以对数字做的最好的事情是通过只允许使用struct(值类型)来限制你的函数。

T Parse<T>(string value) where T : struct;

但这将允许所有数字类型,以及任何其他值类型。

您可以通过接口类型进行限制,但doubleint 上没有INumeric 接口,所以您有点卡住了。

如果传入了错误的类型,你唯一能做的就是抛出一个异常——这通常不是很令人满意。

在这种情况下,您最好的方法是放弃泛型并使用单独命名的方法。

double ParseDouble(string value);
int ParseInteger(string value);

但是,当然,这不会帮助您学习泛型。对不起。

【讨论】:

  • 感谢您的回答。我想使用泛型,因为我认为简单地使用一种方法可能更有效。显然情况并非如此,我最好继续使用我目前使用的两种方法。谢谢。
【解决方案3】:

是的,这是可能的。

示例:

public T ParseValue<T>(String value) { 
    // ...
}

【讨论】:

  • 这正是我想要的。谢谢。
【解决方案4】:

你可以做类似...

   public TResult Parse<TResult>(string parameter)
    {
     /* do stuff */
    }

并像...一样使用它

int result = Parse<int>("111");

然后它将取决于您在 Parse 方法中的实现。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多