Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串强制转换为字符串的泛型类型_C#_String_Generics_Casting - Fatal编程技术网

C# 将字符串强制转换为字符串的泛型类型

C# 将字符串强制转换为字符串的泛型类型,c#,string,generics,casting,C#,String,Generics,Casting,我正在编写一个方法来进行智能类型转换——如果类型参数恰好是字符串,则使用ToString(),否则进行强制转换,但如果强制转换不起作用,则返回null。基本上从v中获取尽可能多的信息,而不会引发异常 在我尝试强制转换之前,我检查了T是否确实是字符串,但编译器仍然不是风扇: Cannot convert type 'string' to 'T' 这是我的方法: public T? Convert<T>(object v) { if (typeof(T) == typeof(s

我正在编写一个方法来进行智能类型转换——如果类型参数恰好是字符串,则使用ToString(),否则进行强制转换,但如果强制转换不起作用,则返回null。基本上从
v
中获取尽可能多的信息,而不会引发异常

在我尝试强制转换之前,我检查了
T
是否确实是
字符串,但编译器仍然不是风扇:

Cannot convert type 'string' to 'T'
这是我的方法:

public T? Convert<T>(object v)
{
    if (typeof(T) == typeof(string)) {
    return (T)v.ToString(); // Cannot convert type 'string' to 'T'  
    } else try {
      return (T)v;
    } catch (InvalidCastException) {
    return null;
    }
}
公共电话?转换(对象v) { if(typeof(T)=typeof(string)){ return(T)v.ToString();//无法将类型“string”转换为“T” }否则试试{ 返回(T)v; }捕获(无效卡斯特例外){ 返回null; } }

也让我知道这是否是某种不可原谅的罪。我用它来处理一些可能有混合类型的数据结构。

您需要将字符串转换为
对象,因为您的返回类型是泛型的,即

return (T)(object)v.ToString();

在转换为泛型类型时,基本上需要通过
对象

return (T)(object) v.ToString()

我会使用
is
而不是捕获
InvalidCastException

请参阅,以获取有关为什么需要这样做的更多详细信息

特别是:

因为编译器知道这个转换可能成功的唯一方法是如果
U
是bool,但是
U
可以是任何东西!编译器假定大部分时间
U
不会使用
bool
构造,因此几乎可以肯定此代码是一个错误,编译器正在提醒您注意这一事实


(用
T
代替
U
,用
string
代替
bool
。)

在转换为
T

return (T)(object)v; 

public T转换(对象v){
返回(T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

警告,如果T和v中包含的对象之间不存在转换,这将引发异常。

as
不是更好的选择吗?@SteveCzetty:我们不知道
T
是可空类型,所以
as
不起作用(IIRC)。说得好。尽管我不认为
is
也会起作用,除非
t
被限制为
类。(IIRC,也是)@SteveCzetty:是的,它会的-你可以将
is
用于任何类型。例如:
对象o=10;如果(o是int).
@BehnamEsmaili:要装箱的值类型在哪里?那不是装箱。没有涉及值类型。还有其他问题。当对
T
没有约束时,您的方法不能具有返回类型
T?
。例如,因为string是一种引用类型,所以没有称为
string?
return (T)(object)v; 
using System.ComponentModel;
public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}