C#通用方法返回值

Dar*_*ung 13 c# generics

我只是在学习泛型,并对方法返回值有疑问.

说,我想要一个泛型方法,因为方法签名所需的通用部分只是返回值.该方法将始终采用一个字符串作为其参数,但可以返回double或int.这可能吗?

实际上我想要一个字符串,解析其中包含的数字(可以是double或int),然后返回该值.

谢谢.

Max*_*dov 16

像这样的东西?

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)));
}
Run Code Online (Sandbox Code Playgroud)


Eni*_*ity 10

如果没有返回任何其他类型,则无法返回a double或a int从泛型方法.

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

Foo result = Parse<Foo>("111");
Run Code Online (Sandbox Code Playgroud)

使用数字可以做的最好的事情是只允许使用struct(值 - 类型)来限制你的功能.

T Parse<T>(string value) where T : struct;
Run Code Online (Sandbox Code Playgroud)

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

您可以通过接口类型限制,但没有一个INumeric对接口doubleint使你有种被卡住.

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

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

double ParseDouble(string value);
int ParseInteger(string value);
Run Code Online (Sandbox Code Playgroud)

但是,当然,这不会帮助你学习泛型.抱歉.


dec*_*one 9

是的,这是可能的.

例:

public T ParseValue<T>(String value) { 
    // ...
}
Run Code Online (Sandbox Code Playgroud)