当前位置:  开发笔记 > 编程语言 > 正文

类型'T'必须是非可空值类型,以便在泛型类型或方法'System.Nullable <T>'中将其用作参数'T'

如何解决《类型'T'必须是非可空值类型,以便在泛型类型或方法'System.Nullable<T>'中将其用作参数'T'》经验,为你挑选了2个好方法。



1> Matthew Wats..:

代码有几个问题.第一个是你的类型必须是可空的.您可以通过指定来表达where T: struct.您还需要指定,where TResult: struct因为您也将其用作可空类型.

一旦你修好了,where T: struct where TResult: struct你还需要改变返回值类型(这是错误的)和其他一些东西.

在解决了所有这些错误并简化之后,你最终得到了这样的结论:

static TResult? ApplyFunction(T? nullable, Func function)
                where T: struct 
                where TResult: struct
{
    if (nullable.HasValue)
        return function(nullable.Value);
    else
        return null;
}

请注意,您可以重写NullableT?这使得事情更易读.

你也可以把它写成一个语句,?:但我不认为它是可读的:

return nullable.HasValue ? (TResult?) function(nullable.Value) : null;

您可能希望将其放入扩展方法中:

public static class NullableExt
{
    public static TResult? ApplyFunction(this T? nullable, Func function)
        where T: struct
        where TResult: struct
    {
        if (nullable.HasValue)
            return function(nullable.Value);
        else
            return null;
    }
}

然后你可以写这样的代码:

int? x = 10;
double? x1 = x.ApplyFunction(i => Math.Sqrt(i));
Console.WriteLine(x1);

int? y = null;
double? y1 = y.ApplyFunction(i => Math.Sqrt(i));
Console.WriteLine(y1);


而不是写"新的TResult?()",写"null"不是更清楚吗?我想这就是"Nullable <>"的哲学.

2> T. Kiley..:

正如错误所示,编译器无法保证T不会是可空的.您需要向T添加约束:

static Nullable ApplyFunction(Nullable nullable, 
    Func function) : where T : struct 
                                 where TResult : struct

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有