C# 最小起订量';重写方法的安全可访问性必须与被重写方法的安全可访问性匹配';在dotnetfiddle中

C# 最小起订量';重写方法的安全可访问性必须与被重写方法的安全可访问性匹配';在dotnetfiddle中,c#,moq,dotnetfiddle,C#,Moq,Dotnetfiddle,我试图使用Moq在dotnetfiddle中编写一个简单的单元测试,但出于某种原因,运行时抱怨安全可访问性: 运行时异常(第20行):的类型初始值设定项 “Moq.ProxyFactory”引发了异常 堆栈跟踪: [System.TypeLoadException:继承时违反了安全规则 压倒一切的成员: 'Castle.DynamicProxy.ProxyGenerationOptions.GetObjectData(System.Runtime.Serialization.Serializat

我试图使用Moq在dotnetfiddle中编写一个简单的单元测试,但出于某种原因,运行时抱怨安全可访问性:

运行时异常(第20行):的类型初始值设定项 “Moq.ProxyFactory”引发了异常

堆栈跟踪:

[System.TypeLoadException:继承时违反了安全规则 压倒一切的成员: 'Castle.DynamicProxy.ProxyGenerationOptions.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext.Security 重写方法的可访问性必须与安全性匹配 正在重写的方法的可访问性。] Moq.ProxyFactory..cctor()处的Moq.CastleProxyFactory..ctor()

[System.TypeInitializationException:的类型初始值设定项 “Moq.ProxyFactory”在 Moq.ProxyFactory.get_Instance()位于 Moq.Guard.IsVisibleTroxyFactory(MethodInfo方法)位于 Moq.InvocationShape..ctor(LambdaExpression表达式,MethodInfo 方法,在Moq.ExpressionExtensions.g|u Split | 50(表达式e、表达式&r、调用形状&p、布尔赋值、布尔allowNonOverridableLastProperty)在Moq.ExpressionExtensions.Split(LambdaExpression表达式,Boolean allowNonOverridableLastProperty)在Moq.Mock.Setup(Mock Mock,LambdaExpression表达式,Condition Condition)在Moq.Mock1.Setup[TResult](表达式'1 expression)在 Unittests.Run():程序的第20行。Main():第10行

我搜索了一些其他的dotnetfiddle,它们的功能几乎相同(如),但没有抛出错误。这似乎是特定于dotnetfiddle的,因为在Visual Studio中这是有效的。我需要设置一些特定的.NET安全标志吗

using System;
using Moq;
using AssertLibrary;

public class Program
{
    public static void Main()
    {
        var unittest =  new Unittests();
        unittest.Run();
    }
}

public class Unittests
{   
    public void Run()
    {
        // Arrange
        var cacheMock = new Mock<ICache>();
        cacheMock
            .Setup(c => c.GetOrSet<MyModel>(It.IsAny<string>(), It.IsAny<Func<MyModel>>()))
            .Returns((string key, Func<MyModel> captured) => { return captured(); });
        
        var stuffs = new Stuffs(cacheMock.Object);
        
        // Act
        var result = stuffs.GetModel();
        
        // Assert
        Assert.Equals(5, result.MyProperty);
    }
}

public class MyModel
{
    public int MyProperty { get; set; }
}

public class Stuffs
{
    private ICache _cache;
    
    public Stuffs(ICache cache)
    {
        _cache = cache;
    }
    
    public MyModel GetModel()
    {
        var model = _cache.GetOrSet("cache-key", () => 
                                    {
                                        return new MyModel
                                        {
                                            MyProperty = 5
                                        };
                                    });
        return model;
    }
}

public interface ICache
{
    T GetOrSet<T>(string key, Func<T> setter);
}

public class Cache : ICache
{
    public T GetOrSet<T>(string key, Func<T> setter)
    {
        // do stuff
        
        return setter();
    }
}
使用系统;
使用最小起订量;
使用AssertLibrary;
公共课程
{
公共静态void Main()
{
var unittest=新的Unittests();
unittest.Run();
}
}
公共类单元测试
{   
公开募捐
{
//安排
var cacheMock=new Mock();
cacheMock
.Setup(c=>c.GetOrSet(It.IsAny(),It.IsAny())
.Returns((字符串键,Func captured)=>{return captured();});
var stuffs=新填充(cacheMock.Object);
//表演
var result=stuffs.GetModel();
//断言
Assert.Equals(5,result.MyProperty);
}
}
公共类MyModel
{
公共int MyProperty{get;set;}
}
公共类物品
{
专用ICache\u缓存;
公共物品(ICache缓存)
{
_缓存=缓存;
}
公共MyModel GetModel()
{
var model=\u cache.GetOrSet(“缓存键”,()=>
{
返回新的MyModel
{
MyProperty=5
};
});
收益模型;
}
}
公共接口ICache
{
T GetOrSet(字符串键、函数设置器);
}
公共类缓存:ICache
{
公共T GetOrSet(字符串键、函数设置器)
{
//做事
返回设置器();
}
}

请参见

对于这样的事情,我会远离dotnetfiddle。为什么不尝试使用像LinqPad这样的工具呢?这是一个很好的快速演示程序(尽管要使用Nuget软件包,您需要购买它)“远离dotnetfiddle做这样的事情”的原因是什么?有很多已知的问题吗?它会做一些奇怪的把戏吗?这些工具往往存在于沙盒中,以阻止用户访问系统和做奇怪的事情。我怀疑你在这里看到的错误与此有关。