dotnet / dotnet/fsharp

Cannot supply `typeof<>` to attribute constructor

Open
#16,344 0 comments 0 reactions 0 assignees View on GitHub
Area-Compiler-Checking Area-Compiler-Checking-Attributes Bug Triage-Investigate
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 11h
Merged PRs (30d)
131

Description

**Repro steps**

Try building this
``` F#
namespace TypeOfInAttributeConstructorRepro

open System
open System.ComponentModel
open System.Reflection
open System.Text.Json
open System.Text.Json.Serialization

type EnumDescriptionConverter<'TEnum when 'TEnum: (new: unit -> 'TEnum) and 'TEnum: struct and 'TEnum :> ValueType>() =
inherit JsonConverter<'TEnum>()

override _.Read(reader, typeToConvert, options) =
let value = reader.GetString()
if String.IsNullOrEmpty value then
Unchecked.defaultof<'TEnum>
else
match Enum.TryParse<'TEnum>(value, true) with
| true, result -> result
| false, _ -> raise (JsonException($"Unable to convert '%s{value}' to Enum '%s{typeof<'TEnum>.Name}'."))

override _.Write(writer, value, options) =
let fi = value.GetType().GetField(value.ToString())
let description = fi.GetCustomAttribute(false)
writer.WriteStringValue(description.Description)

type [>)>] FileOpenPreference =
| [] Inline = 0
| [] Desktop = 1
| [] Web = 2
```

https://sharplab.io/#v2:DYLgZgzgNAJiDUAfAdgQwLYFMIAdUGNMACAFQE8dMB5MASWQEEAXJgJwEsAjAVycwGEA9sghtu+JoNYAlTDlaCAsACgVgysiIBlMqMzo1G7br7oAdEPQ5hmZEwCygmJmCHbxvedlhgmCe2E3TR1PMxJMAA8mMwApCEDldXcQ0zDI6LjhMy1MDlRgdgAvVCYA5BUVJgpiAFFkbnQAEWx8DhxS4SFkADdcvlYAHgByEjqGogB3AAt3EbH0ECIACmRMCcXuZHYmIgBaAD4iOfr0AEoiVGQYI9GTxdFWcR3L6+PxkEOANXzuTHJKfZLc4AXhURHBRHYyBmHB2mWQXV6rH6w1uDUBpwqyghREESI4ziIAH0zLJUDAlqxMOTclAiFVKCRBIi+nT1B0RCCwTiIb4dt0fsRgUQqTTWGYAOKYJhaNhQgDmQO5PMhYG0cuQ8rMtAgADluMBgFRWDUrFUiALgL96TNytiVTyAKrIfAzfAAa0wMDMzjAqANkjAqPm+2VPJcEEwYYdRHQJVdRHmYVYZAACqhWJHgydAZbfnSxJhzhNtlNow7EPTHpg6VSIAG9oc6wHyyrK37gJG6UTGyLUOxI8t4TUIoR2mUlgASABEztQnF89MERHwwiROyGAFIIABvPOYAC+QyXiZOR23O4ZmEEQbe6H2Zl1GEPQzM09OmNU9vBeNyBOIJIAOqwpgSwTCBrB0vubLjsIEBct+PJ8kQYDsEQwr7pK0r/KBpxYUwABi7AuBSmFMrKHCakCn4xshzgQK07CwZowqofh/DcKIgjoMwco8HwAzNAxbQcrxHD8ZggIdpGNEOuB2y5GYwEKRRCrfFaoH0YxzFmEJ2kcp+lTVEQADaAzwiyyK5GJXC8MQSxXjeAzzHpIllJZKJEb4VAaKmVJgLktiEPs+ynPsAC6RBedQvn+YFLpCmGlZma5TEckQ05QgUqzThFRD0NlQpEAADElpmCS0bnCBl9HupIOC5ZFQl1eo6FEAAjGVKWVWlZQZRMmCcI1RCAYNbUAEwqEAA=

**Expected behavior**

Builds

**Actual behavior**

Displays 2 weird errors
```
error FS0001: A generic construct requires that the type 'FileOpenPreference' have a public default constructor
error FS0267: This is not a valid constant expression or custom attribute value
```

**Known workarounds**

Derive from attribute

**Related information**

.NET 8

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.