出于好奇:为什么我可以将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#中的值有例外?
在我的一个测试中,我想确保集合中有某些项目.因此,我想将此集合与预期集合的项目进行比较,而不是关于项目的顺序.目前,我的测试代码看起来有点像这样:
[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)上面代码中的语句.
感谢您提前的答案.
我有以下问题:我想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# 代码,并发现包含一个直接显示应如何调用一段代码的代码块很有用。我使用<code>嵌入到摘要中的标签:
虽然这通常有效,但我想保留空白(换行符、缩进)。到目前为止我尝试了以下操作:
xml:space="preserve"属性应用于<code>标签,但这根本没有效果。<br />指示单独的新行(这在 VS 2019 中有效),但我无法插入空格或制表符。我尝试使用 (用于空格)和	(用于选项卡),但弹出窗口不会显示这些。CDATA部分,但之间的代码根本没有显示。有什么方法可以保留 C# XML 注释的代码标签中的空白吗?提前谢谢你的帮助。
出于好奇 - 请考虑以下示例:
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 / .NET Core 线程池在内部使用两种不同类别的线程:工作线程和 I/O 完成端口 (IOCP) 线程。两者都只是通常的托管线程,但用于不同的目的。通过不同的 API(例如Task.Start或ThreadPool.QueueUserWorkItem),我可以在工作线程上启动受 CPU 限制的异步操作(不应阻塞,否则线程池可能会创建额外的工作线程)。
但是如何执行受 I/O 限制的异步操作呢?在这些情况下,IOCP 线程的行为究竟如何?具体来说,我有以下问题:
async await和SynchronizationContext?IOCP 线程是否处理异步 I/O 响应,然后例如将 UI 线程上的延续排队(假设ConfigureAwait(false)未调用)?我目前正在抽象定时器的概念,以便我需要的定时器可以在测试中使用模拟定时器或在操作模式下使用不同的实现(例如线程池定时器,线程仿射定时器等).因此,我创建了这个界面:
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) 我正在尝试在 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) 请考虑以下代码:
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类.
我正在尝试使用文本模板实用程序方法(如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社区上运行)
c# ×8
.net ×4
xunit.net ×2
.net-core ×1
asynchronous ×1
c++ ×1
comments ×1
generics ×1
iocp ×1
real-time ×1
reference ×1
string ×1
t4 ×1
tdd ×1
threadpool ×1
unit-testing ×1
xml-comments ×1
xunit ×1