Giter Club home page Giter Club logo

Comments (4)

abagonhishead avatar abagonhishead commented on August 17, 2024 1

I should also have pointed out that this throws the same exception:

var proxy = new Castle.DynamicProxy.ProxyGenerator().CreateInterfaceProxyWithoutTarget(typeof(ITestInterface1));

So I'm guessing this is a DynamicProxy issue -- either that or both Moq and I are calling the wrong method.

from core.

stakx avatar stakx commented on August 17, 2024 1

@abagonhishead, thanks for reporting, I'm going to take a look at it.

from core.

abagonhishead avatar abagonhishead commented on August 17, 2024

This also affects classes:
Example on dotnetfiddle

using System;
using Moq;

public class Program
{
	public static void Main()
	{
		var mock1 = new Mock<TestClass1>();
		var mock2 = new Mock<TestClass2>();

		// Throws
		var instance1 = mock1.Object;

		// Does not throw
		var instance2 = mock2.Object;
	}

	public class TestClass1
	{
		public virtual bool TestMethod<TEnum>(out TEnum? someValue)
			where TEnum : Enum
		{
			someValue = default(TEnum?);
			return false;
		}
	}

	public class TestClass2
	{
		public virtual bool TestMethod<TEnum>(out TEnum? someValue)
		{
			someValue = default(TEnum?);
			return false;
		}
	}
}

Stack trace:

Unhandled exception. System.ArgumentException: Cannot create an instance of TEnum because Type.ContainsGenericParameters is true.
   at System.RuntimeType.CreateInstanceCheckThis()
   at System.RuntimeType.ActivatorCache..ctor(RuntimeType rt)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.GetUnderlyingTypeOfEnum(Type enumType)
   at Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(ILGenerator gen, Type type)
   at Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference.LoadReference(ILGenerator gen)
   at Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression.Emit(ILGenerator gen)
   at Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewInstanceExpression.Emit(ILGenerator gen)
   at Castle.DynamicProxy.Generators.Emitters.SimpleAST.AssignStatement.Emit(ILGenerator gen)
   at Castle.DynamicProxy.Generators.Emitters.CodeBuilder.Generate(ILGenerator il)
   at Castle.DynamicProxy.Generators.Emitters.MethodEmitter.Generate()
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.EnsureBuildersAreInAValidState()
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType()
   at Castle.DynamicProxy.Generators.BaseClassProxyGenerator.GenerateType(String name, INamingScope namingScope)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.<>c__DisplayClass13_0.<GetProxyType>b__0(CacheKey cacheKey)
   at Castle.Core.Internal.SynchronizedDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Castle.DynamicProxy.Generators.BaseProxyGenerator.GetProxyType()
   at Castle.DynamicProxy.DefaultProxyBuilder.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options)
   at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors)
   at Moq.CastleProxyFactory.CreateProxy(Type mockType, IInterceptor interceptor, Type[] interfaces, Object[] arguments) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 110
   at Moq.Mock`1.InitializeInstance() in /_/src/Moq/Mock`1.cs:line 502
   at Moq.Mock`1.OnGetObject() in /_/src/Moq/Mock`1.cs:line 516
   at Moq.Mock.get_Object() in /_/src/Moq/Mock.cs:line 180
   at Moq.Mock`1.get_Object() in /_/src/Moq/Mock`1.cs:line 453
   at Program.Main()

from core.

stakx avatar stakx commented on August 17, 2024

This is apparently caused by type checks inside OpCodeUtil.EmitLoadIndirectOpCodeForType and OpCodeUtil.EmitStoreIndirectOpCodeForType running in the wrong order: there is a check for type.IsEnum which runs before type.IsGenericParameter. If we switch the ordering of those type checks, the reported problem disappears.

from core.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.