此程序生成编译器警告CS8620

不能使用类型为‘IEnumerable<(字符串s1,字符串s2)>’的参数 对于"IEumable<(字符串?s1,字符串?s2)"类型的参数‘e’,在 ‘Vid Program.F(IEumable<(字符串?s1,字符串?s2)>e)’ 引用类型的可为空性的差异.

但我并没有试图把可以为空的东西伪装成不能为空的东西,我正在做相反的事情!那应该是非常好的!

有没有什么方法可以告诉编译器,"看,我知道它不可能是空的,假装它可以是"?一个与容零运算符相反的运算符?一个不负责任的运营商?!

namespace MyNamespace;

public static class Program
{
    public static void Main(string[] args)
    {
        var L = new [] {new C("S1", "S2")};
        F(L);
    }

    public class C
    {
        public string S1 { get; }
        public string S2 { get; }

        public C(string s1, string s2)
        {
            S1 = s1;
            S2 = s2;
        }
    }

    public static void F(IEnumerable<C> e)
        => F(e.Select(c => (c.S1, c.S2)));

    public static void F(IEnumerable<(string? s1, string? s2)> e)
    {}
}

推荐答案

但我并没有试图把一个可以为零的东西,当作一个不能为零的东西,我正在做相反的事情!应该没问题!

如果不能通过IEumable修改原始集合,也没什么问题.但这是可能的.考虑一下这段代码,是的,它有点像黑客,这就是问题的关键:

public static void Main(string[] args)
{
    var L = new[] { ("S1", "S2") };
    F(L);
    Console.WriteLine(String.Join(", ", L));
}

public static void F(IEnumerable<(string? s1, string? s2)> e)
{
    if (e is (string? s1, string? s2)[] array)
        array[0].s1 = null;
}

L是常规字符串的元组数组(不是string?).Fis中的if的主体被执行,并且无论如何空值在该元组中结束.因此,关于对F的调用的编译器警告是正确的.

Csharp相关问答推荐

我可以 suppress 规则CS 9035一次吗?

C#使用属性和值将JSON转换为XML

Blazor:类型或命名空间名称Components在命名空间中不存在''

有没有办法把+02:00转换成TimeSpan?""

如何循环遍历XML文档 node 以使用XSLT存储值

无法解析数据库上下文的服务

具有单一导航属性的EF核心一对多关系

更新产品但丢失产品ASP.NET Core的形象

Azure Redis缓存与Entra ID身份验证

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

在swagger示例中添加默认数组列表

如何在用户在线时限制令牌生成?

有没有类似于扩展元素的合并元组的语法?

在try 使用访问服务器上的文件夹时,如何解决CORS错误.NET核心API

在被Interactive Server切换后,Blazor SSR页面无法正确加载JS

为什么此名称不再被识别?名称不存在于当前上下文中?

C#LINQ子字符串

Blazor:搜索框在第一次搜索时不搜索

C#中类库项目的源代码生成器

嵌套Blazor组件内的验证