【问题标题】:Passing nullable value to a method将可为空的值传递给方法
【发布时间】:2011-09-01 06:50:25
【问题描述】:

如何将可为空的值传递给方法

[Import("Default", typeof(ISomeInterface), AllowRecomposition = true, AllowDefault = true)]
public ISomeInterface x { get; set; }
// x is null till now 
void DoWork(ISomeInterface obj) //Not working
{
        if (obj == null)
        {
            //Download and Satisfy
            DeploymentCatalog DC = new DeploymentCatalog("TheXAPfile.xap");
            DC.DownloadCompleted += (s, e) =>
            {
                catalog.Catalogs.Add(f); //catalog is AggregateCatalog
                obj.Show();
            };
            DC.DownloadAsync();
        }
        else
        {
            obj.Show();
        }

}

谢谢

【问题讨论】:

  • 什么不起作用?你有实现ISomeInterface的值类型吗?
  • 显示发生实际错误的代码部分及其给出的消息(如果有),或者,在编译器错误时,发布编译器消息。
  • System.NullReferenceExcption: [Arg_NullRefrenceException]

标签: c# silverlight mef


【解决方案1】:

异常是使用obj 的某些方法或属性的结果,当它为空时。你必须自己检查它是否为空

void DoWork(ISomeInterface obj) //Not working
{
    if(obj == null)
    {
        return;
    }
    /* do something ... */}
}

【讨论】:

  • 这是正确的。这与可空类型无关,而是您自己检查对象是否为空。
【解决方案2】:

在这里,您假设 obj 在您开始异步下载时为空,并且在触发 DownloadCompleted 时它不再为空。有没有你没有展示的东西来保证你满足这个条件?在 DownloadAsync 之后你在做什么,你怎么能确定在下载完成之前这将被评估?

    if (obj == null) 
    {
        //// you enter here only if obj is null
        //Download and Satisfy
        DeploymentCatalog DC = new DeploymentCatalog("TheXAPfile.xap");
        DC.DownloadCompleted += (s, e) =>
        {
            catalog.Catalogs.Add(f); //catalog is AggregateCatalog
            //// here you are assuming that obj is not null anymore. Why???
            obj.Show();
        };
        DC.DownloadAsync();
    }

【讨论】:

  • +1:是的,当 obj 显然仍然为空时,它只是使用 obj.Show(); 导致了问题。 EBKAC!
  • 那是我添加的问题 if(ISomeInterface != null) ISomeInterface.Show();并且工作得很好谢谢:)
【解决方案3】:

这可以通过放置一个 ?在函数头中的对象类型之后。

void DoWork(ISomeInterface? obj)

【讨论】:

  • 除非 ISomeInterface 是一个可怕的命名值类型,否则这是不合法的,并且对引导是多余的(因为接口变量已经可以是 null。)
  • 其实接口是引用类型,不需要在末尾加上?来传递null..
猜你喜欢
  • 2021-05-16
  • 2011-12-07
  • 2018-08-22
  • 1970-01-01
  • 2017-03-11
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多