小编Jef*_*ger的帖子

如何将所有 C# 8 可空引用警告视为错误?

将 Visual Studio 2019 v16.3.2 与 .NET Core 3.0 项目设置为 C# 8 并启用可为空引用类型。

<PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
</PropertyGroup>

Run Code Online (Sandbox Code Playgroud)

如果我将其设置为将所有警告视为错误:

警告作为错误单选按钮被选中

<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsAsErrors />
Run Code Online (Sandbox Code Playgroud)

它将其他警告报告为错误。例如,CS0168 The variable 'x' is declared but never used被报告为错误。但所有可为空的引用警告仍报告为警告。例如,CS8600 Converting null literal or possible null value to non-nullable type.仍然报告为警告。

如何将所有可为空的引用警告视为错误?

注意:即使将 CS8600 专门设置为错误处理,也不会导致其报告为错误。如果这样做有效,那么将它们全部视为错误仍然无济于事,因为有很多。

编辑:将特定警告设置为错误放入<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>csproj 并且不起作用。

c# c#-8.0 nullable-reference-types

34
推荐指数
3
解决办法
5581
查看次数

为整个项目/ dll设置ConfigureAwait(false)

根据MSDN杂志上的一篇文章,"尽可能使用"是最佳做法ConfigureAwait(false).此外,它指出,"如果你可以ConfigureAwait在一个方法中的某个时刻使用,那么我建议你在那个点之后的那个方法中使用它." 该文章的作者Stephen Cleary 在他的博客中指出"在你的'库'异步方法中,尽可能使用ConfigureAwait(false)[强调添加]."

鉴于我await在库项目中的大部分或全部语句应该被广泛使用,是否.ConfigureAwait(false)可以做某事/更改设置以使其在我的项目/ dll中等待的默认行为不能继续在捕获的上下文?也就是说,我可以省略所有调用.ConfigureAwait(false),而只在我需要保留上下文时添加..ConfigureAwait(true)

c# async-await

19
推荐指数
2
解决办法
2110
查看次数

如何在可能是NHibernate代理对象的对象上获取实体类型?

我有一个基类DomainObject用于我在NHibernate中使用的所有业务对象.它包含该Id属性.

public abstract class DomainObject
{
    public virtual int Id { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

我想写一个IEqualityComparer比较我的域对象.如果两个对象具有相同Id且对象类型相同,则它们应该相等.但是当我GetType()用来获取对象的类型时,它将返回NHibernate代理类型.所以这段代码:

bool IEqualityComparer.Equals(object x, object y)
{
    // null checking code skipped here
    if(x is DomainObject && y is DomainObject)
    {
            return ((DomainObject) x).Id == ((DomainObject) y).Id
                    && x.GetType() == y.GetType();
    }
    return x.Equals(y);
}
Run Code Online (Sandbox Code Playgroud)

不能正常工作,因为类型x is Asset而且类型y is AssetProxy21879bba3e9e47edbbdc2a546445c657.

那么,如何在可能是NHibernate代理对象的对象上获取实体类型?即在上面的例子Asset而不是AssetProxy21879bba3e9e47edbbdc2a546445c657

nhibernate

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

单个Jekyll网站中的多个博客

有没有办法让一个Jekyll网站拥有多个博客?我目前想在一个网站上有两个博客.

ruby jekyll

12
推荐指数
2
解决办法
5971
查看次数

库中的Task.Yield()需要ConfigureWait(false)

建议使用一个ConfigureAwait(false)当你可以随时,特别是在图书馆,因为它可以帮助避免死锁和提高性能.

我编写了一个大量使用异步的库(访问数据库的Web服务).图书馆的用户遇到了僵局,经过多次痛苦的调试和修补后,我将其追踪到了单独使用await Task.Yield().我使用过的其他任何地方.ConfigureAwait(false),但是不支持Task.Yield().

对于需要等效的情况,推荐的解决方案是Task.Yield().ConfigureAwait(false)什么?

我已经读过有关如何SwitchTo移除某个方法的内容.我可以看出为什么那可能是危险的,但为什么没有相应的Task.Yield().ConfigureAwait(false)

编辑:

为了提供我的问题的进一步背景,这里有一些代码.我正在实现一个开源库,用于访问支持异步的DynamoDB(作为AWS的服务的分布式数据库).IX-Async库IAsyncEnumerable<T>提供了许多操作返回.该库不提供从以"块"提供行的数据源生成异步枚举的好方法,即每个异步请求返回许多项.所以我有自己的通用类型.该库支持预读选项,允许用户指定在调用实际需要之前应该请求多少数据.MoveNext()

基本上,这是如何工作的,我通过调用GetMore()和传递这些块之间的状态来请求块.我将这些任务放入chunks队列并将它们出列并将它们转换为我放在单独队列中的实际结果.这个NextChunk()方法就是问题所在.根据值的不同,ReadAhead我会在完成最后一个(最多)之后保持获取下一个块,直到需要一个值但不可用(无)或仅获取超出当前使用值的下一个块(一些).因此,获取下一个块应该并行/不阻止获取下一个值.枚举器代码是:

private class ChunkedAsyncEnumerator<TState, TResult> : IAsyncEnumerator<TResult>
{
    private readonly ChunkedAsyncEnumerable<TState, TResult> enumerable;
    private readonly ConcurrentQueue<Task<TState>> chunks = new ConcurrentQueue<Task<TState>>();
    private readonly Queue<TResult> results = new Queue<TResult>();
    private CancellationTokenSource cts = new CancellationTokenSource();
    private TState lastState;
    private TResult current;
    private …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await

12
推荐指数
2
解决办法
1920
查看次数

如何使用Noda Time解析多种格式?

我喜欢Noda Time使用命名空间中的*Pattern各种类型处理格式化和解析值NodaTime.Text.但是,用户输入通常不像单个格式那样规则.例如,我们的应用程序使用时间格式,"h:mm tt"但我们希望能够以下列任何格式解析用户输入:

  • h:mm tt
  • h:mmtt (没有空间)
  • h:mm t
  • h:mmt (没有空间)
  • h tt
  • hh:mm
  • 等等...

有没有办法使用Noda Time来解析可能有多种格式的输入?

nodatime

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

在Ninject 2.0中,如何为特定案例同时具有通用绑定和绑定?

我有一种情况,我想依赖注入我的用户对象,但也将当前用户放在IoC容器中.我想要以下几行:

kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
Run Code Online (Sandbox Code Playgroud)

有人可能认为像这样的绑定会起作用:

Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)

当然,这给了:

Ninject.ActivationException: Error activating User
More than one matching bindings are available.
Activation path:
1) Request for User

Suggestions:
1) Ensure that you have defined a binding for User only once.

