相关疑难解决方法(0)

将字符串转换为字符串的泛型类型

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

我在尝试演员之前检查T确实是一个string,但编译器仍然不是粉丝:

Cannot convert type 'string' to 'T'
Run Code Online (Sandbox Code Playgroud)

这是我的方法:

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

如果这是某种不可饶恕的罪,请告诉我.我用它来处理一些可能有混合类型的数据结构.

c# string generics casting

6
推荐指数
1
解决办法
1万
查看次数

为什么我不能将派生泛型类型转换为基于非泛型类型(通过约束)?

鉴于这个虚构的例子:

class NonGeneric
{
}

class Generic<T> : NonGeneric
    where T : NonGeneric
{
    T DoSomething()
    {
        return this; // **
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望它编译:Generic<T>派生自NonGeneric并且T必须是派生类,因此它满足其约束.

我应该能够做到这一点:

NonGeneric obj = new Generic<NonGeneric>();
Run Code Online (Sandbox Code Playgroud)

那么这个指令应该没有问题:

return this;
Run Code Online (Sandbox Code Playgroud)

或者至少这个:

return (T)this;
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用,上面的例子没有编译错误:

无法将类型转换NonGeneric<T>为' T'

我做错了什么,我看不到它,或者只是不被允许?为什么这个?


如果可能的话,我会避免使用我在本文中描述的任何解决方法(反射,动态编译方法等).我也会避免使用dynamic对象(设计决定,我不能改变它).

.net c# generics casting

3
推荐指数
1
解决办法
654
查看次数

标签 统计

c# ×2

casting ×2

generics ×2

.net ×1

string ×1