小编Gre*_*reg的帖子

返回类型中引用类型的可为空性与重写的成员不匹配

我正在使用一个返回 JSON 的 API,其中它的值之一可以是 或false一个对象。为了解决这个问题,我创建了一个自定义JsonConverter<T>.

internal class JsonFalseOrObjectConverter<T> : JsonConverter<T> where T : class
{
    public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.False)
        {
            return null;
        }
        else
        {
            return JsonSerializer.Deserialize<T>(ref reader);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到以下编译器错误:

可能返回空引用。

我可以将返回类型设置为 aT?但随后我会收到错误:

返回类型中引用类型的可为空性与重写的成员不匹配。

我该如何解决这个问题?

c# .net-core c#-8.0 nullable-reference-types .net-core-3.0

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

在角度2项目中导入crypto-js(使用angular-cli创建)

我正在尝试在我的angular2项目中导入crypto-js.

我跟着几个SO问题和angular-cli指南,但最后我仍然有错误找不到模块'crypto-js'

我尝试了什么:

npm install crypto-js --save

typings install dt~crypto-js --global --save

然后我修改了文件angular-cli-build.js

var Angular2App = require('angular-cli/lib/broccoli/angular2-app');

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      'systemjs/dist/system-polyfills.js',
      'systemjs/dist/system.src.js',
      'zone.js/dist/**/*.+(js|js.map)',
      'es6-shim/es6-shim.js',
      'reflect-metadata/**/*.+(ts|js|js.map)',
      'rxjs/**/*.+(js|js.map)',
      '@angular/**/*.+(js|js.map)',
      'crypto-js/**/*.+(js|js.map)'
    ]
  });
};
Run Code Online (Sandbox Code Playgroud)

和文件src/system-config.ts

const map: any = {
    'crypto-js': 'vendor/crypto-js'
};

/** User packages configuration. */
const packages: any = {
    'crypto-js': {
        format: 'cjs'
    }
};
Run Code Online (Sandbox Code Playgroud)

使用后

import * as CryptoJS from 'crypto-js';

我还有错误.我错过了什么 ?

谢谢

cryptojs angular

8
推荐指数
2
解决办法
3万
查看次数

使用Angular2在一个简单的类构造函数中注入服务

我创建了一个这样的Message类

import { ReflectiveInjector } from '@angular/core';

import { ApiService } from '../api.service';

export class Message {
        timestamp: number;
        message: any;
        api: ApiService;

        constructor(message: any) {
                let injector = ReflectiveInjector.resolveAndCreate([ApiService]);
                this.api = injector.get(ApiService);
                this.timestamp = message.timestamp;
                this.message = message.message;
        }
}
Run Code Online (Sandbox Code Playgroud)

我不是直接在构造函数参数中注入ApiService,因为我试图避免这种情况: let nm = new Message(message, this.api)
我不希望服务在参数中.

所以我使用的是ReflectiveInjector,但这段代码甚至不起作用.我收到此错误:EXCEPTION:错误:未捕获(在承诺中):没有Http的提供者!(ApiService - > Http)即使我以这种方式包含HTTP_PROVIDERS

import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { HTTP_PROVIDERS } from '@angular/http';

import { AppComponent, environment …
Run Code Online (Sandbox Code Playgroud)

class typescript angular

5
推荐指数
1
解决办法
3590
查看次数

我的库是否应该同时实现 IDisposable 和 IAsyncDisposable?

已经有一个类似的问题,但我的问题是关于暴露给客户端的类。

public class MyClass : IAsyncDisposable {
  public ValueTask DisposeAsync() => DoAsyncStuff();
}
Run Code Online (Sandbox Code Playgroud)

此类的处置是异步的,并且 的实现IDisposable会阻塞线程。

public void Dispose() => DisposeAsync().GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

如果IDisposable在类上实现并且用户处于同步上下文中,因此他们使用以下using语句:using (var c = new MyClass()) {},这会阻塞用户后面的线程,我认为这非常糟糕。相反,我宁愿不实现IDisposable并强制用户使用这种显式形式:

MyClass c;
try { c = new MyClass(); }
finally { c.DisposeAsync().GetAwaiter().GetResult(); }
Run Code Online (Sandbox Code Playgroud)

这更冗长,但至少用户不会有太大的惊喜。

我没有包含我的库的代码示例,因为这是一个普遍的问题。那么,当该Dispose方法在Task背后同步等待时,您对此有何看法?您是否遇到过问题?

.net c# idisposable

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