我理解错误,因为命名绑定不限制该绑定的应用程序,因此两个绑定都适用.很明显,我需要使用.When*()方法的上下文绑定,但我无法想出任何方法来做到这一点.我觉得应该有什么方法可以检测是否应用了命名实例.就像是:

// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)

我找不到IRequest界面上的任何地方或它的属性告诉我要求的名称.我该怎么做呢?

ninject ioc-container ninject-2

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

如何在DynamoDB中反向扫描索引?

我目前正在使用DynamoDB并且扫描时遇到问题.我可以使用ExclusiveStartKey以正向顺序获取分页结果.但是,无论我设置是ScanIndexForwardtrue还是false,我都会从扫描操作中按顺序获得结果.如何从ScanDynamoDB中以相反的顺序获得结果?

amazon-dynamodb aws-sdk

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

等待取消任务的简洁方法?

我发现自己经常编写这样的代码:

try
{
    cancellationTokenSource.Cancel();
    await task.ConfigureAwait(false); // this is the task that was cancelled
}
catch(OperationCanceledException)
{
    // Cancellation expected and requested
}
Run Code Online (Sandbox Code Playgroud)

鉴于我请求取消,这是预料之中的,而且我真的希望忽略该异常。这似乎是一个常见的案例。

有没有更简洁的方法来做到这一点?我是否错过了有关取消的信息?看来应该有什么task.CancellationExpected()方法什么的。

c# task cancellation async-await cancellation-token

6
推荐指数
2
解决办法
2361
查看次数

如何在Sql Server 2008/2012中为时间创建NHibnerate IUserType?

我正在尝试IUserType为Noda Time LocalTime类型创建一个NHibernate ,它将逻辑映射到timeSql Server 2008/2012中的类型.我能够从数据库中获取值和加载值.但是,我不能编写涉及本地时间比较的查询,例如_session.Query<SchedulingTemplate>().Where(x => x.Start < end && x.End >= start)给出错误SqlException (0x80131904): The data types time and datetime are incompatible in the less than operator.

我的用户类型的相关代码是:

public Type ReturnedType
{
    get { return typeof(LocalTime); }
}

public override object NullSafeGet(IDataReader rs, string[] names, object owner)
{
    var dbValue = NHibernateUtil.Time.NullSafeGet(rs, names);
    if(dbValue == null)
        return null;

    return LocalDateTime.FromDateTime((DateTime)dbValue).TimeOfDay;
}

public override void NullSafeSet(IDbCommand cmd, object value, int index)
{ …
Run Code Online (Sandbox Code Playgroud)

nhibernate nodatime

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