相关疑难解决方法(0)

C#7.3枚举约束:为什么我不能使用可空的枚举?

既然我们有枚举约束,为什么编译器不允许我编写这段代码?

public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
    where TResult : Enum
{
    return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
Run Code Online (Sandbox Code Playgroud)

编译器说:

错误CS0453类型'TResult'必须是非可空值类型才能在泛型类型或方法'Nullable'中将其用作参数'T'

c# enums roslyn c#-7.3

40
推荐指数
2
解决办法
3894
查看次数

为什么这些"特殊课程"到底是什么?

看完这个问题问完全是"特级"是的,我剩下什么问题,为什么六班System.Object,System.Array,System.Delegate,System.EnumSystem.ValueType被选择和硬编码的特殊班,防止它们被用来作为约束泛型类或方法.

很容易理解为什么System.Object在那里; 所有类都继承,System.Object因此不需要将其作为约束包含在内.我不清楚的是为什么其他人被选为这个特殊班级的一部分.

PS:特殊类在尝试将它们用作约束时引发编译错误CS0702.

c# generics generic-constraints

14
推荐指数
1
解决办法
333
查看次数

为什么System.Array不能成为类型约束?

我工作的一个小项目有一些不同类型的数组(例如double[],float[],int[].为了验证/测试/神智的目的,我打印出一些阵列控制台,因为我走.所以我有多种功能看起来如下所示(本例简化 - 假设我只处理单维数组):

void Print(float[] a) // prints an array of floats
{
    for (int i = 0; i < a.Length; i++)
    {
        Console.Write(a[i]);
    }
}

void Print(double[] a) // prints an array of doubles
{
    for (int i = 0; i < a.Length; i++)
    {
        Console.Write(a[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我以无限的智慧认为,通过简单地创建这些函数的通用版本,我可以减少一些代码重复.所以我尝试了这个:

void Print<T>(T t) where T : Array
{
    for (int i = 0; i < t.Length; i++)
    {
        Console.Write(t.GetValue(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

Intellisense没有抱怨,但编译器失败并出现一个非常有趣的错误:

Constraint cannot …

.net c# arrays compiler-errors generic-constraints

8
推荐指数
1
解决办法
4263
查看次数