小编feO*_*O2x的帖子

为什么我可以将0.0分配给枚举值,而不是1.0

出于好奇:为什么我可以将0.0分配给枚举类型的变量,而不是1.0?看看下面的代码:

public enum Foo
{
    Bar,
    Baz
}

class Program
{
    static void Main()
    {
        Foo value1 = 0.0;
        Foo value2 = 1.0;   // This line does not compile
        Foo value3 = 4.2;   // This line does not compile
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为数字类型和枚举值之间的转换只允许通过强制转换?那就是我可以编写Foo value2 = (Foo) 1.0;以便第2行Main可以编译.为什么0.0C#中的值有例外?

c#

87
推荐指数
3
解决办法
4356
查看次数

在xunit.net中有一个简单的方法来比较两个集合而不考虑项目的顺序吗?

在我的一个测试中,我想确保集合中有某些项目.因此,我想将此集合与预期集合的项目进行比较,而不是关于项目的顺序.目前,我的测试代码看起来有点像这样:

[Fact]
public void SomeTest()
{
    // Do something in Arrange and Act phase to obtain a collection
    List<int> actual = ...

    // Now the important stuff in the Assert phase
    var expected = new List<int> { 42, 87, 30 };
    Assert.Equal(expected.Count, actual.Count);
    foreach (var item in actual)
        Assert.True(expected.Contains(item));
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来实现这个在xunit.net?我无法使用,Assert.Equal因为此方法检查两个集合中的项目顺序是否相同.我看了一下,Assert.Collection但是没有删除Assert.Equal(expected.Count, actual.Count)上面代码中的语句.

感谢您提前的答案.

c# automated-tests xunit.net

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

为什么我不能在我的可移植类库中调用Delegate.CreateDelegate?

我有以下问题:我想Delegate.CreateDelegate从我的可移植类库中调用.NET 4.5,Windows Phone 8和Windows 8 Store Apps,但我的代码无法编译.编译器说它无法在Delegate类型上找到方法.

有趣的是,例如Microsoft的PRISM库可以从便携式类库中调用'Delegate.CreateDelegate'.它在DelegateReference课堂上这样做.PRISM便携式类库面向.NET 4.0,Windows 8商店应用程序,Windows Phone 8和Silverlight 5(因此是一个更具限制性的集合).

不编译的代码如下所示:

public class MyClass
{
    public void MyMethod<T>(EventHandler handler)
    {
        var @delegate = Delegate.CreateDelegate(typeof (OpenEventHandler<T>), null, handler.GetMethodInfo());
    }
}

public delegate void OpenEventHandler<in T>(T target, object sender, EventArgs arguments);
Run Code Online (Sandbox Code Playgroud)

可以在此处下载示例:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip

它包含我的库项目和PRISM PubSubEvents项目的非常剥离版本,该项目仅包含DelegateReference类及其接口.后者的完整源代码可以在这里找到:http://prismwindowsruntime.codeplex.com/SourceControl/latest

如何使用所有Delegate会员?预先感谢您的帮助!

在亨克霍尔特曼的答案之后编辑:

GetMethodInfo()是PCL子集支持的扩展方法.无论如何,这与我Delegate.CreateDelegate在PRISM的PCL项目中无法调用的问题无关.

不编译的代码图片

在Hans Passants评论之后编辑2:

我只是玩了一遍,发现当我激活Silverlight 5作为可移植库的目标时,Delegate.CreateDelegate确实可以访问(并且GetMethodInfo扩展方法不再是).是Delegate.CreateDelegate那么也许映射到另一个API为Windows 8商店和Phone应用内部?这是我能想到如何突然访问这种方法的唯一方法,因为我添加了Silverlight 5作为有效目标. …

c# portable-class-library

10
推荐指数
2
解决办法
3959
查看次数

有什么方法可以保留 C# XML 注释中的空白吗?

我目前正在记录我的 C# 代码,并发现包含一个直接显示应如何调用一段代码的代码块很有用。我使用<code>嵌入到摘要中的标签:

C# XML 注释摘要中嵌入的代码块

虽然这通常有效,但我想保留空白(换行符、缩进)。到目前为止我尝试了以下操作:

  • 我将该xml:space="preserve"属性应用于<code>标签,但这根本没有效果。
  • 我曾经<br />指示单独的新行(这在 VS 2019 中有效),但我无法插入空格或制表符。我尝试使用&#x20;(用于空格)和&#x9;(用于选项卡),但弹出窗口不会显示这些。
  • 我尝试使用一个CDATA部分,但之间的代码根本没有显示。

Br 标签有效,但解析器会忽略空格和制表符

有什么方法可以保留 C# XML 注释的代码标签中的空白吗?提前谢谢你的帮助。

c# comments xml-comments

10
推荐指数
1
解决办法
3340
查看次数

是否在C#中的堆中装箱了一个静态值类型字段?

出于好奇 - 请考虑以下示例:

public class A
{
    public static int Foo;
}

public class Program
{
    static void Main()
    {
        // The following variable will be allocated on the
        // stack and will directly hold 42 because it is a
        // value type.
        int foo = 42;

        // The following field resides on the (high frequency)
        // heap, but is it boxed because of being a value type?
        A.Foo = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:盒子的值是Foo盒装的,因为它驻留在堆上?或者它是否在一个特殊的容器对象/内存部分中封装它就像实例值类型字段是堆上对象的一部分一样?

我认为它没有盒装,但我不确定,我找不到任何文件. …

.net c#

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

在 .NET / .NET Core 中的异步 I/O 期间,线程池的完成端口线程如何表现?

.NET / .NET Core 线程池在内部使用两种不同类别的线程:工作线程和 I/O 完成端口 (IOCP) 线程。两者都只是通常的托管线程,但用于不同的目的。通过不同的 API(例如Task.StartThreadPool.QueueUserWorkItem),我可以在工作线程上启动受 CPU 限制的异步操作(不应阻塞,否则线程池可能会创建额外的工作线程)。

但是如何执行受 I/O 限制的异步操作呢?在这些情况下,IOCP 线程的行为究竟如何?具体来说,我有以下问题:

  • 如果我开始一个异步 I/O 操作(例如文件、管道或网络),我怀疑当前线程会分派异步请求。我也知道(通过“CLR via C#”一书)CLR 注册到一个 I/O 完成端口,该端口用于执行重叠异步 I/O。我怀疑这个 IOCP 是绑定到异步操作上的,以便稍后可以将异步操作结果排队到线程池中。因此,我的假设是否正确,即在启动异步请求时没有触及 IOCP 线程?
  • 我怀疑当异步 I/O 操作的结果通过 CLR 的 I/O 完成端口上报时,这就是 IOCP 线程出现的地方。结果被排队到线程池中,并使用一个 IOCP 线程来处理它。但是,当阅读MSDN 上的一些论坛主题时,我觉得 IOCP 线程实际上是用来分派请求然后阻塞直到结果回来。是这种情况吗?当 I/O 操作由对方系统处理时,IOCP 线程是否阻塞?
  • 怎么样async awaitSynchronizationContextIOCP 线程是否处理异步 I/O 响应,然后例如将 UI 线程上的延续排队(假设ConfigureAwait(false)未调用)?
  • Linux / MacOS X 上的 .NET Core 怎么样?没有 I/O 完成端口 - …

.net asynchronous iocp threadpool .net-core

7
推荐指数
1
解决办法
2469
查看次数

如何对计时器类(适配器模式)进行单元测试?

我目前正在抽象定时器的概念,以便我需要的定时器可以在测试中使用模拟定时器或在操作模式下使用不同的实现(例如线程池定时器,线程仿射定时器等).因此,我创建了这个界面:

public interface ITimer : IDisposable
{
    bool IsEnabled { get; }
    bool IsAutoResetting { get; set; }
    TimeSpan Interval { get; set; }

    void Start();
    void Stop();

    event EventHandler IntervalElapsed;
}
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个适应System.Threading.Timer类并实现该接口的包装器.我想用测试驱动开发来做.我的班级目前看起来有点像这样:

public sealed class ThreadPoolTimer : ITimer
{
    private readonly Timer _timer;

    public bool IsEnabled { get; private set; }

    public bool IsAutoResetting { get; set; }

    public TimeSpan Interval { get; set; }

    public ThreadPoolTimer()
    {
        Interval = this.GetDefaultInterval();
        _timer = new Timer(OnTimerCallback);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# tdd unit-testing real-time

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

为什么在 xunit.net 理论中不能将 List&lt;int&gt; 转换为 TCollection?

我正在尝试在 xunit.net 中编写一个通用理论,该理论通过MemberDataAttribute. 请看下面的代码:

[Theory]
[MemberData("TestData")]
public void AddRangeTest<T>(List<T> items)
{
    var sut = new MyCustomList<T>();

    sut.AddRange(items);

    Assert.Equal(items, sut);
}

public static readonly IEnumerable<object[]> TestData = new[]
    {
        new object[] { new List<int> { 1, 2, 3 } },
        new object[] { new List<string> { "Foo", "Bar" } }
    };
Run Code Online (Sandbox Code Playgroud)

当我尝试执行这个理论时,会抛出以下异常:“System.ArgumentException: Object of type 'List'1[System.String] / List'1[System.Int32]' cannot be convert to type 'List'[ System.Object]'。” (我缩短并合并了两个例外的文本)

我知道这可能与参数类型有关,因为它不是直接的泛型类型,而是使用嵌套泛型的类型。因此,我以以下方式转换了测试:

[Theory]
[MemberData("TestData")]
public void AddRangeTest2<T, TCollection>(TCollection items)
    where TCollection : …
Run Code Online (Sandbox Code Playgroud)

c# generics xunit xunit.net

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

为什么我的字符串引用成员变量在C++中设置为空字符串?

请考虑以下代码:

class Foo
{
private:
    const string& _bar;

public:
    Foo(const string& bar)
        : _bar(bar) { }

    const string& GetBar() { return _bar; }
};

int main()
{
    Foo foo1("Hey");
    cout << foo1.GetBar() << endl;

    string barString = "You";
    Foo foo2(barString);
    cout << foo2.GetBar() << endl;
}
Run Code Online (Sandbox Code Playgroud)

当我执行此代码时(在VS 2013中),foo1实例在其_bar成员变量中有一个空字符串,而foo2相应的成员变量保存对值"You"的引用.这是为什么?

更新:我当然在本例中使用std :: string类.

c++ string reference pass-by-reference

4
推荐指数
2
解决办法
1117
查看次数

为什么我不能在T4模板中的类成员中访问实用程序方法?

我正在尝试使用文本模板实用程序方法(如WriteLine,PushIndent,PopIndent)在T4模板中编写一个类.但是,如果我尝试在我的类中调用这些方法,我将收到编译器错误说明

编译变换:无法访问经由嵌套类型"Microsoft.VisualStudio.TextTemplatingBF13B4A5FBA992E5EF81A8A7A4EACCAC3F7698E169D0F7825ED4F22A28C7C52C2B766D83F4C5ACA13E0DE0B3152B6D966E34EB8C5FC677E145F55BE0485406EC.GeneratedTextTransformation.ClassGenerator"外类型"Microsoft.VisualStudio.TextTemplating.TextTransformation"的非静态成员

MCVE(最小完整可验证示例)如下所示:

<#+
public void FunctionSample()
{
    WriteLine("Hello"); // This works fine
}

public class SampleClass
{
    public static void StaticMethodSample()
    {
        WriteLine("Hello"); // This does not compile
    }

    public void InstanceMethodSample()
    {
        WriteLine("Hello"); // This does not compile either
    }
}
#>
Run Code Online (Sandbox Code Playgroud)

有没有办法在类范围内访问这些实用程序方法,还是我必须使用自由函数?

(我在Visual Studio 2015社区上运行)

.net c# t4

4
推荐指数
1
解决办法
867
查看次数